2016-12-28 42 views
2

我对编程相当陌生,想问问为什么我用不同的代码得到相同的结果。我实际上正在读一本书,书中的例子是用printf(也在汇编程序中)。在这种情况下,它说<[email protected]>。本书中的汇编代码与我的不同,但C代码是相同的。我的处理器只是计算不同吗?无论我是否使用printf或puts,它为什么在反汇编时显示放入?

(问题是在呼叫<+34><[email protected]>

代码1:

#include <stdio.h> 

int main() 
{ 
    int i; 
    for(i=0; i<10; i++) 
    { 
     printf("Hello, world!\n"); 
    } 
    return 0; 
} 

代码2:

#include <stdio.h> 

int main() 
{ 
    int i; 
    for(i=0; i<10; i++) 
    { 
     puts("Hello, world!\n"); 
    } 
    return 0; 
} 

代码1拆卸:

Dump of assembler code for function main: 
    0x080483eb <+0>: lea ecx,[esp+0x4] 
    0x080483ef <+4>: and esp,0xfffffff0 
    0x080483f2 <+7>: push DWORD PTR [ecx-0x4] 
    0x080483f5 <+10>: push ebp 
    0x080483f6 <+11>: mov ebp,esp 
    0x080483f8 <+13>: push ecx 
=> 0x080483f9 <+14>: sub esp,0x14 
    0x080483fc <+17>: mov DWORD PTR [ebp-0xc],0x0 
    0x08048403 <+24>: jmp 0x8048419 <main+46> 
    0x08048405 <+26>: sub esp,0xc 
    0x08048408 <+29>: push 0x80484b0 
    0x0804840d <+34>: call 0x80482c0 <[email protected]> 
    0x08048412 <+39>: add esp,0x10 
    0x08048415 <+42>: add DWORD PTR [ebp-0xc],0x1 
    0x08048419 <+46>: cmp DWORD PTR [ebp-0xc],0x9 
    0x0804841d <+50>: jle 0x8048405 <main+26> 
    0x0804841f <+52>: mov eax,0x0 
    0x08048424 <+57>: mov ecx,DWORD PTR [ebp-0x4] 
    0x08048427 <+60>: leave 
    0x08048428 <+61>: lea esp,[ecx-0x4] 
    0x0804842b <+64>: ret  
End of assembler dump. 

代码2拆卸:

Dump of assembler code for function main: 
    0x080483eb <+0>: lea ecx,[esp+0x4] 
    0x080483ef <+4>: and esp,0xfffffff0 
    0x080483f2 <+7>: push DWORD PTR [ecx-0x4] 
    0x080483f5 <+10>: push ebp 
    0x080483f6 <+11>: mov ebp,esp 
    0x080483f8 <+13>: push ecx 
    0x080483f9 <+14>: sub esp,0x14 
    0x080483fc <+17>: mov DWORD PTR [ebp-0xc],0x0 
    0x08048403 <+24>: jmp 0x8048419 <main+46> 
=> 0x08048405 <+26>: sub esp,0xc 
    0x08048408 <+29>: push 0x80484b0 
    0x0804840d <+34>: call 0x80482c0 <[email protected]> 
    0x08048412 <+39>: add esp,0x10 
    0x08048415 <+42>: add DWORD PTR [ebp-0xc],0x1 
    0x08048419 <+46>: cmp DWORD PTR [ebp-0xc],0x9 
    0x0804841d <+50>: jle 0x8048405 <main+26> 
    0x0804841f <+52>: mov eax,0x0 
    0x08048424 <+57>: mov ecx,DWORD PTR [ebp-0x4] 
    0x08048427 <+60>: leave 
    0x08048428 <+61>: lea esp,[ecx-0x4] 
    0x0804842b <+64>: ret  
End of assembler dump. 
+4

GNU'gcc'认为用'puts(“some string”)替换'printf(“一些字符串\ n”)''是一个好主意;' - 这样做。这是一个优化; 'puts()'不必解释格式字符串。 –

+1

相关:[可以将printf替换为自动放入C程序?](https://stackoverflow.com/questions/25816659/can-printf-get-replaced-by-puts-automatically-in-ac-program) –

+0

好的谢谢你的帮助! :) –

回答

2

puts功能是优选的,因为它是简单的在这两个功能(无格式字符串解码)和参数传递。

例如,System V ABI x86调用约定需要在RAX中设置XMM(YMM)参数的数量(printf是可变参数)。 puts更容易,因为只有通过RDI传递的单个参数。

+0

上面的评论帮助了我 –

相关问题