无论我是使用printf还是put,它为什么在我反汇编时显示放置?

时间:2016-12-28 23:12:07

标签: c assembly printf compiler-optimization puts

我对编程很陌生,想问为什么我用不同的代码得到相同的结果。我实际上正在读一本书,书中的例子是printf(也在Assembler中)。在这种情况下,它说<printf@plt>。书中的汇编代码与我的不同,但C代码是相同的。我的处理器只是计算不同吗?

(问题在于电话<+34> <puts@plt>

代码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 <puts@plt>
   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 <puts@plt>
   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.

1 个答案:

答案 0 :(得分:2)

首选puts函数,因为它在两种功能(无格式字符串解码)和参数传递方面都更简单。

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