【发布时间】:2015-07-19 22:41:20
【问题描述】:
如果您查看该程序的第二行,它只会显示“.text”。当我编写汇编程序时,我认为您必须输入“.section .text”为什么GCC 省略了“.section”。我还注意到它在声明rodata bellow“.section .rodata”之前包含它。
还想知道“.type sum,@function”是做什么的?我今天早上写了一个没有它的汇编函数,它执行得很好。
.file "test.c"
.text
.globl sum
.type sum, @function
sum:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movss %xmm0, -4(%rbp)
movss %xmm1, -8(%rbp)
movss -4(%rbp), %xmm0
mulss -8(%rbp), %xmm0
cvttss2si %xmm0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size sum, .-sum
.section .rodata
.LC2:
.string "%d\n"
.text
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movss .LC0(%rip), %xmm1
movss .LC1(%rip), %xmm0
call sum
movl %eax, -4(%rbp)
movl -4(%rbp), %eax
movl %eax, %esi
movl $.LC2, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.section .rodata
.align 4
.LC0:
.long 1092930765
.align 4
.LC1:
.long 1092825907
.ident "GCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2"
.section .note.GNU-stack,"",@progbits
【问题讨论】:
-
你也可以使用
.text。汇编器不知道它是由编译器或人类放置在那里的;)如果您不指定小节编号,它基本上是.section .text的别名。.type只是设置符号类型,以便将其标记为定义函数(主要与共享库相关)。 -
您可能还会发现 gnu Assembler 参考资料很有帮助:sourceware.org/binutils/docs-2.20/as
-
标准部分的名称是关键字,也是为了简单和向后兼容。请注意,一些早期的目标文件格式不允许任意部分,并且只有
.text、.bss、.data。 -
我不明白这个问题的反对意见。这是完全合理的,因为这两种符号都有效,并且 OSX/Darwin 上的 gcc 确实 为 Mach-O 汇编器发出
.section指令 - 它使用基本上未经修改的 x86-64 ELF ABI。
标签: c gcc assembly x86 gnu-assembler