累加器寄存器是保存临时值的寄存器。只有EAX,AX,AL寄存器是累加器。
据我所知,BX,CX,DX和扩展版本可以保存永久值。那么,为什么我们使用EAX,AX,AL寄存器作为累加器?
什么是累加器?
答案 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 D
和SUB C
,其中隐式的第一个操作数是累加器A。
但是8086是一个寄存器机器,而不是一个累加器机器。有几条要求使用AX的指令,例如mul
/ div
和cdq
,但是除了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)