間接アドレッシングのインデクサーはなぜdwordでなければならないのですか?間接アドレッシングのインデクサーはなぜdwordでなければならないのですか?
例えば、これは動作しません:
.data
arr dword 10 dup(?)
.code
...
mov bx, 2
call [arr+bx*4] ;;error A2032:invalid use of register
でも働くだろうebx
代わりbx
のを使用して、なぜ?
間接アドレッシングのインデクサーはなぜdwordでなければならないのですか?間接アドレッシングのインデクサーはなぜdwordでなければならないのですか?
例えば、これは動作しません:
.data
arr dword 10 dup(?)
.code
...
mov bx, 2
call [arr+bx*4] ;;error A2032:invalid use of register
でも働くだろうebx
代わりbx
のを使用して、なぜ?
24種類のアドレッシングモードが同時に導入されたわけではないため、16ビットレジスタでは使用できないモードもあります。アドレッシングモードはバイト内MODRMとSIB符号化される命令で
:
可能16ビットアドレッシングモードは、次のとおり
ご覧のとおり、01はありません、SIBのみ(REXプレフィックスに登録する64ビット)32ビット・レジスタを指定することができますSIBが必要になることのために、しかし:
あなたはすべてを見つけることができます関連する技術ノートIntel manual 2
最近導入されたアドレッシングモードは、例えば、 address-size = 32bのときは16bitが登録されます。主な理由は、エンコーディングではビットの無駄であり、インデックスの2ビットスケールは、混合レジスタサイズ、またはdisp32 + r16を許可するよりも重要です。 –
ああ、実際に私はこれが答えとしてどのように機能するかを見ています。 OPはおそらく16ビットのアドレスサイズを使用しているだけで、16ビットアドレッシングモードの制限(スケールファクタがないため、使用しようとしていない限り、どのregがインデックスまたはベースであるかは関係ありません) '[di + si]')。しかし、それはirvine32です。 –
@ PeterCordes :)まあ、私のポイントは、32ビットのアドレッシングモードでインテルが16ビットのレジスタを導入しなかった理由ではありません。私はあなたの結論に同意しますが、それは彼らの最終的な呼びかけです。私の主張は、今日では '[bx * 4] + disp16/32'のようなものをエンコードすることができないということです。歴史の過度に単純化されたビットが助けになると感じました。 –
命令セットの定義方法はこれに限られません。 [基本アーキテクチャマニュアル](http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1- manual.pdf)、セクション_3.7.5オフセットの指定。 – Jester