8088/8086 WAIT指令和BIU

时间:2017-04-26 02:11:42

标签: x86 x86-16

当8086/8088执行WAIT指令时,整个处理器是空闲还是欧盟?英特尔iAPX 86/88用户手册(1981,第218页)并未指定BIU是否也停止预取。

1 个答案:

答案 0 :(得分:1)

这里的回复有点晚,但我相信我已经确认它确实会继续预取。碰巧的是,我的一个朋友建造了一台定制的 8088 计算机,用于精确测试此类事情。它能够执行一个小程序,在每个时钟周期记录 CPU 引脚子集的状态,特别是它记录地址/数据总线、S0-S2 引脚和 QS0-QS1 引脚。

为了测试这个特定情况,我们只是在复位向量处放置了一个 JMP,在跳转目标处放置了一个 WAIT 指令。这样,当 WAIT 执行时,预取队列将为空,之后在总线上看到的任何提取都表明 BIU 在 WAIT 期间保持预取。

完整的日志如下所示:

Cycle: 0000  Address(/data): 0xfb0bf  S:  PASS  QS: 00 (070fb0bf)
Cycle: 0001  Address(/data): 0xfb0bf  S:  PASS  QS: 00 (070fb0bf)
Cycle: 0002  Address(/data): 0xfb0bf  S:  PASS  QS: 00 (070fb0bf)
Cycle: 0003  Address(/data): 0xfb0bf  S:  PASS  QS: 00 (070fb0bf)
Cycle: 0004  Address(/data): 0xfb0bf  S:  PASS  QS: 00 (070fb0bf)
Cycle: 0005  Address(/data): 0xff0bf  S:  PASS  QS: 10 (170ff0bf)
Cycle: 0006  Address(/data): 0xfb0bf  S:  PASS  QS: 00 (070fb0bf)
Cycle: 0007  Address(/data): 0xffff0  S: FETCH  QS: 00 (040ffff0)
Cycle: 0008  Address(/data): 0x2ffea  S: FETCH  QS: 00 (0402ffea)
Cycle: 0009  Address(/data): 0x2ffea  S:  PASS  QS: 00 (0702ffea)
Cycle: 0010  Address(/data): 0x2ffea  S:  PASS  QS: 00 (0702ffea)
Cycle: 0011  Address(/data): 0xffff1  S: FETCH  QS: 00 (040ffff1)
Cycle: 0012  Address(/data): 0x2ff5b  S: FETCH  QS: 01 (0c02ff5b)
Cycle: 0013  Address(/data): 0x2ff5b  S:  PASS  QS: 00 (0702ff5b)
Cycle: 0014  Address(/data): 0x2ff5b  S:  PASS  QS: 00 (0702ff5b)
Cycle: 0015  Address(/data): 0xffff2  S: FETCH  QS: 00 (040ffff2)
Cycle: 0016  Address(/data): 0x2ffe0  S: FETCH  QS: 11 (1c02ffe0)
Cycle: 0017  Address(/data): 0x2ffe0  S:  PASS  QS: 00 (0702ffe0)
Cycle: 0018  Address(/data): 0x2ffe0  S:  PASS  QS: 00 (0702ffe0)
Cycle: 0019  Address(/data): 0xffff3  S: FETCH  QS: 00 (040ffff3)
Cycle: 0020  Address(/data): 0x2ff00  S: FETCH  QS: 11 (1c02ff00)
Cycle: 0021  Address(/data): 0x2ff00  S:  PASS  QS: 00 (0702ff00)
Cycle: 0022  Address(/data): 0x2ff00  S:  PASS  QS: 00 (0702ff00)
Cycle: 0023  Address(/data): 0xffff4  S: FETCH  QS: 00 (040ffff4)
Cycle: 0024  Address(/data): 0x2fff0  S: FETCH  QS: 11 (1c02fff0)
Cycle: 0025  Address(/data): 0x2fff0  S:  PASS  QS: 00 (0702fff0)
Cycle: 0026  Address(/data): 0x2fff0  S:  PASS  QS: 00 (0702fff0)
Cycle: 0027  Address(/data): 0xffff5  S: FETCH  QS: 00 (040ffff5)
Cycle: 0028  Address(/data): 0x2ff30  S: FETCH  QS: 11 (1c02ff30)
Cycle: 0029  Address(/data): 0x2ff30  S:  PASS  QS: 00 (0702ff30)
Cycle: 0030  Address(/data): 0x2ff30  S:  PASS  QS: 00 (0702ff30)
Cycle: 0031  Address(/data): 0x2ff30  S:  PASS  QS: 00 (0702ff30)
Cycle: 0032  Address(/data): 0x2ffb2  S:  PASS  QS: 00 (0702ffb2)
Cycle: 0033  Address(/data): 0x2ffba  S:  PASS  QS: 10 (1702ffba)
Cycle: 0034  Address(/data): 0x2ffff  S:  PASS  QS: 00 (0702ffff)
Cycle: 0035  Address(/data): 0xfe05b  S: FETCH  QS: 00 (040fe05b)
Cycle: 0036  Address(/data): 0x2e09b  S: FETCH  QS: 00 (0402e09b)
Cycle: 0037  Address(/data): 0x2e09b  S:  PASS  QS: 00 (0702e09b)
Cycle: 0038  Address(/data): 0x2e09b  S:  PASS  QS: 00 (0702e09b)
Cycle: 0039  Address(/data): 0xfe05c  S: FETCH  QS: 00 (040fe05c)
Cycle: 0040  Address(/data): 0x2e012  S: FETCH  QS: 01 (0c02e012)
Cycle: 0041  Address(/data): 0x2e012  S:  PASS  QS: 00 (0702e012)
Cycle: 0042  Address(/data): 0x2e012  S:  PASS  QS: 00 (0702e012)
Cycle: 0043  Address(/data): 0xfe05d  S: FETCH  QS: 00 (040fe05d)
Cycle: 0044  Address(/data): 0x2e034  S: FETCH  QS: 00 (0402e034)
Cycle: 0045  Address(/data): 0x2e034  S:  PASS  QS: 00 (0702e034)
Cycle: 0046  Address(/data): 0x2e034  S:  PASS  QS: 00 (0702e034)
Cycle: 0047  Address(/data): 0xfe05e  S: FETCH  QS: 00 (040fe05e)
Cycle: 0048  Address(/data): 0x2e056  S: FETCH  QS: 00 (0402e056)
Cycle: 0049  Address(/data): 0x2e056  S:  PASS  QS: 00 (0702e056)
Cycle: 0050  Address(/data): 0x2e056  S:  PASS  QS: 00 (0702e056)
Cycle: 0051  Address(/data): 0xfe05f  S: FETCH  QS: 00 (040fe05f)
Cycle: 0052  Address(/data): 0x2e078  S: FETCH  QS: 00 (0402e078)
Cycle: 0053  Address(/data): 0x2e078  S:  PASS  QS: 00 (0702e078)
Cycle: 0054  Address(/data): 0x2e078  S:  PASS  QS: 00 (0702e078)
Cycle: 0055  Address(/data): 0x2e078  S:  PASS  QS: 00 (0702e078)
Cycle: 0056  Address(/data): 0x2e0f8  S:  PASS  QS: 00 (0702e0f8)
Cycle: 0057  Address(/data): 0x2e0f8  S:  PASS  QS: 00 (0702e0f8)
Cycle: 0058  Address(/data): 0x2e0f8  S:  PASS  QS: 00 (0702e0f8)
Cycle: 0059  Address(/data): 0x2e0fa  S:  PASS  QS: 00 (0702e0fa)
Cycle: 0060  Address(/data): 0x2e0fa  S:  PASS  QS: 00 (0702e0fa)
...
Cycle: 0255  Address(/data): 0x2e0fa  S:  PASS  QS: 00 (0702e0fa)

