cdsfiui 发表于 2016-09-22 13:03

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:05

本帖最后由 MMMIX 于 2016-09-22 15:09 编辑

回复 1# cdsfiui

1. .type, .comm 和 .long 查下 gas 手册就都有了;
2. .LFB0 和 .LFE0 处理 exception 的时候可能会用到。


页: [1]
查看完整版本: gcc -S生成的反汇编,为什么int变量要很多个语句才完成声明?