问题重新:我的C ++由gcc生成的程序集

编译这个代码:

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;”这么大的代码?

PS我读了大量的assemblynetworking书籍,很多(至less30)的教程,我所能做的就是复制代码并粘贴或重写它。 现在我正在尝试一种不同的方法来尝试以某种方式学习它。 问题是我明白什么是movl,pop等,但不明白如何结合这些东西来使代码“stream”。 我不知道在哪里或如何正确开始编写程序在asm中。 我仍然是静态的,不像C ++那样dynamic,但是我想学习汇编。

Solutions Collecting From Web of "问题重新:我的C ++由gcc生成的程序集"

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

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

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

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

 xorl %eax,%eax ret 

第一个eax设置为0(只需要两个字节来编码,而movl 0,%eax需要5个字节),第二个是ret指令。 帧指针操作在那里,以方便调试(没有它可能会回溯,但它更困难)。

.file.text等是汇编指令。

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

至于大小,实际上只有一些实际的指令 – 上面的大部分列表都是由指令等组成的。为了将来的参考,您可能还想调出优化级别来删除其他的reduxant指令,即gcc -Wall -O3 -S ...

这只是简单的程序背后有很多事情。

如果你打算读取汇编输出,绝不会编译C ++。 使用普通的C,出于多种原因,输出更清晰。