使用八进制的英特尔操作码的经典解释是这样的:
As an example to see how this works, the mov instructions in octal are:
210 xrm mov Eb, Rb
211 xrm mov Ew, Rw
212 xrm mov Rb, Eb
213 xrm mov Rw, Ew
214 xsm mov Ew, SR
216 xsm mov SR, Ew
The meanings of the octal digits (x, m, r, s) and their correspondence to the
operands (Eb, Ew, Rb, Rw, SR) are the following:
The digit r (0-7) encodes the register operand as follows:
REGISTER (r): 0 1 2 3 4 5 6 7
Rb = Byte-sized register AL CL DL BL AH CH DL BH
Rw = Word-sized register AX CX DX BX SP BP SI DI
为什么第 6 位数字是 RbDL
而不是DH
,从而破坏了高字节模式?
当我问这个问题时,是否有一个更新的八进制解释,用于解释 8086 英特尔操作码,而这个解释不是在90年代写成的?
八进制表示中 Rb 的正确第 6 位数字是 6 = DH,而不是 DL
这与 8086 架构中的 Intel 寄存器编码一致。您引用中的错误可能是拼写错误。使用二进制或十六进制(例如 Intel 手册)可获得现代清晰度。
这是一个打字错误;DL 出现了两次,而 DH 在表中却没有出现。
您说得对,它遵循 4 个低位寄存器和 4 个高位寄存器的模式,正如您通过汇编所看到的
mov dl, 0
,mov dh, 0
其中目标寄存器号是操作码的低 3 位。选择任何流行的无错误汇编程序,它们都可以做到这一点。(NASM 很好,clang 和 GNU 汇编程序也是不错的选择,尽管 GAS 的错误消息不太好。)英特尔的手册是最新的,但其目的在于精确性而非清晰度和可读性。它有时没有提及编码中存在的模式(例如大多数操作码的低 2 位如何区分宽度和方向;8 位与 16/32/64 位以及内存源与目标)。
https://wiki.osdev.org/X86-64_Instruction_Encoding#Registers相当不错,确实有一个正确的寄存器编号表。它适用于 x86-64,因此它包含 REX 前缀可以提供的额外位。(此外,仅仅存在 REX 前缀就会将 8 位寄存器编号 4 到 7 的含义从 AH-BH 更改为 SPL-DIL,即 RSP 到 RDI 的低 8 位。因此您无法这样做,
mov ah, r8b
因为这需要 R8 的 REX 前缀,但这会使 AH 无法访问。)大多数文档使用十六进制或十进制,或二进制数字组,因为 REX、VEX 和 EVEX 前缀提供了额外的寄存器数字位,因此它不再总是 3 位组。(而且八进制不再被广泛使用。)