gcc -S生成的反汇编,为什么int变量要很多个语句才完成声明?
本帖最后由 cdsfiui 于 2016-09-22 13:07 编辑学习AT&T汇编的时候,知道可以用.int/.long这样的方式来生成数组,或者.equ来生成一个标号。
这些都放在.data段(初始化过),或者.bss段(未初始化)里面。
不过我用gcc来编译一个非常简单的C文件,-S选项,看到得到的汇编文件
(1) 并没有用到.data段或者.bss段,而是只有一个.data段。
(2) 而且整形变量也用了好几句话才声明完成。
如下所示,我把我有疑问的地方都标记出来了:
$ cat n.c
int i=23;
int j;
int main(){
return 0;
}
$ gcc -S n.c
$ cat n.s
.file "n.c"
.globl i
.data
.align 4
.type i, @object #开始声明i。我觉得这句是多余的
.size i, 4 #既然后面都有了.long 23定义,那就是4个字节。这句岂不是画蛇添足?
i:
.long 23 #我怎么觉得有上面和这一句就够了,上面几句和i有关的语句都不用?
.comm j,4,4 #j为什么没有被放到.bss。难道gcc生成c代码不需要.bss吗?
.text
.globl main
.type main, @function
main:
.LFB0: #这个标号是什么含义,看起来没有任何实际的作用
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0: #这个标号是什么含义,看起来没有任何实际的作用
.size main, .-main
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609"
.section .note.GNU-stack,"",@progbits
问题都在代码的注释里面了,还请板上的高人解释一下哈!
本帖最后由 MMMIX 于 2016-09-22 15:09 编辑
回复 1# cdsfiui
1. .type, .comm 和 .long 查下 gas 手册就都有了;
2. .LFB0 和 .LFE0 处理 exception 的时候可能会用到。
页:
[1]