簡體   English   中英

16位匯編:無法取消引用某些寄存器

[英]16-bit Assembly: cannot deref some registers

我正在嘗試以下英特爾16位指令:

mov si, word [reg]

reg是一些寄存器。 如果regbx ,則可以正常編譯,但是如果它是axcxdx ,則不會編譯。 我使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM