为什么汇编代码对于具有不同gcc版本的简单C程序是不同的?

Pro*_*unt 1 c assembly gcc

我正在理解汇编和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

注意:操作系统是一样的

usr*_*usr 6

编译器不需要为相同的源代码生成相同的汇编代码.只要可观察行为相同,C标准允许编译器根据需要优化代码.因此,不同的编译器可能会生成不同的汇编代码.

为了您的代码,GCC 6.2-O3只产生:

xor     eax, eax
ret
Run Code Online (Sandbox Code Playgroud)

因为你的代码基本上什么都不做 所以,它简化为一个简单的return语句.

  • @jforberg"我认为问题是为什么编译器会生成这样的代码" - 我的回答是*因为它可以/被允许*.我怀疑OP知道你声称OP知道什么,因为如果OP已经知道了这个问题,那么这个问题就没有了. (4认同)