Intel x86 32 位寄存器混淆

JAW*_*025 5 x86 assembly 32-bit nasm cpu-registers

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

从我一直思考,EAX是,本来要使用的32位寄存器16位寄存器AX,其中又分为啊(高8位)和人(低8位)。ebx、ecx 和 edx 也是如此。

然而,在阅读了一篇快速文章后,我变得有点困惑。

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

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

Dan*_*zar 6

你是完全正确的。通用寄存器的四个EAXEBXECXEDX组成如下(I用于本例中的储液器):

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

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

  • *every* 寄存器的低字节可在 64 位模式下访问,例如“dil”是 RBP 的低字节。这需要一个 REX 前缀;如果没有 REX 前缀,相同的寄存器编号将表示“bh”,因此“movzx r8d, bh”不可编码,“test bpl, ah”也不可编码 (2认同)