4

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

每条指令使用的时钟周期在英特尔的用户手册中有详细说明,但我想知道它们是如何计算的。例如,我为XCHG mem8,reg8指令推导出了以下步骤 - 根据手册,这需要 17 个时钟周期:

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

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

那么,你能告诉我每条指令是如何花费时钟周期的,或者更确切地说是一种理解这些数字来自哪里的通用方法吗?

谢谢你。

4

2 回答 2

4

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

CPU并行机,尽管对于程序员来说,它的设计通常用一些简化的术语来描述,解释管道或实现它所需的微指令CPU等。仍然是并行机。

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

所以为了知道cycle完成工作真正需要多少个s,你必须考虑s是如何wire连接的,bits必须流向哪里,需要的同步点在哪里,有多少。

在此处输入图像描述

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

也可以看看:

于 2015-04-10T15:31:03.807 回答
2

这个问题非常广泛,所以我将在这里只解决PUSHvsPOP问题。

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

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

移动

寄存器、内存 8+EA 1 2-4 MOV BP, STACK_TOP

内存,寄存器 9+EA 1 2-4 MOV COUNT [DI], CX

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

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

于 2015-04-10T11:26:24.650 回答