【问题标题】:Questions re: assembly generated from my C++ by gcc问题回复:gcc 从我的 C++ 生成的程序集
【发布时间】:2011-03-02 14:17:29
【问题描述】:

编译这段代码:

int main ()
{
    return 0;
}

使用:

gcc -S filename.cpp

...生成这个程序集:

        .file   "heloworld.cpp"
    .text
.globl main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    .cfi_personality 0x0,__gxx_personality_v0
    pushl   %ebp
    .cfi_def_cfa_offset 8
    movl    %esp, %ebp
    .cfi_offset 5, -8
    .cfi_def_cfa_register 5
    movl    $0, %eax
    popl    %ebp
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
    .section    .note.GNU-stack,"",@progbits

我的问题:

  1. 是“.”之后的所有内容评论?
  2. 什么是.LFB0:?
  3. 什么是.LFE0:?
  4. 为什么只有“int main()”和“return 0;”的代码这么大?

附:我读了很多汇编网络书籍,很多(至少 30 篇)教程,我所能做的就是复制代码并粘贴或重写它。现在我正在尝试一种不同的方法来尝试以某种方式学习它。问题是我确实了解什么是 movl、pop 等,但不了解如何将这些东西结合起来使代码“流动”。我不知道在哪里或如何正确开始用 asm 编写程序。我仍然是静态的,不像 C++ 那样动态,但我想学习汇编。

【问题讨论】:

标签: c++ linux assembly x86


【解决方案1】:

正如其他人所说,.file.text、... 是汇编程序指令,.LFB0.LFE0 是本地标签。生成的代码中唯一的指令是:

pushl   %ebp
movl    %esp, %ebp
movl    $0, %eax
popl    %ebp
ret

前两条指令是函数序言。帧指针存储在堆栈中并更新。下一个指令将 0 存储在 eax 寄存器中(i386 ABI 声明整数返回值通过 eax 寄存器返回)。最后两个指令是函数尾声。帧指针被恢复,然后函数通过ret指令返回给它的调用者。

如果你用-O3 -fomit-frame-pointer编译你的代码,代码将被编译成两条指令:

xorl    %eax,%eax
ret

第一个设置eax为0(编码只需要两个字节,而movl 0,%eax需要5个字节),第二个是ret指令。帧指针操作是为了简化调试(没有它也可以进行回溯,但更困难)。

【讨论】:

  • gcc -O3 -fomit-frame-pointer heloworld.cpp /tmp/ccVdrv9G.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status
  • 你应该使用g++来编译.cpp文件。我认为这不是您的问题,但通常这是一个好主意。我在尝试用gcc -O3 -fomit-frame-pointer heloworld.cpp 编译heloworld.cpp 时没有问题...
【解决方案2】:

.file.text 等是汇编指令。

.LFB0.LFE0 是本地标签,通常用作函数中的分支目标。

至于大小,实际上只有几条实际指令 - 上面的大部分清单都包含指令等。为了将来参考,您可能还想提高优化级别以删除其他冗余指令,即@987654325 @。

【讨论】:

    【解决方案3】:

    只是你的简单程序背后有很多事情发生。

    如果您打算阅读汇编程序的输出,请不要编译 C++。使用纯 C,由于多种原因,输出更清晰。

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多