重複の可能性:
アセンブリコードが%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'が正しくありません」というメッセージが表示されます)