2017-06-14 7 views
3
このデータと

アセンブリ言語で*を使用することはできますか?

.data 
tableD DWORD 10h, 20h, 30h, 40h, 50h, 60h 
Rowsize = ($ - tableD) 
DWORD 60h,70h,80h,90h,0A0h 
DWORD 0B0h,0C0h,0D0h,0E0h,0F0h 

私がすることはできません私は

.code 
mov eax,tableD[ebx + esi*TYPE tableD] 

を使用することができますが、私は

mov eax,tableD[ebx*2 + esi*TYPE tableD] 

を使用することはできませんが、私は

mov eax,tableD[ebx*2 + esi] 

を使用することができます2 *を使う そこ?

これらのオブジェクトの用語を知ることができますか?すべての4つの部分が存在しないことができる

base + index * scale + displacement 

scale1存在しない場合である):

+3

この混乱はAT&Tの構文では起こりませんでした。 – fuz

+3

@fuzええ、それから混乱が起こって、何倍の乗算さえ起こるのか、なぜかっこ内の数字が他のものに加わらないのです...(あなたはこれに勝てず、アドレッシングモードを学ぶだけで、アセンブラは基本をあなたの手に渡しません...また、先進的なものはありません...決して) – Ped7g

+0

@ Ped7g AT&Tでは、どのアドレッシングモードが使用されますか?アドレッシングモードをシンボル算術のように見せかける、奇妙なインテルの構文ではあまりありません。 – fuz

答えて

6

x86アーキテクチャは、次の形式の4つの部分のアドレッシングモードをサポートします。つまり、メモリオペランドには1つのスケーリングされたコンポーネントしか存在できません。そう、はい、あなたは*の1つしか使用できません。

さらに、倍率は1,2,4または8に制限されています。他の倍率を符号化することはできません。

+0

本当にありがたいことに感謝します – unlimitedcoding

+3

@unlimitedcoding:スケールは1,2の累乗だけで、1,2,4,8の最初のものになります。 – Ped7g

+0

@unlimitedcoding:[x86アドレス指定モードに関する私のより広範な回答](https://stackoverflow.com/questions/34058101/) memory-location-x86-addressing-modesを参照します)。この質問はそれの複製として閉じられる可能性があります(そしてCodyはすでにそのように投票すると投票しました)。しかし、私の答えは、この質問に直接答える多くの情報を与えることなく、これより約10倍長くなります:P –