我已经研究了基于gcc -S输出的汇编语言,我找到了一些我以前从未见过的语法。 来自C代码:
#include <stdio.h>
void main() {
printf("%d\n", sizeof(int));
}
我有这个:
.file "test.c"
.def __main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.LC0:
.ascii "%d\12\0"
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $32, %rsp
.seh_stackalloc 32
.seh_endprologue
call __main
movl $4, %edx
leaq .LC0(%rip), %rcx
call printf
nop
addq $32, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (tdm64-1) 5.1.0"
.def printf; .scl 2; .type 32; .endef
即使这段代码非常清晰易懂,但对我来说,这一行对我来说是完全奇怪的。我说的话是:
leaq .LC0(%rip), %rcx
即使我知道leaq
是加载有效地址的指令,操作数语法对我来说还不清楚,我的意思是格式化字符串的标签,指令指针作为参数?它有什么作用?
在此先感谢:)