2

重複の可能性:
アセンブリコードが%eaxと%edxを使用しているのに、なぜレジスタ%rdxと%raxを追加するのかわからない

すべて。だから、これが私の最小限のプログラムです:

int main(int argc, char * argv[]){
    volatile int a;
    volatile int b;
    volatile int c;
    a = 9;
    b = 15;
    c = a+b;
    return c;
}

これでgcc-Sを実行します。これが、生成されたアセンブリの要点です。

.LCFI1:
    movl    %edi, -20(%rbp)    //unknown setup
    movq    %rsi, -32(%rbp)    //unknown setup
    movl    $9, -4(%rbp)       //a=9, so -4(%rbp) is the register for a.
    movl    $15, -8(%rbp)      //b=15, so -8(%rbp) is b's register.
    movl    -4(%rbp), %edx     //move a into the register for addition.
    movl    -8(%rbp), %eax     //move b into the register for additon.
    leal    (%rdx,%rax), %eax  //Add a and b, store in %eax. (PROBLEM LINE)
    movl    %eax, -12(%rbp)    //Store %eax in c's register.
    movl    -12(%rbp), %eax    //get ready to return c. 
    leave                      //we're done here.
    ret

さて、あなたは私が問題の線として示した線を見るでしょう。これが私の質問です:%rdxと%raxは一体何ですか?ロードしたレジスタは%edxと%eaxだけです。

プログラムは機能するため、%rdxと%raxは、それに応じて%edxと%eaxの何らかのエイリアスである必要があります。誰かがx86レジスタの命名法のニュアンスを説明できるでしょうか?私はこれについて完全に暗闇の中にいます。

(注目すべきは、問題の行をに変更したaddl %edx, %eax場合、結果は同じですが、に変更した場合、addl %rdx, %rax「エラー:lサフィックスで使用されるレジスタ'%rax'が正しくありません」というメッセージが表示されます)

4

1 に答える 1

2

レジスタとそのサイズがわからない場合は、こちらをご覧ください。このように考えてください

union{
  struct{
    uint32_t eax;
    uint32_t padd;
  };
  uint64_t rax;
};

eax同じレジスタをrax共有し、eaxそのレジスタの下位部分です。

addlこれが、接頭辞rが付いたレジスタで機能しない理由です。これらのレジスタaddlは予想よりも長くなっています。addq代わりに試してください。

于 2012-12-18T03:59:29.273 に答える