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

Assembly 累加器寄存器8086微处理器系列,assembly,x86,cpu-registers,accumulator,Assembly,X86,Cpu Registers,Accumulator,累加器寄存器是保存临时值的寄存器。只有EAX、AX、AL寄存器是累加器 据我所知,BX、CX、DX和扩展版本可以保存永久值。那么,为什么我们要使用EAX、AX、AL寄存器作为累加器呢 什么是累加器?AX与其他寄存器相比,并不是临时的 链接到wiki文章: 在8086的老祖先上,许多指令只能作为隐式目的地与累加器一起使用。看 8086的AL/AX寄存器的名称“累加器”大部分是历史遗留下来的,与8086的设计有关,该设计使从8080代码机械地翻译asm源代码成为可能。(以及) 有(比如addal,

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

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


什么是累加器?

AX与其他寄存器相比,并不是临时的

链接到wiki文章:


在8086的老祖先上,许多指令只能作为隐式目的地与累加器一起使用。看

8086的AL/AX寄存器的名称“累加器”大部分是历史遗留下来的,与8086的设计有关,该设计使从8080代码机械地翻译asm源代码成为可能。(以及)

有(比如
addal,2
是2个字节,但是
addcl,2
是3个字节)。8086(以及186/386中更高版本的扩展)使寄存器比8080更正交,因此您可以
添加dx、cx
,而无需对所有ALU指令使用累加器

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


在许多较旧的CPU上,您可能必须执行与添加ax、cx相当的操作。例如,8080/Z80具有类似于
LDA
(装入累加器)和
ORA
(或装入累加器)的指令,其中累加器目标被烘焙到助记符和操作码中。(这就是我们的出发点。)

这个8080操作码映射显示了许多指令,如
subd
subc
,其中隐式的第一个操作数是累加器A

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


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

你说的“永久值”是什么意思?算术和逻辑运算的结果没有保存在内存中的任何地方,但是这些值是如何永久的?
ax
被称为累加器寄存器,但它与其他通用寄存器
bx
cx
没有什么区别,
dx
si
di
bp
。您可以使用它们中的任何一个来保存您喜欢的任何值。顺便说一句,“eax,ax,al寄存器”=它是同一个寄存器,而不是三个寄存器。这些不同的别名仅表示指令将针对/影响的位大小(在64b模式下不是100%真/精确,其中32b
eax
target将自动清除上32b,即像
mov eax,2
这样的指令将影响整个
rax
)。所以代码:
mov-eax,0x11223344
mov-ax,0x5566
mov-al,0xBB
将产生
eax=0x112255BB
(由三个不同的指令组成)。
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)