我只是想问:为什么我写的时候是这样:
MOV DL, [BX]
它可以工作,但是当我写的时候:
MOV DL, [AX]
不是吗?
答案 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上。