【问题标题】:Counting an Intel 8086's clock cycles计算 Intel 8086 的时钟周期
【发布时间】:2015-06-16 00:40:57
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

  • @downvoter 你能告诉我我的问题有什么问题,以至于你不得不对我投反对票吗?
  • 检查“8086 小”来源。他们可能对你很感兴趣
  • PUSH 基本上是从寄存器到内存的MOVPOP 是从内存到寄存器的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


【解决方案1】:

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

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

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

所以为了知道真正需要多少cycles 才能完成工作,你必须考虑wires 是如何连接的,bits 必须流经哪里以及在哪里和多少是必需的同步点。

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

另见:

【讨论】:

  • 我认为,无论对错,指令的执行方式存在一些重复模式(不考虑“提取到队列”部分)。但我想这对于我想要完成的事情来说太复杂了,所以我继续将用户指南中的时钟周期实现到my emulator,它似乎工作好的。非常感谢!
【解决方案2】:

这个问题相当广泛,所以我只会在这里解决PUSHPOP 的问题。

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,因为堆栈指针必须在获得执行写入所需的地址之前递增。这里不能利用并发性,因此您有 9 个周期用于 MOV 加上,看起来,两个用于有效地址计算(堆栈指针增量)。

【讨论】:

  • 只谈mov,reg to mem 比 mem to reg 多一个周期(从你给出的报价)在 8086:9+EA 对 8+EA,但在 286 mem to reg比 reg 多两个周期到 mem(5 对 3)。我首先认为写入内存比读取要慢。但这对 286 没有意义...已阅读数据表...
  • 再次对 386 写入内存比从中读取快两个时钟
  • @NeatMonster 听起来您有很多问题。使用 Stack Overflow 的适当方法是考虑您在做什么,并尝试将您的问题分解为单个问题。您应该在这里将每个问题都作为一个单独的问题提出 - 一个问题,一个答案。这就是它的工作原理。这不是一个帮助论坛 - 继续在 cmets 中提出越来越多的问题并不是该网站的运作方式。
  • @J...我不能比“你能给我一个通用的方法来理解时钟周期是如何计算的”更具体。是否有其他网站更容易接受此类问题?
  • @NeatMonster 我认为这个问题没有一个通用的答案——我认为每条指令都有自己的故事要讲,每条指令都需要对 CPU 架构进行微观分析。考虑到 800 多页的 CPU 手册没有充分回答问题 - 这意味着一个非常深刻的问题,在短短的几段中不容易回答。例如,下一个合适的问题可能是“为什么 8086 MOV 需要 8 个周期来处理 r,m 而需要 9 个循环来处理 m,r?”。它简明扼要,可以回答,并且可能会让您更接近更大问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多