2016-06-18 1 views
2

間接アドレッシングのインデクサーはなぜdwordでなければならないのですか?間接アドレッシングのインデクサーはなぜdwordでなければならないのですか?

例えば、これは動作しません:

.data 
arr dword 10 dup(?) 
.code 
... 
mov bx, 2 
call [arr+bx*4] ;;error A2032:invalid use of register 

でも働くだろうebx代わりbxのを使用して、なぜ?

+4

命令セットの定義方法はこれに限られません。 [基本アーキテクチャマニュアル](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

答えて

4

24種類のアドレッシングモードが同時に導入されたわけではないため、16ビットレジスタでは使用できないモードもあります。アドレッシングモードはバイト内MODRMSIB符号化される命令で

Instruction format

可能16ビットアドレッシングモードは、次のとおり

16-bits addressing modes

ご覧のとおり、01はありません、SIBのみ(REXプレフィックスに登録する64ビット)32ビット・レジスタを指定することができますSIBが必要になることのために、しかし

SIB encodings


あなたはすべてを見つけることができます関連する技術ノートIntel manual 2

+0

最近導入されたアドレッシングモードは、例えば、 address-size = 32bのときは16bitが登録されます。主な理由は、エンコーディングではビットの無駄であり、インデックスの2ビットスケールは、混合レジスタサイズ、またはdisp32 + r16を許可するよりも重要です。 –

+0

ああ、実際に私はこれが答えとしてどのように機能するかを見ています。 OPはおそらく16ビットのアドレスサイズを使用しているだけで、16ビットアドレッシングモードの制限(スケールファクタがないため、使用しようとしていない限り、どのregがインデックスまたはベースであるかは関係ありません) '[di + si]')。しかし、それはirvine32です。 –

+0

@ PeterCordes :)まあ、私のポイントは、32ビットのアドレッシングモードでインテルが16ビットのレジスタを導入しなかった理由ではありません。私はあなたの結論に同意しますが、それは彼らの最終的な呼びかけです。私の主張は、今日では '[bx * 4] + disp16/32'のようなものをエンコードすることができないということです。歴史の過度に単純化されたビットが助けになると感じました。 –

関連する問題