2017-06-14 72 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 * s 那裏?

我可以知道這些對象的條款嗎?

+3

AT&T語法不會發生這種混淆。 – fuz

+3

@fuz是的,但隨後出現混亂,爲什麼甚至有一些乘法發生,爲什麼在括號內的數字不會添加到其他人......(你不能贏得這一點,你只需要學習尋址模式,彙編程序不會牽着你的基礎知識......也不會超過先進的東西......從來沒有) – Ped7g

+0

@ Ped7g在AT&T中,它是使用尋址模式的100%。並不是那種試圖使尋址模式看起來像符號算術的奇怪英特爾語法。 – fuz

回答

6

x86架構支持以下形式的四部分組成的尋址模式:

base + index * scale + displacement 

其中所有四個部分可以不存在(scale1如果不存在)。這意味着內存操作數中只能有一個縮放組件;所以是的,你只能使用一個*

此外,縮放因子被限制爲1,2,4或8;其他縮放因子不能被編碼。

+0

感謝真的很容易知道 – unlimitedcoding

+3

@unlimitedcoding:the scale只能是2的冪,並且只能是1,2,4和8中的第一個。 – Ped7g

+0

@unlimitedcoding:另請參見[我對x86尋址模式的更廣泛的答案](https://stackoverflow.com/questions/34058101/引用最內容對的一存儲器-位置86尋址模式)。這個問題可以作爲一個副本來關閉(並且Cody已經投票結束),但是我的答案比這個長10倍,但沒有提供更多直接回答此問題的信息:P –