Assembly 16位程序集:无法取消某些寄存器的引用

Assembly 16位程序集:无法取消某些寄存器的引用,assembly,x86-16,Assembly,X86 16,我正在尝试以下Intel 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位寻址模式,例如[e

我正在尝试以下Intel 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字节对于(索引)寄存器只有三位。正如您在上面所看到的,正好存在8种可能的索引寄存器组合。我不知道为什么他们设计的寻址模式是这样的,但对于70年代的16位处理器来说,这听起来很合理,因为8086就是这样


在32位模式和长模式下,改变了该方案,使8个可能的索引寄存器中的7个指向eax、ebx、ecx、edx、esi、edi和ebp,而指向esp的则表示存在sib字节,从而允许众所周知的
[base+index*scale]
寻址模式

忘了我拿着那把锤子。。我解开了即时复制品。然而,这是这些选择的潜在重复,必须包括8080寻址模式,以使asm源代码的机器翻译成为可能()。所以BX=HL必须是一个可能的基数。source/dest索引可能是新的。@PeterCordes 8080还支持现在的
cx
dx
作为基本寄存器,所以我不太明白这一点。程序集转换器使用
mov%cx,%si;mov(%si),%al
或类似值。