2

重複の可能性:
x86アセンブリレジスタ—なぜそれらは同じように機能するのですか?

私は次のプログラムをコンパイルしました:

#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ビット値の場合のみですか?

4

1 に答える 1

3

EDIは単に下半分であるRDIため、コンパイラはで引数を渡しますRDIが、引数の長さは32ビットしかないため、レジスタの半分しか使用しません。

于 2012-09-26T16:09:38.757 に答える