8086汇编寄存器间接MOV指令

时间:2019-06-25 17:42:38

标签: assembly x86-16 low-level emu8086

我只是想问:为什么我写的时候是这样:

MOV DL, [BX] 

它可以工作,但是当我写的时候:

MOV DL, [AX]

不是吗?

1 个答案:

答案 0 :(得分:4)

在当前的Intel® 64 and IA-32 Architectures Software Developer Manual中,在4898的第509页中对此进行了描述:

在16位Intel程序集中,无法使用AX寄存器进行寄存器间接寻址。

您可以在手册中看到,indirect addressing可以使用以下寄存器;对于以下所有寄存器,有一些寻址模式可以单独使用它们(或以基址+索引对使用):

  

BX,BP,SI,DI

这些可以组合在一起(具有可选的位移)

 [BX+SI]    [BX+SI]+disp8    [BX+SI]+disp16
 [BX+DI]    [BX+DI]+disp8    [BX+DI]+disp16
 [BP+SI]    [BP+SI]+disp8    [BP+SI]+disp16
 [BP+DI]    [BP+DI]+disp8    [BP+DI]+disp16
 [SI]          [SI]+disp8       [SI]+disp16
 [DI]          [DI]+disp8       [DI]+disp16
 disp16        [BP]+disp8       [BP]+disp16
 [BX]          [BX]+disp8       [BX]+disp16

因此,您的第一个说明(扩展的内容)

MOV DL, BYTE PTR [BX] 

有效,但是第二个无效,因为在8086(x86_16)ISA中,x86机器代码中没有针对它的ModRM寻址模式编码。


32位和64位寻址模式对寻址模式使用不同的编码,带有可选的SIB(标度+索引+基数)字节,该字节几乎允许基数和索引的任何组合(索引= RSP除外),并带有索引的2位移位计数(比例因子)。请参阅Referencing the contents of a memory location. (x86 addressing modes)或英特尔手册中的其他表格。

mov DL, [EAX] is valid even in 16-bit mode,但仅在386兼容CPU上。