[英]Assembly 8088: 32-bit signed Multiplication with addition and bit manipulation using 16-bit registers
[英]16-bit Assembly: cannot deref some registers
我正在嘗試以下英特爾16位指令:
mov si, word [reg]
reg
是一些寄存器。 如果reg
是bx
,則可以正常編譯,但是如果它是ax
, cx
或dx
,則不會編譯。 我使用NASM作為我的匯編器。 我確定這是由於指令集中的某些限制。 有人可以解釋一下限制及其背后的原理嗎?
只有以下索引寄存器可以與16位尋址模式一起使用:
bx
si
di
bp
bx + si
bx + di
bp + si
bp + di
同樣,SIB尋址不適用於16位尋址模式。
如果要使用其他索引寄存器,則始終可以使用32位尋址模式,例如[eax]
。 只要您在80386或更高版本的處理器上運行代碼,此方法就起作用。
存在此限制是因為modr / m字節的(索引)寄存器只有3位。 如您在上面看到的,確切存在8種可能的索引寄存器組合。 我不知道他們為什么要設計這樣的尋址模式,但是對於80年代的80位16位處理器來說,這聽起來很合理。
在32位模式和長模式下,此方案已更改,因此8個可能的索引寄存器中的7個引用了eax,ebx,ecx,edx,esi,edi和ebp,而用esp表示存在一個sib字節。允許使用眾所周知的[base+index*scale]
尋址模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.