【发布时间】:2021-08-24 09:23:42
【问题描述】:
我有一条指令: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。
【问题讨论】:
-
您在计算过程中忘记了 DS 段基地址。此外,8086 几乎可以肯定有一些内部 tmp 存储,它的微码可以使用它来存储 RMW 指令的地址计算结果。它不像 MIPS 那样完全流水线化! (但是 IIRC,你说得对,它使用 ALU 进行地址计算,没有专用的 AGU)。从理论上讲,没有什么能阻止它重新计算地址,但保留地址比保留原始指令字节要明智得多。
-
@PeterCordes 感谢您的回答,您说得对,我忘记了 DS 段。我还有一个问题:内部 tmp 存储在哪里?它在 ALU 中吗?
-
不,我不希望它在 ALU 本身中,让 ALU 也成为寄存器文件是没有意义的。用更具体的猜测更新了我的答案。
-
顺便说一句,如果您对 original-8086 微架构细节(或使用它的系统)有进一步的问答,您最有可能在 retrocomputing.stackexchange.com 上获得详细答案。我只是用手挥动了一些猜测,但如果那里的一些常客真的知道,我也不会感到惊讶,并且还能够确认或纠正您的猜测,即在获取操作码和 modrm 之后指令执行开始,甚至在完整指令之前完全获取。这不是现代 x86 的工作方式,但对于标量微编码 8086 来说听起来似乎是合理的。
标签: assembly cpu-architecture x86-16 microprocessors micro-architecture