我正在理解汇编和c编程的基础知识.
我用C编译了以下简单程序,
#include <stdio.h>
int main()
{
int a;
int b;
a = 10;
b = 88
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用以下命令编译,
gcc -ggdb -fno-stack-protector test.c -o test
上面程序与gcc版本4.4.7的反汇编代码是:
5 push %ebp
89 e5 mov %esp,%ebp
83 ec 10 sub $0x10,%esp
c7 45 f8 0a 00 00 00 movl $0xa,-0x8(%ebp)
c7 45 fc 58 00 00 00 movl $0x58,-0x4(%ebp)
b8 00 00 00 00 mov $0x0,%eax
c9 leave
c3 ret
90 nop
Run Code Online (Sandbox Code Playgroud)
但是,与gcc版本4.3.3相同程序的反汇编代码是:
8d 4c 23 04 lea 0x4(%esp), %ecx
83 e4 f0 and $0xfffffff0, %esp
55 push -0x4(%ecx)
89 e5 mov %esp,%ebp
51 push %ecx
83 ec 10 sub $0x10,%esp
c7 45 f4 0a 00 00 00 00 movl $0xa, -0xc(%ebp)
c7 45 f8 58 00 00 00 00 movl $0x58, -0x8(%ebp)
b8 00 00 00 00 mov $0x0, %eax
83 c4 10 add $0x10,%esp
59 pop %ecx
5d pop %ebp
8d 61 fc lea -0x4(%ecx),%esp
c3 ret
Run Code Online (Sandbox Code Playgroud)
为什么汇编代码有差异?
正如您在第二个汇编代码中看到的那样,为什么要在堆栈上推送%ecx?
有什么意义and $0xfffffff0, %esp?
注意:操作系统是一样的
编译器不需要为相同的源代码生成相同的汇编代码.只要可观察行为相同,C标准允许编译器根据需要优化代码.因此,不同的编译器可能会生成不同的汇编代码.
为了您的代码,GCC 6.2与-O3只产生:
xor eax, eax
ret
Run Code Online (Sandbox Code Playgroud)
因为你的代码基本上什么都不做 所以,它简化为一个简单的return语句.
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |