我正在尝试以下英特尔16位指令:
mov si, word [reg]
其中reg
是一些寄存器。如果reg
为bx
,则编译正常,但如果为ax
,cx
或dx
,则编译不正确。我使用NASM作为我的汇编器。我确定这是由于指令集中的某些限制。有人可以解释一下限制及其背后的原理吗?
答案 0 :(得分:6)
仅以下索引寄存器可用于16位寻址模式:
bx
si
di
bp
bx + si
bx + di
bp + si
bp + di
同样,SIB寻址在16位寻址模式下不可用。
如果要使用其他索引寄存器,则始终可以使用32位寻址模式,例如[eax]
。只要您在80386或更高版本的处理器上运行代码,此方法就起作用。
存在此限制是因为modr / m字节的(索引)寄存器只有3位。如您在上面看到的,确切存在8种可能的索引寄存器组合。我不知道他们为什么要设计这样的寻址模式,但是对于70年代的80位16位处理器来说,这听起来很合理。
在32位模式和长模式下,此方案已更改,因此8个可能的索引寄存器中有7个引用了eax,ebx,ecx,edx,esi,edi和ebp,而用esp表示存在一个sib字节,允许使用众所周知的[base+index*scale]
寻址模式。