编译这段代码:
int main ()
{
return 0;
}
using:
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
我的问题:
- 是“.”之后的所有内容一条评论?
- .LFB0:是什么?
- .LFE0:是什么?
- 为什么这么大的代码只有“int main()”和“return 0;”?
附:我读了很多汇编上网书,很多(至少 30 个)教程,我所能做的就是复制代码并粘贴或重写。现在我正在尝试一种不同的方法来尝试以某种方式学习它。问题是我确实理解什么是 movl、pop 等,但不明白如何组合这些东西以使代码“流动”。我不知道在哪里或如何正确开始用 asm 编写程序。我仍然是静态的,而不是像 C++ 那样动态的,但我想学习汇编。
正如其他人所说,.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
操作说明。帧指针操作是为了简化调试(没有它也可以得到回溯,但更困难)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)