当8086/8088执行WAIT指令时,整个处理器是空闲还是欧盟?英特尔iAPX 86/88用户手册(1981,第218页)并未指定BIU是否也停止预取。
答案 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 之外从不显示任何其他内容。