0

我有一条指令:ADD [BX][SI] + 5FFDH, EABFH我想知道它是如何在 8086 微处理器上运行的。我已经意识到这条指令ADD [BX][SI] + 5FFDH, EABFH以这种方式工作:

  1. 2 个字节的数据从数据总线到达并进入指令队列。
  2. 指令队列中可用的数据进入指令解码器。
  3. 另外 2 个字节的数据从数据总线到达并进入指令队列。
  4. BX 和 SI 值进入 ALU 并计算BX + SI
  5. 另外 2 个字节的数据从数据总线到达并进入指令队列。
  6. BX + SI转到 ALU 的输入。
  7. 5FFDH从指令队列中弹出并进入 ALU 的输入。
  8. ALU 计算BX + SI + 5FFDH
  9. BX + SI + 5FFDH通过地址总线进入内存。
  10. BX + SI + 5FFDH的值来自内存并进入 ALU 的输入。
  11. EABFH从指令队列中弹出并进入 ALU 的输入。
  12. [BX + SI + 5FFDH] + EABFH通过 ALU 计算。
  13. ??????????

所以我的问题是在第 13 步。微处理器如何知道内存地址 ( BX + SI + 5FFDH)[BX + SI + 5FFDH] + EABFH根据空指令队列将 的值发送到内存,我们无法BX + SI + 5FFDH再次计算。

4

1 回答 1

2

8086 几乎可以肯定有一些内部 tmp 存储,它的微码可以使用它来存储 RMW 指令的地址计算结果。它不像 MIPS 那样完全流水线化!(但是 IIRC,你是对的,它使用 ALU 进行地址计算,没有专用的 AGU)。

从理论上讲,没有什么能阻止它重新计算地址,但保留地址比保留原始指令字节要明智得多。

请记住,8086 是由微码驱动的,有点像使用其内部资源实现 x86 的解释器。因此,临时存储就像一个寄存器,而不是对 8086 指令可见的架构寄存器。

在这种情况下,人们可能会想象有一些数据访问电路将地址发送到总线接口单元,与代码获取竞争。完全合理的是,事物数据端的某些地址寄存器可以简单地保存使用的最后一个数据地址,即使代码提取从其间的不同地址读取也是如此。


如果您真的对全部细节感到好奇,请查看http://www.righto.com/2020/08/reverse-engineering-8086s.html(Ken Shirriff 的博客)是否了解微码如何处理内存目的地 ALU 指令。

顺便说一句,您忘记了 DS 段基地址作为地址计算的一部分。

于 2021-06-07T09:52:17.627 回答