我正在閱讀關於彙編代碼的一章,它有一個示例。這裏是C程序:舊的和新的GCC生成的彙編代碼的循環差異
int main()
{
int i;
for(i=0; i < 10; i++)
{
puts("Hello, world!\n");
}
return 0;
}
下面是書中提供的彙編代碼:
0x08048384 <main+0>: push ebp
0x08048385 <main+1>: mov ebp,esp
0x08048387 <main+3>: sub esp,0x8
0x0804838a <main+6>: and esp,0xfffffff0
0x0804838d <main+9>: mov eax,0x0
0x08048392 <main+14>: sub esp,eax
0x08048394 <main+16>: mov DWORD PTR [ebp-4],0x0
0x0804839b <main+23>: cmp DWORD PTR [ebp-4],0x9
0x0804839f <main+27>: jle 0x80483a3 <main+31>
0x080483a1 <main+29>: jmp 0x80483b6 <main+50>
0x080483a3 <main+31>: mov DWORD PTR [esp],0x80484d4
0x080483aa <main+38>: call 0x80482a8 <_init+56>
0x080483af <main+43>: lea eax,[ebp-4]
0x080483b2 <main+46>: inc DWORD PTR [eax]
0x080483b4 <main+48>: jmp 0x804839b <main+23>
這裏是我的版本的一部分:
0x0000000000400538 <+8>: mov DWORD PTR [rbp-0x4],0x0
=> 0x000000000040053f <+15>: jmp 0x40054f <main+31>
0x0000000000400541 <+17>: mov edi,0x4005f0
0x0000000000400546 <+22>: call 0x400410 <[email protected]>
0x000000000040054b <+27>: add DWORD PTR [rbp-0x4],0x1
0x000000000040054f <+31>: cmp DWORD PTR [rbp-0x4],0x9
0x0000000000400553 <+35>: jle 0x400541 <main+17>
我的問題是,爲什麼在書的版本的情況下,它將0賦值給變量(mov DWORD PTR [ebp-4],0x0
),然後在cmp
之後進行比較,但在我的版本中,它將其賦值,然後它賦值jmp 0x40054f <main+31>
哪裏的cmp
是?
分配和比較沒有任何jump
似乎更合乎邏輯,因爲它就像內部for循環。
哪裏調用'你在書中提供的代碼puts'? –
「我的版本」究竟是什麼?你寫了嗎?無法真正告訴你爲什麼你這樣寫的;) –
@John Wu:「他的版本」可能是他的編譯器的輸出。 –