关于gcc生成的汇编代码的一些疑问 ...
最近也算看玩了CSAPP的第三章讲汇编语言的部分, 但是自己实际分析代码的时候碰到了许多问题. 如下图所示, 图的左上和右上分别对应的是main.s和main.c的代码, 左下和右下则是swap.s
和swap.c
的代码.
我使用的编译指令是 :
gcc -m32 -S main.c -o main.s
gcc -m32 -S swap.c -o swap.s
我的问题 :
在
main.s
(左上)中,.data
段不应该用来放数据的吗? 那么全局变量buf
为什么不在.data
段后面 ?.comm
这一行是什么意思 ?函数
swap()
不是没有在main.c
中定义吗, 那么这里(main.s中)
根本就没有反映出swap()
没有定义, 那汇编器是如何知道swap()
没有定义的呢?我在
swap.c
中定义的了两个bufp0
, 可以看到那个local的bufp0
被改成了bufp0.1483
(左下的第23
行), 我记得直接被定义为0的值是要被放在.bss
里面的, 但是这里根本看不到.bss
这又是为什么呢?生成的代码中有很多黄色的代码, 像
LFB0
,.cfi_startproc
等等, 这些在书中也根本没提到, 这些又是干什么的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对汇编没有了解很多。。
不过
gcc
默认生成的是AT&T
格式的汇编代码,有些东西需要系统的学习或者有个浅显的认识才会了解你上面所说的这些东西吧,你或许需要讲解汇编更专业一点的书籍。。不过我可以回答你的第
3
题,汇编器只负责生成汇编代码,函数定义有没有的问题 在链接
的阶段才会 凸显出来。。buf确实在.data段,从文件中就可以看到他的存放空间在那里。
.comm也是一个段
汇编器阶段不负责判断函数有没有定义,检查函数定义归链接器
如何整合各个文件的.bss到一起,也是链接阶段的任务
LFB0这类的标签的一大典型作用是提供跳转指令的目标地址,cfi_startproc这类则是unwind用的
最后,这些问题可以在看完整本书后再回来看。