计算英特尔8086的时钟周期

时间:2015-04-10 10:21:50

标签: assembly emulation x86-16 processor cpu-cycles

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

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

  1. 解码指令的第二个字节:+ 1个周期;
  2. 将第一个操作数从内存传输到临时位置:+7个周期;
  3. 将第二个操作数从寄存器传送到存储器目的地:+8个循环;
  4. 将第一个操作数从临时位置传输到寄存器目的地:+1个循环。
  5. 但我可能完全错了,因为我的推理似乎并不适用于所有指令。例如,我无法理解为什么PUSH reg指令需要11个时钟周期,而POP reg指令只需要8个时钟周期。

    那么,您能告诉我每个指令中花费的时钟周期,或者更确切地说是了解这些数字来自哪里的一般方法吗?

    谢谢。

2 个答案:

答案 0 :(得分:3)

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

CPU并行机器,虽然对于程序员来说,它的设计通常用一些简化的术语来解释管道或实现它所需的microinstructions等。{{1仍然是并行机器。

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

因此,为了了解完成工作需要多少wire,您必须考虑bit的连接方式以及Intel 8086必须在哪里流动通过以及所需同步点的位置和数量。

enter image description here

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

另见:

答案 1 :(得分:2)

问题非常广泛,所以我只会在这里解决PUSH vs POP问题。

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

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

  

MOV

     

寄存器,存储器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个周期,看起来有两个用于有效地址计算(堆栈指针增量)。