基于变址寻址方式的内存总和
Based Indexed Addressing Mode Memory Sum
我有一条指令: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 段基地址作为地址计算的一部分。
我有一条指令: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 段基地址作为地址计算的一部分。