- 论坛徽章:
- 2
|
本帖最后由 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
复制代码
问题都在代码的注释里面了,还请板上的高人解释一下哈!
|
|