我已经在Intel 8086仿真器上工作了大约一个月了。我决定开始计算周期以使仿真更准确并与PIT正确同步。
每条指令使用的时钟周期在英特尔User Manual中有详细说明,但我想知道它们是如何计算的。例如,我已经推导出XCHG mem8,reg8
指令的以下步骤 - 根据手册需要17个时钟周期:
但我可能完全错了,因为我的推理似乎并不适用于所有指令。例如,我无法理解为什么PUSH reg
指令需要11个时钟周期,而POP reg
指令只需要8个时钟周期。
那么,您能告诉我每个指令中花费的时钟周期,或者更确切地说是了解这些数字来自哪里的一般方法吗?
谢谢。
答案 0 :(得分:3)
如何计算周期以及clock
实际上对我来说是什么也是一个谜,直到我有机会与硬件人一起工作,我可以看到他们使用的是哪种模型。答案在于硬件
CPU
是并行机器,虽然对于程序员来说,它的设计通常用一些简化的术语来解释管道或实现它所需的microinstructions等。{{1仍然是并行机器。
要完成一条指令,许多微小的CPU
信号必须从一端流到另一端。在某些地方,处理单元必须等到所有输入bit-size
到达。从bit
到另一个stage
的协调运动由clock-signal
驱动,clock-signal
集中发送到所有多个部分。由cycle
敲击的每个此类移动称为cycle
。
因此,为了了解完成工作需要多少wire
,您必须考虑bit
的连接方式以及Intel 8086
必须在哪里流动通过以及所需同步点的位置和数量。
我怀疑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个周期,看起来有两个用于有效地址计算(堆栈指针增量)。