2012-02-04 85 views
3

我一直在尝试在我的linux操作系统上学习32位英特尔x86 nasm语法程序集,并且遇到了关于四个通用32位寄存器的问题。英特尔x86 32位寄存器混淆

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

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

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

从我在Google上看到的结果来看,所有结果都是他们用来做的,而不是他们的实际构成。

回答

4

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

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

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

+0

完美的答案,谢谢你解释'||'运算符,也用于将答案扩展到AMD64。 – JAW1025 2012-02-04 00:29:08

+1

实际上有SP,BP,SI和DI,它们是ESP,EBP,ESI和EDI的低端部分,它们又与高32位组合,成为x86_64中的RSP,RBP,RSI和RDI – 2014-01-25 16:04:25

0

当你想,一个32位寄存器,像eax,是在其最显著的部分访问,为axax本身分裂成ahal ...同为ebx等等...

+0

所以斧头身体在eax内吗? (例如,eax的高16位或低16位是扩展,另一半是ax) – JAW1025 2012-02-04 00:27:03

+0

@JAW - * Everything *是扩展名。在时代的黎明时刻,寄存器只是“A”并包含8位。 – 2012-02-04 08:36:18