【问题标题】:General Purpose Registers - Order通用寄存器 - 顺序
【发布时间】:2011-04-18 22:44:15
【问题描述】:

为什么通用寄存器按原样排序(eax、ecx、edx、ebx)? 例如,对于“inc”指令,操作码是:

inc eax - 40
inc ecx - 41
inc edx - 42
inc ebx - 43

这样排序有什么原因吗?

【问题讨论】:

  • 不知道为什么您认为它们必须按任何特定顺序排列,除非它们当然被推入堆栈。此外,这取决于您执行哪种增量,“字”、“字节”等......目标存储可以是内存位置或寄存器。
  • 因为它是 EAX、EBX 等。这些都是 32 位寄存器......好吧,除了 ebx,它们似乎是字母,不是吗?

标签: assembly x86


【解决方案1】:

(E)BX 的奇怪位置可能是由于 8086 从 8080 演变而来的方式。

8080 有一个累加器(A)和 6 个通用寄存器 B、C、D、E、H 和 L,其中 B/C、D/E 和 H/L 可以成对一起使用,并在特定的 H/L 可以用作内存访问的地址。 8086 的设计使得现有的 8080 代码可以很容易地转换成它;我想按以下顺序映射寄存器似乎是合乎逻辑的:

8080 register A   -> 8086 internal register 0
              B,C ->                        1
              D,E ->                        2
              H,L ->                        3
              SP  ->                        4

正如另一个答案中所述,8086 中的 AX、BX、CX 和 DX 不仅仅是 4 个通用寄存器的任意名称 - 它们对于这些寄存器具有的特殊功能具有助记意义:“累加器”、“基数” ”、“计数”和“数据”。鉴于上述映射,分配 内部寄存器 0 的“累加器”功能,内部寄存器 3 的“基”功能。(而 8086 内部寄存器 5、6 和 7 是 BP、SI 和 DI,它们是新功能。)

当然,这一切都只是稍微知情(例如参见here)的推测——只有 8086 设计者才能确定...

【讨论】:

    【解决方案2】:

    有 8 个寄存器,所以每个寄存器都接收一个从 0 到 7 的序数。

    我不明白这个问题。是“为什么不按字典顺序排列它们?” 这是因为字母 a、b、c、d 代表累加器、基数、计数器和数据,而不仅仅是字母表的前四个字母。

    【讨论】:

    • 为什么他们会这样收到号码?您只需说出它们为何如此命名即可。
    • 多寄存器操作,例如 mul 和 div 使用 edx:eax,所以我预计它们至少是相邻的数字。 IIRC 在 16 位版本中,您可以使用 bx 进行寻址,但不能使用 ax,cx,dx,因此这可能是它与其他索引寄存器位于顶端的原因。
    • @NOP 为什么重要?您有 8 个寄存器,因此您必须为它们分配不同的编号。就这样。也许这取决于一些内部 x86 实现细节,但这并不重要。
    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 2011-05-29
    • 2013-10-22
    • 2015-01-12
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多