2

メモリアドレスを保持する64ビットレジスタがあります。レジスタの下半分で算術演算を実行して逆参照しようとすると、セグメンテーション違反が発生します。次に例を示します。

movsx rax, BYTE PTR [rdi]  # ok
add edi, 1 # the address is correct but....
movsx rax, BYTE PTR [rdi] # segmentation fault here

2 行目で edi を rdi に変更すると機能するので、この場合、なぜ rdi の下半分を使用できないのか疑問に思っています。また、レジスタの下位部分の適切な使用に関する情報を含むリンク/参照があれば、それもありがたいです。

どうもありがとうございました。

4

2 に答える 2

5

edi1つまたは他の 32 ビットの下位半分のレジスタで操作を行うと、レジスタ全体の上半分が自動的にゼロになります。

したがって、 の上位 32 ビットは、 のrdi後にゼロになりadd edi, 1ます。

于 2012-04-21T05:44:20.687 に答える
4

AMD64 Architecture Programmer's Manual Volume 1: Application Programming」より

3.1.2 64 ビット モード レジスタ:

一般に、バイトオペランドとワードオペランドは、それぞれ上位 56 ビットまたは 48 ビットを変更せずに、GPR の下位 8 ビットまたは 16 ビットに格納されます。ただし、ダブルワード オペランドは通常、GPR の下位 32 ビットに格納され、64 ビットにゼロ拡張されます

于 2012-04-21T05:48:40.767 に答える