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

aiz*_*bek 2 x86 assembly cpu-registers accumulator

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

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

什么是蓄能器?

Pet*_*des 6

在 8086 的较老祖先上,许多指令仅在累加器作为隐式目的地时才可用。请参阅https://en.wikipedia.org/wiki/Accumulator_(computing)

8086 的 AL/AX 寄存器的名称“累加器”大多是历史性的,与 8086 的设计有关,使 8080 代码的 asm 源代码翻译成为可能。(为什么前四个 x86 GPR 的命名顺序如此不直观?还有x86 的开始:Intel 8080 vs Intel 8086?

许多使用 AL/AX/EAX 的指令都有特殊的短格式编码(比如add al, 2是 2 个字节,但是add cl, 2是 3 个字节)。8086(以及 186/386 中的后续扩展)使寄存器比 8080 更正交,因此您add dx, cx无需为所有 ALU 指令使用累加器即可。

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


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

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

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

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