计算 Intel 8086 的时钟周期

Counting an Intel 8086's clock cycles

我已经在 Intel 8086 仿真器上工作了大约一个月了。我决定开始计算周期以使仿真更准确并与 PIT 正确同步。

每条指令使用的时钟周期在 Intel 的 User Manual 中有详细说明,但我想知道它们是如何计算的。例如,我推导出 XCHG mem8,reg8 指令的以下步骤——根据手册,它正好需要 17 个时钟周期:

  1. 解码指令的第二个字节:+1个周期;
  2. 将第一个操作数从内存传输到临时位置:+7 个周期;
  3. 将第二个操作数从寄存器传输到内存目标:+8 个周期;
  4. 将第一个操作数从临时位置传输到寄存器目标:+1 个周期。

但我可能完全错了,因为我的推理似乎并不适用于所有指令。例如,我无法理解为什么 PUSH reg 指令需要 11 个时钟周期,而 POP reg 指令只需要 8 个时钟周期。

那么,您能否告诉我每条指令的时钟周期是如何花费的,或者更确切地说是了解这些数字从何而来的一般方法?

谢谢。

这个问题很宽泛,所以我只会在这里解决 PUSHPOP 的问题。

PUSH 基本上是从寄存器到内存的 MOV(加上寄存器增量)。 POP 是从内存到寄存器的 MOV(加上寄存器递减)。

如果您查看第 2-61 页,您会发现:

MOV

register, memory 8+EA 1 2-4 MOV BP, STACK_TOP

memory, register 9+EA 1 2-4 MOV COUNT [DI], CX

对于POP操作,您已经在寄存器中拥有堆栈指针,因此有效地址(EA)为零。您可以立即执行 MOV 我只能假设特殊的 POP 操作可以同时递减堆栈指针,一旦地址不再是读操作的稍后时钟周期的某个地方需要。

对于 PUSH 操作,您的 EA 为 2,因为在获得执行写入所需的地址之前必须递增堆栈指针。这里不能并发杠杆,所以你有 9 个周期用于 MOV 加上,看起来,两个用于有效地址计算(堆栈指针增量)。

周期是如何计算的以及 clock 实际做了什么对我来说也是一个谜,直到我有机会与硬件人员一起工作并且我可以看到他们使用什么样的模型.答案在于硬件

CPU 并行机 ,虽然对程序员来说,它的设计通常用一些简化的术语来描述,解释管道或实现它所需的 microinstructions etc.CPU仍为并机

要完成一条指令,许多微小的 bit-size 信号必须从一端流到另一端。在某些地方,处理单元必须等待所有输入 bit 到达。这种从一个 stage 到另一个的协调运动是由集中发送到所有许多部分的 clock-signal 驱动的。 clock-signal 鼓动的每个这样的移动称为 cycle

因此,为了知道完成工作真正需要多少 cycle,您必须考虑 wire 的连接方式以及 bit 的位置必须流经哪里以及需要多少个同步点。

我怀疑 Intel 8086 原理图是否公开可用,即使公开了,我也怀疑它是否可读。但唯一正确的答案就在那里。其他一切都只是一种简化,要在软件中重现确切的硬件行为,您必须 simulate/interpret CPU 的硬件

另请参阅: