gpt4 book ai didi

assembly - AX、AH、AL如何映射到EAX?

转载 作者:行者123 更新时间:2023-12-02 01:20:59 27 4
gpt4 key购买 nike

我对x86寄存器的理解是,每个寄存器都可以被整个32位代码访问,并且它被分成多个可访问的寄存器。

在此示例中,EAX 是一个 32 位寄存器,如果我们调用 AX 它应该返回前 16 位,如果我们调用 AH > 或 AL 它应该返回 16 位之后的接下来的 8 位,而 AL 应返回最后 8 位。

所以我的问题是,因为我并不真正相信这就是它的运作方式。如果我们存储 32 位值,即 EAX 存储:

0000 0100 0000 1000 0110 0000 0000 0111

因此,如果我们访问 AX 它应该返回

0000 0100 0000 1000

如果我们读取AH,它应该返回

0000 0100

当我们读取AL时,它应该返回

0000 0111

这是正确的吗?如果是的话,AH 真正具有什么值(value)?

最佳答案

不,这不太正确。

  • EAX 是完整的 32 位值
  • AX 是低 16 位
  • AL 是低 8 位
  • AH 是第 8 位到 15 位(从零开始),即 AX 的上半部分

因此 AX 由 AH:AL 两半组成,并且本身是 EAX 的低半部分。 (EAX 的上半部分不能作为 16 位寄存器直接访问;如果您想访问它,可以移位或旋转 EAX。)

x86-64 CPU 将整数寄存器扩展到 64 位:

  • RAX 是完整的 64 位值,EAX 及其子组件映射到较低的 32 位。 64 位寄存器的上半部分只能在 64 位模式下访问,这与 32 位寄存器不同,32 位寄存器可以在支持它们的 CPU 上以任何模式使用。

所有这些也适用于 EBX/RBX、ECX/RCX 和 EDX/RDX。其他寄存器如 EDI/RDI 有一个 DI 低 16 位部分寄存器,但没有高 8 部分,并且低 8 DIL 只能在 64 位模式下访问:Assembly registers in 64-bit architecture

<小时/>

由于历史原因,写入 AL、AH 或 AX 会使完整 AX/EAX/RAX 中的其他字节保持不变。例如,它必须将新的 AL 合并到完整的 RAX 中。 (在 32 位或 64 位代码中,如果您不特别希望进行此合并,则首选 movzx eax, byte [mem]movzx eax, word [mem] 加载:Why doesn't GCC use partial registers?)

将 EAX 零扩展写入 RAX。 (Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?)

同样,所有这些都适用于每个寄存器,而不仅仅是 RAX。例如写入 DI 或 DIL 会合并到旧的 RDI 中,写入 EDI 会进行零扩展并覆盖完整的 RDI。对于 R10B 或 R10W 写入合并也是如此,写入 R10D 使 R10 独立于旧的 R10 值。

关于assembly - AX、AH、AL如何映射到EAX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15191178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com