Gdb:gcc -O0 assmbly例子

时间:2017-03-28 16:10:31

标签: gcc assembly gdb

希望不是一个愚蠢的问题。

编译时未指定优化:gcc test.c -o test(似乎选择-O0)。

gcc -O2或-O3输出比-O0更清洁(至少在我看来)汇编代码。

-O0的原因是什么,它对我们有什么帮助,我看不出它比-O1或-O2更简单。

...
int sum(int x, int y)
{
    int sum = x + y;
    return sum;
}
...

0x00000000004004ed <+0>:     push   %rbp
0x00000000004004ee <+1>:     mov    %rsp,%rbp
0x00000000004004f1 <+4>:      mov    %edi,-0x14(%rbp)
0x00000000004004f4 <+7>:      mov    %esi,-0x18(%rbp)
0x00000000004004f7 <+10>:    mov    -0x18(%rbp),%eax
0x00000000004004fa <+13>:    mov    -0x14(%rbp),%edx
0x00000000004004fd <+16>:    add    %edx,%eax
0x00000000004004ff <+18>:     mov    %eax,-0x4(%rbp)
0x0000000000400502 <+21>:   mov    -0x4(%rbp),%eax
0x0000000000400505 <+24>:   pop    %rbp
0x0000000000400506 <+25>:   retq   

1 个答案:

答案 0 :(得分:3)

关闭优化后,源代码和机器代码之间会有1:1的表示,从而可以更轻松地进行调试。启用优化后,编译器可以执行一些奇怪的操作,例如重新排列代码或删除使调试代码更加困难的变量。

使用-O0进行编译通常也会更快,因为优化器通常是每个现代编译器中最慢的组件。