16位汇编:无法取消引用某些寄存器

时间:2018-10-10 12:39:44

标签: assembly x86-16

我正在尝试以下英特尔16位指令:

mov si, word [reg]

其中reg是一些寄存器。如果regbx,则编译正常,但如果为axcxdx,则编译不正确。我使用NASM作为我的汇编器。我确定这是由于指令集中的某些限制。有人可以解释一下限制及其背后的原理吗?

1 个答案:

答案 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]寻址模式。