我是匯編世界的新手,我研究用 C 轉換代碼以更好地理解邏輯。我使用 objconv 進行轉換,我使用 Windows。我轉換了以下 C 代碼:
#include <stdio.h>
int main()
{
int vector[5] = {2, 6, 8, 9, 4};
int aux = 0;
for(int i = 0; i < 5; i )
{
aux = aux vector[i];
}
printf("The summation of array is: %d", aux);
}
生成的匯編代碼是:
global _main:
extern _printf
extern ___main
SECTION .text
.text: ; Local function
_main:
push ebp
mov ebp, esp
and esp, 0FFFFFFF0H
sub esp, 48
call ___main
mov dword [esp 14H], 2
mov dword [esp 18H], 6
mov dword [esp 1CH], 8
mov dword [esp 20H], 9
mov dword [esp 24H], 4
mov dword [esp 2CH], 0
mov dword [esp 28H], 0
jmp ?_002
?_001: mov eax, dword [esp 28H]
mov eax, dword [esp eax*4 14H]
add dword [esp 2CH], eax
add dword [esp 28H], 1
?_002: cmp dword [esp 28H], 4
jle ?_001
mov eax, dword [esp 2CH]
mov dword [esp 4H], eax
mov dword [esp], ?_003
call _printf
mov eax, 0
leave
ret
nop
SECTION .data
SECTION .bss
SECTION .rdata
?_003: ; byte
db 54H, 68H, 65H, 20H, 73H, 75H, 6DH, 6DH ; 0000 _ The summ
db 61H, 74H, 69H, 6FH, 6EH, 20H, 6FH, 66H ; 0008 _ ation of
db 20H, 61H, 72H, 72H, 61H, 79H, 20H, 69H ; 0010 _ array i
db 73H, 3AH, 20H, 25H, 64H, 00H, 00H, 00H ; 0018 _ s: %d...
如您所見,C 的 printf 代表標簽 ?_003 處的程式集。所有這些資料到底是什么?是否可以簡化此輸出?
uj5u.com熱心網友回復:
標簽處的十六進制塊?_003只是C字串的表示
"陣列的總和是:%d"
您可以在注釋 char 之后在右側看到 ASCII 翻譯;:數字是相對地址,下劃線是分隔符,字符是字串的一部分。
db 54H, 68H, 65H, 20H, 73H, 75H, 6DH, 6DH ; 0000 _ The summ
db 61H, 74H, 69H, 6FH, 6EH, 20H, 6FH, 66H ; 0008 _ ation of
db 20H, 61H, 72H, 72H, 61H, 79H, 20H, 69H ; 0010 _ array i
db 73H, 3AH, 20H, 25H, 64H, 00H, 00H, 00H ; 0018 _ s: %d...
不是自動創建的(NASM)程式集中的等效項(如 objconv)將是
outStr: db "The summation of array is: %d",0
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495922.html
下一篇:NASM中STOSB的分段錯誤
