【问题标题】:Intel x86 32-bit register confusionIntel x86 32位寄存器混淆
【发布时间】:2012-02-26 13:44:07
【问题描述】:

我一直在尝试在我的 Linux 操作系统上学习 32 位 Intel x86 nasm 语法汇编,但遇到了一个关于四个通用 32 位寄存器的问题。

根据我一直的想法,eax 是一个 32 位寄存器,应该与 16 位寄存器 ax 一起使用,它被细分为ah(高 8 位)和 al(低 8 位)。 ebx、ecx 和 edx 也是如此。

但是在阅读了一篇简短的文章后,我变得有点困惑。

32 位寄存器是由 16 位寄存器(又由两个 8 位寄存器组成)加上额外的 16 位组成的吗?

到目前为止,我在 Google 上看到的所有结果都说明了它们的用途,而不是它们的实际成分。

【问题讨论】:

    标签: assembly x86 nasm cpu-registers 32-bit


    【解决方案1】:

    你完全正确。四个通用寄存器EAXEBXECXEDX组成如下(我在示例中使用了累加器):

    1. 首先,我们有 16 位字的低字节和高字节。所以,AX = AH || AL
    2. 然后,我们有 AX 的 16 位扩展名,它构成了 dword。所以,EAX = EAX(31:16) || AX
    3. (在 AMD64 中)然后将 dword 寄存器扩展为 qword 寄存器。因此,我们有RAX = RAX(63:32) || EAX

    || 运算符是连接运算符。请注意,此规则不适用于其他四个通用寄存器 ESPEBPESIEDI

    【讨论】:

    • 完美答案,感谢您解释“||”运算符,也可以将答案扩展到 AMD64。
    • 其实有SP、BP、SI、DI是ESP、EBP、ESI、EDI的低位,依次与高32位组合成RSP、RBP , x86_64 中的 RSI 和 RDI
    • every 寄存器的低字节可在 64 位模式下访问,例如dil 是 RBP 的低字节。这需要一个 REX 前缀;如果没有 REX 前缀,则相同的寄存器号将表示 bh,因此例如 movzx r8d, bh 是不可编码的,test bpl, ah 也是如此
    【解决方案2】:

    如您所想,一个 32 位寄存器,如 eax,在其最重要的部分是可访问的,因为 axax 本身分为 ahal...对于ebx 等等...

    【讨论】:

    猜你喜欢
    • 2011-01-14
    • 2014-02-04
    • 2014-11-18
    • 2015-05-31
    • 2020-11-21
    • 2016-11-13
    • 2013-04-15
    • 2014-11-17
    相关资源
    最近更新 更多