一部の教科書によると、コンパイラはsub*
ローカル変数にメモリを割り当てるために使用します。
たとえば、HelloWorldプログラムを作成します。
int main()
{
puts("hello world");
return 0;
}
これは64ビットOSのアセンブリコードにコンパイルされると思います。
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
subq
addq $16, %rsp
ご入力いただきありがとうございます。