问题描述
我有一条指令:ADD [BX][SI] + 5FFDH,EABFH
,我想知道它是如何在 8086 微处理器上准确运行的。我已经意识到此指令 ADD [BX][SI] + 5FFDH,EABFH
以这种方式工作:
- 2 个字节的数据从数据总线到达并进入指令队列。
- 指令队列中可用的数据进入指令解码器。
- 另外 2 个字节的数据从数据总线到达并进入指令队列。
- BX 和 SI 值转到 ALU 并计算
BX + SI
- 另外 2 个字节的数据从数据总线到达并进入指令队列。
-
BX + SI
转到 ALU 的输入。 -
5FFDH
从指令队列中弹出并进入 ALU 的输入。 - ALU 计算
BX + SI + 5FFDH
。 -
BX + SI + 5FFDH
通过地址总线进入内存。 -
BX + SI + 5FFDH
的值来自内存并进入 ALU 的输入。 -
EABFH
从指令队列中弹出并进入 ALU 的输入。 -
[BX + SI + 5FFDH] + EABFH
通过 ALU 计算。 - ?????????????
所以我的问题是在第 13 步。微处理器如何知道内存地址 (BX + SI + 5FFDH
) 以根据空指令队列将 [BX + SI + 5FFDH] + EABFH
的值发送到内存而我们无法计算 BX + SI + 5FFDH
再次。
解决方法
8086 几乎肯定有一些内部 tmp 存储,它的微码可以用来存储 RMW 指令的地址计算结果。它并不像 MIPS 那样完全流水线化! (但是 IIRC,您是对的,它使用 ALU 进行地址计算,没有专用的 AGU)。
理论上没有什么能阻止它重新计算地址,但保留地址比保留原始指令字节更明智。
请记住,8086 是由微代码驱动的,有点像使用其内部资源实现 x86 的解释器。所以临时存储就像一个寄存器,而不是对 8086 指令可见的架构寄存器。
在这种情况下,人们可能会想象有一些数据访问电路将地址发送到总线接口单元,与代码获取竞争。数据端的某些地址寄存器可以简单地保存最后使用的数据地址是完全合理的,即使代码提取从中间的不同地址读取也是如此。
如果您真的对完整细节感到好奇,请查看 http://www.righto.com/2020/08/reverse-engineering-8086s.html(Ken Shirriff 的 博客)已经了解了微代码如何处理内存目标 ALU 指令。
顺便说一句,作为地址计算的一部分,您忘记了 DS 段基地址。