【发布时间】:2015-06-16 00:40:57
【问题描述】:
我已经在 Intel 8086 仿真器上工作了大约一个月。我决定开始计算周期以使仿真更加准确并与 PIT 正确同步。
英特尔的User Manual 详细说明了每条指令使用的时钟周期,但我想知道它们是如何计算的。例如,我为 XCHG mem8,reg8 指令推导出了以下步骤 - 根据手册,该指令需要 17 个时钟周期:
- 解码指令的第二个字节:+1个周期;
- 将第一个操作数从内存转移到临时位置:+7 个周期;
- 将第二个操作数从寄存器传输到内存目标:+8 个周期;
- 将第一个操作数从临时位置转移到寄存器目标:+1 个周期。
但我可能完全错了,因为我的推理似乎不适用于所有说明。例如,我无法理解为什么 PUSH reg 指令需要 11 个时钟周期,而 POP reg 指令只需要 8 个时钟周期。
那么,你能告诉我每条指令的时钟周期是如何花费的,或者更确切地说是一种理解这些数字来自哪里的通用方法吗?
谢谢。
【问题讨论】:
-
@downvoter 你能告诉我我的问题有什么问题,以至于你不得不对我投反对票吗?
-
检查“8086 小”来源。他们可能对你很感兴趣
-
PUSH基本上是从寄存器到内存的MOV。POP是从内存到寄存器的MOV。从表格来看,前者是 9+EA,后者是 8+EA。由于您可以使用 0 EA 进行 POP(堆栈指针已经指向您将从中 POP 的位置),因此可以立即开始,并且堆栈指针减量可以(我猜)在不再需要时与读取周期重叠。对于 PUSH 操作,有 2 个 EA,因为堆栈指针必须在发出 MOV 之前递增。我想这就是额外周期的来源。这只是猜测。我不确定。 -
@J... 我已经阅读了我的 OP 中链接的手册。除了表格之外,它没有提供更多信息。我也读过this one,但解释(第 107 页)与我的观察和第一个不符。
-
您想要的书是 Michael Abrash 的“汇编语言之禅”,该书早已绝版,但仍可在二手市场上买到。我记得,你不能轻易地将这些时间分解为子操作。此外,您还必须考虑一些隐性成本,例如指令预取和 DMA 刷新(诚然是特定于平台的)。官方指令时序告诉您 CPU 上发生了什么,但它们是“最佳情况”,假设支持硬件没有添加任何内容。
标签: assembly emulation x86-16 processor cpu-cycles