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

时间:2018-10-25 21:46:57

标签: assembly x86 cpu-registers accumulator

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

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

什么是累加器?

2 个答案:

答案 0 :(得分:4)

在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(以及286/386中的更高扩展)使寄存器比8080更正交,因此您可以add dx, cx,而不必对所有ALU指令使用累加器。

8086在实现的计算模型方面是Register Machine,而不是Accumulator Machine您可以使用累加器寄存器保存代码大小,但是多数情况下不需要使用它,尤其是x86 ISA的更高扩展。


在许多较旧的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和加倍运算之外,您还可以使用{{1} }(在386及更高版本上)和movsx

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

答案 1 :(得分:3)

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

链接到Wiki文章:

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)