关于gcc生成的汇编代码的一些疑问 ...

发布于 2022-09-03 07:54:41 字数 1054 浏览 56 评论 0

最近也算看玩了CSAPP的第三章讲汇编语言的部分, 但是自己实际分析代码的时候碰到了许多问题. 如下图所示, 图的左上和右上分别对应的是main.s和main.c的代码, 左下和右下则是swap.sswap.c的代码.

图片描述

我使用的编译指令是 :

gcc -m32 -S main.c -o main.s
gcc -m32 -S swap.c -o swap.s

我的问题 :

  1. main.s(左上)中, .data段不应该用来放数据的吗? 那么全局变量buf 为什么不在.data段后面 ?

  2. .comm 这一行是什么意思 ?

  3. 函数swap()不是没有在main.c中定义吗, 那么这里(main.s中)根本就没有反映出swap()没有定义, 那汇编器是如何知道swap()没有定义的呢?

  4. 我在swap.c中定义的了两个bufp0, 可以看到那个local的bufp0被改成了bufp0.1483(左下的第23行), 我记得直接被定义为0的值是要被放在.bss里面的, 但是这里根本看不到.bss这又是为什么呢?

  5. 生成的代码中有很多黄色的代码, 像LFB0, .cfi_startproc 等等, 这些在书中也根本没提到, 这些又是干什么的呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

迷荒 2022-09-10 07:54:41

对汇编没有了解很多。。
不过gcc默认生成的是AT&T格式的汇编代码,有些东西需要系统的学习或者有个浅显的认识才会了解你上面所说的这些东西吧,你或许需要讲解汇编更专业一点的书籍。。
不过我可以回答你的第3题,汇编器只负责生成汇编代码,函数定义有没有的问题 在链接的阶段才会 凸显出来。。

微凉徒眸意 2022-09-10 07:54:41
  1. buf确实在.data段,从文件中就可以看到他的存放空间在那里。

  2. .comm也是一个段

  3. 汇编器阶段不负责判断函数有没有定义,检查函数定义归链接器

  4. 如何整合各个文件的.bss到一起,也是链接阶段的任务

  5. LFB0这类的标签的一大典型作用是提供跳转指令的目标地址,cfi_startproc这类则是unwind用的

最后,这些问题可以在看完整本书后再回来看。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文