如何在8086处理器中实现XCHG?

时间:2017-01-31 12:41:41

标签: assembly x86 x86-16

我在8086集会上读到的那本书

XCHG AX, VAR

相当于:

MOV DX, AX        ; DX is a temporary register
MOV AX, VAR
MOV VAR, DX

它是否真的使用数据寄存器(如DX),内部执行相当于三个移动指令,还是在8086中执行其他操作? 如果前一种情况是真的,那么数据寄存器内容会发生什么?

2 个答案:

答案 0 :(得分:1)

有两种方法可以实现XCHG指令。

一个。使用隐藏的寄存器。 8085 has 2 hidden registers,但不知道它是否将这些寄存器用于xchange指令。 8086尚未进行逆向工程,因此我们不知道它有多少隐藏的寄存器。

Temp = A
A = B
B = Temp    

湾使用the xor trick.

A = A xor B
B = A xor B
A = A xor B  (Now A and B are swapped).  

请注意,方法A和B都使用3个步骤,因此无法使用指令时序告知使用哪种方法。

请注意,方法A可以并行化,方法B不能,但8086不会进行这种花哨的优化。

modern CPU's上,xchg始终是mov的一半,并且需要两倍的uop,暗示正在使用的临时寄存器,这可以分两步完成,因为前两个赋值使用寄存器重命名融合为一个。

如果指令是硬连线的,它可以以与mov相同的速度完成,但似乎并非如此,大概是因为很少使用它。

答案 1 :(得分:-2)

非流水线处理器上有3到4个时钟,有两个读取和两个写入,因此也许可以并行一个。

part = cell(4,1);

所以它组成3到4.如果有一个临时寄存器或一些xors,它将是另外几个/三个时钟。