最近也算看玩了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
等等, 这些在书中也根本没提到, 这些又是干什么的呢?
对汇编没有了解很多。。
不过gcc
默认生成的是AT&T
格式的汇编代码,有些东西需要系统的学习或者有个浅显的认识才会了解你上面所说的这些东西吧,你或许需要讲解汇编更专业一点的书籍。。
不过我可以回答你的第3
题,汇编器只负责生成汇编代码,函数定义有没有的问题 在链接
的阶段才会 凸显出来。。