我有一条指令: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计算CCD_ 6
BX + SI + 5FFDH
通过地址总线进入存储器BX + SI + 5FFDH
的值来自内存并进入ALU的输入端EABFH
从指令队列弹出并进入ALU的输入- CCD_ 10通过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 Shirrif的博客(已经了解了微码如何处理存储器目标ALU指令。
顺便说一句,作为地址计算的一部分,您忘记了DS段的基本地址。