gpt4 book ai didi

c++ - 关于 : assembly generated from my C++ by gcc 的问题

转载 作者:IT王子 更新时间:2023-10-29 00:52:29 28 4
gpt4 key购买 nike

编译这段代码:

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++ 中那样是动态的,但我想学习汇编。

最佳答案

正如其他人所说,.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 指令。帧指针操作可以简化调试(没有它也可以获得回溯,但更困难)。

关于c++ - 关于 : assembly generated from my C++ by gcc 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5168680/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com