8086汇编寄存器间接MOV指令

Yas*_*e11 -1 assembly low-level x86-16 emu8086

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

MOV DL, [BX] 
Run Code Online (Sandbox Code Playgroud)

它有效,但是当我写:

MOV DL, [AX]
Run Code Online (Sandbox Code Playgroud)

不是吗?

zx4*_*485 6

在当前的英特尔® 64 位和 IA-32 架构软件开发人员手册中,第 4898 页的第 509 页对此进行了描述:

在 16 位 Intel 汇编中,不可能使用AX寄存器进行寄存器间接寻址。

正如您在手册中看到的,您可以使用以下寄存器进行间接寻址;对于以下所有寄存器,都有单独使用它们(或以基址+索引对)的寻址模式:

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
Run Code Online (Sandbox Code Playgroud)

因此你的第一条指令(扩展)

MOV DL, BYTE PTR [BX] 
Run Code Online (Sandbox Code Playgroud)

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


32 位和 64 位寻址模式对寻址模式使用不同的编码,带有一个可选的 SIB(比例+索引+基)字节,它允许基和索引的几乎任何组合(索引=RSP 除外),并且带有 2-索引的位移计数(比例因子)。请参阅引用内存位置的内容。(x86 寻址模式)或英特尔手册中的其他表格。

mov DL, [EAX]即使在 16 位模式下也有效,但仅在 386 兼容的 CPU 上有效。