根据一些教科书,编译器会使用sub*
局部变量来分配内存。
例如,我编写了一个 Hello World 程序:
int main()
{
puts("hello world");
return 0;
}
我猜这将在 64 位操作系统上编译成一些汇编代码:
subq $8, %rsp
movq $.LC0, (%rsp)
calq puts
addq $8, %rsp
为subq
参数分配 8 字节内存(一个点的大小)并addq
释放它。
但是当我输入时gcc -S hello.c
(我在 Mac OS X 10.8 上使用 llvm-gcc),我得到了一些汇编代码。
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
subq $16, %rsp
Ltmp2:
xorb %al, %al
leaq L_.str(%rip), %rcx
movq %rcx, %rdi
callq _puts
movl $0, -8(%rbp)
movl -8(%rbp), %eax
movl %eax, -4(%rbp)
movl -4(%rbp), %eax
addq $16, %rsp
popq %rbp
ret
.......
L_.str:
.asciz "hello world!"
在此周围callq
没有任何addq
and subq
。为什么?的作用是addq $16, %rsp
什么?
感谢您的任何意见。