assembly - 累加器寄存器 8086 微处理器系列

标签 assembly x86 cpu-registers accumulator

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

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

什么是累加器?

最佳答案

在 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 a 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 和 widening-multiply 你可以使用在 386 及更高版本上使用 movsximul edx, edi 进行任何注册。

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

关于assembly - 累加器寄存器 8086 微处理器系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52998558/

相关文章:

c++ - 读取eax寄存器

assembly - x86 NASM 'org' 指令含义

assembly - XOR寄存器,寄存器(汇编器)

assembly - 汇编中的eax ebx ecx有什么区别

c - 将加载的目标地址保留在寄存器中,直到指令退出

assembly - 当处理器试图访问一个不存在的物理地址时会发生什么?

hex - 汇编器内存地址表示

linux - outb() 在 LDD3 示例短模块中不起作用

c# - 如何将寄存器值加载到变量C#

c++ - (低级C++)在一段数据上使用 "cout"时,它在显示在屏幕上之前是什么?