我已经在做Intel 8086仿真器约一个月了。我决定开始计算周期以使仿真更准确并与PIT正确同步。
每个指令所用的时钟周期在Intel的用户手册中有详细说明,但我想知道它们是如何计算的。例如,对于XCHG mem8,reg8
指令,手册中明确规定需要17个时钟周期,我已经推断出以下步骤:
- 解码指令的第二个字节:+1个周期;
- 将第一个操作数从内存传输到临时位置:+7个周期;
- 将第二个操作数从寄存器传输到内存目标:+8个周期;
- 将第一个操作数从临时位置传输到寄存器目标:+1个周期。
但我可能完全错误,因为我的推理似乎并不适用于所有指令。例如,我无法理解为什么PUSH reg
指令需要11个时钟周期,而POP reg
指令仅需要8个时钟周期。
谢谢。
PUSH
基本上是从寄存器到内存的MOV
操作。POP
是从内存到寄存器的MOV
操作。从表格中可以看出,前者是9+EA,后者是8+EA。由于你可以使用0 EA进行POP(堆栈指针已经指向你将要POP的位置),因此这个过程可以立即开始,并且一旦不再需要读取周期,堆栈指针的减量就可以(我猜想)与读取周期重叠。对于PUSH操作,有2个EA,因为必须在发出MOV之前增加堆栈指针。我认为这可能是额外的时钟周期来自的地方。这只是推测,我不能确定。 - J...MOV
操作需要 9 个时钟周期,而从内存到寄存器的MOV
操作只需要 8 个时钟周期?以及它在每个子操作中如何分解时钟周期? - neat