私は次のプログラムをコンパイルしました:
#include <stdio.h>
int square(int x) {
return x * x;
}
int main() {
int y = square(9);
printf("%d\n", y);
return 0;
}
GCC 4.2.1を使用するOSXで異なるオプションを使用して2回:
gcc foo.c -o foo_32.s -S -fverbose-asm -m32 -O1
gcc foo.c -o foo_64.s -S -fverbose-asm -m64 -O1
32ビットの結果:
_square: ## @square
## BB#0: ## %entry
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
imull %eax, %eax
popl %ebp
ret
そして64ビットの場合:
_square: ## @square
Leh_func_begin1:
## BB#0: ## %entry
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movl %edi, %eax
imull %eax, %eax
popq %rbp
ret
明らかなように、32ビットバージョンはスタックからパラメーターを取得します。これは、cdeclで期待されるものです。ただし、64ビットバージョンはEDI
レジスタを使用してパラメータを渡します。
RDI, RSI, RDX, RCX, R8, R9, XMM0–7
これは、レジスタを使用する必要があることを指定しているSystem V AMD64 ABIに違反していませんか?それとも、これはlongのような真の64ビット値の場合のみですか?