在第 7 个周期,我们可以看到复位向量 (0xffff0) 被放置在地址总线上,而在下一个周期,我们在数据总线上看到了 0xea (JMP)。跳转到 f000:e05b 是一个很长的跳转,所以之后我们会看到四个额外的提取,返回 5b、e0、00 和 f0。

在第 27 个周期我们可以看到,即使这是一个无条件跳转,cpu 从跳转后的指令中预取一个字节,在这种情况下为 0x30(XOR)。

从第 31 个周期开始,我们有一个完全被动的总线周期,因为正在处理 JMP,在第 33 个周期,我们得到队列状态 10,意思是“清空队列”。 所以此时预取队列被清空(XOR 被丢弃),在第 35 个周期我们从 0xfe05b 取并接收 0x9b,即等待。

而且,很明显,在此之后,我们可以在总线上看到 4 次提取,确认在 WAIT 期间预取仍在继续。应该注意的是,第 39 个周期的取指发生在等待执行之前。在第 40 个周期,我们看到队列状态 01(“来自队列的操作码的第一个字节”),这就是 WAIT 被送入 EU 的时间,但在此之后我们仍然看到另外三个提取。

最后我们可以确认 cpu 确实在等待测试引脚时卡住了,因为在第 51 个周期之后,总线上没有更多活动,并且 QS 除了 00 之外从不显示任何其他内容。