不,这不太对。
EAX is the full 32-bit value
AX is the lower 16-bits
AL is the lower 8 bits
AH is the bits 8 through 15 (zero-based)
所以 AX 由 AH:AL 两半组成,它本身就是 EAX 的低半部分。(EAX 的上半部分不能作为 16 位寄存器直接访问;如果你想得到它,你可以移位或旋转 EAX。)
为了完整起见,除了上述基于 32 位 CPU 的内容外,64 位 Intel/AMD CPU 还具有
RAX, which hold a 64-bit value, and where EAX is mapped to the lower 32 bits.
所有这些也适用于 EBX/RBX、ECX/RCX 和 EDX/RDX。其他寄存器如 EDI/RDI 有一个 DI 低 16 位部分寄存器,但没有高 8 部分,低 8 DIL 只能在 64 位模式下访问:64 位架构中的汇编寄存器
由于历史原因,写入 AL、AH 或 AX 会使完整 AX/EAX/RAX 中的其他字节保持不变。例如,它必须将一个新的 AL 合并到完整的 RAX 中。(在 32 位或 64 位代码中,如果您不特别想要这种合并,请首选 amovzx eax, byte [mem]
或load:为什么 GCC 不使用部分寄存器?)movzx eax, word [mem]
将 EAX 零扩展写入 RAX。(为什么 32 位寄存器上的 x86-64 指令将整个 64 位寄存器的上半部分归零?)
同样,所有这些都适用于每个寄存器,而不仅仅是 RAX。例如,写入 DI 或 DIL 会合并到旧 RDI,写入 EDI 零扩展并覆盖整个 RDI。对于 R10B 或 R10W 写入合并相同,写入 R10D 使 R10 独立于旧的 R10 值。