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)
不是吗?
在当前的英特尔® 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 上有效。