【问题标题】:accumulator register 8086 microprocessor family累加器寄存器 8086 微处理器系列
【发布时间】:2023-11-05 05:21:01
【问题描述】:

累加器寄存器是保存临时值的寄存器。只有 EAX、AX、AL 寄存器是累加器。

据我所知,BX、CX、DX 和扩展版本可以保持永久价值。那么,我们为什么要用 EAX、AX、AL 寄存器作为累加器呢?

什么是累加器?

【问题讨论】:

  • “永久价值”是什么意思?
  • 算术和逻辑运算的结果没有保存在内存中的任何地方
  • 但是这些值是如何永久存在的?
  • ax 被称为累加器寄存器,但它与其他通用寄存器 bxcxdxsidi 和 @987654327 并没有什么不同@。您可以使用它们中的任何一个来保存您喜欢的任何值。
  • BTW, "eax, ax, al registers" = 同一个寄存器,不是三个寄存器。这些不同的别名仅表示指令将针对/影响的位大小(在 64b 模式下不是 100% 正确/精确,其中 32b eax 目标将自动清除高位 32b,即像 mov eax,2 这样的指令将影响整个 @987654330 @)。所以代码:mov eax,0x11223344mov ax,0x5566mov al,0xBB将产生eax = 0x112255BB(由三个不同的指令组成)。

标签: assembly x86 cpu-registers accumulator


【解决方案1】:

在 8086 的较早祖先上,许多指令只能将累加器用作隐式目标。见https://en.wikipedia.org/wiki/Accumulator_(computing)

8086 的 AL/AX 寄存器的名称“累加器”主要是历史性的,并且与 8086 的设计有关,该设计可以机械地从 8080 代码转换 asm 源代码。 (Why are first four x86 GPRs named in such unintuitive order? 还有The start of x86: Intel 8080 vs Intel 8086?

special short-form encodings of many instructions using AL/AX/EAX(比如add al, 2是2个字节,而add cl, 2是3个字节)。 8086(以及 186/386 中的后续扩展)使寄存器比 8080 更加正交,因此您可以add dx, cx 而不必为所有 ALU 指令使用累加器。

8086 在指令格式方面有一个(mostly) 2-operand instruction set,而不是Accumulator Machine您可以通过使用累加器寄存器来节省代码大小,但大多数情况下不需要它,尤其是使用以后对 x86 ISA 的扩展。比较 x87 FPU 指令:一切都必须使用 st0 作为操作数之一。 (在理论上的 CS 中,Register Machine 将主内存称为“寄存器”,而不是带有磁带的图灵机。真正的 CPU 具有与内存分离的寄存器,这与理想化模型不同。x86 指令最多可以有 1 个显式内存操作数;其他必须是寄存器。https://www.realworldtech.com/architecture-basics/2/ 显示了现实世界中的累加器与寄存器设计的分类,CISC x86 是加载存储加上其中一个或另一个的能力操作数是内存。)


在许多较旧的 CPU 上,您可能不得不执行与 mov ax,dx / add ax, cx 等效的操作。例如,8080 / Z80 有类似LDA(加载到累加器)和ORA(或到累加器)之类的指令,其中累加器目标被烘焙到助记符和操作码中。 (这就是the inefficient and obsolete or ax,ax instead of test ax,ax idiom 的来源。)

这个 8080 操作码映射 http://pastraiser.com/cpu/i8080/i8080_opcodes.html 显示了许多指令,例如 SUB DSUB C,其中隐式的第一个操作数是累加器 A。

但是 8086 是寄存器机,不是累加器机。有几条指令需要使用 AX,例如 mul / divcdq,但除了 DIV 和加宽乘法之外,您可以在 386 及更高版本上使用 movsx 和 @ 987654348@.

请注意,就计算理论而言,许多仅具有使用累加器的 ALU 指令的 8 位微控制器并不总是纯累加器机器。它们通常具有可用于寻址模式的其他寄存器。但他们通常是1-operand instruction sets

【讨论】:

    【解决方案2】:

    AX 并不比其他寄存器更多或更少是临时的。

    维基文章链接:

    https://en.wikipedia.org/wiki/Accumulator_(computing)

    8080 to 8086 register mapping and legacy name
    
    A       AL   accumulator
    H,L     BX   high, low memory pointer
    B,C     CX   byte counter (also a memory pointer)
    D,E     DX   data         (also a memory pointer)
    SP      SP   stack pointer
    ...     SI   source index
    ...     DI   destination index
    ...     BP   base pointer (uses SS as default segment)
    

    【讨论】: