⑴当8086指令队列空2字节时,BIU自动进行指令预取。
⑵EU总是从队列头取指令执行;若指令需通过总线操作访问其他部件(如内存、接口等),则请求BIU代为操作。BIU若处在空闲态则立即响应,否则在当前操作完成后响应。
⑶当指令队列已满, 正在执行中的指令也无总线操作请求,BIU就进入空闲状态。
⑷当执行流程转向指令时(如转移、调用指令等),队列中的后续指令可能不是转向目的处的指令(8086没有分支预测,只作顺序预取。如图4.1.4所示),这时BIU自动清空队列,到转向目的处重新取指令进入队列,这期间EU将无指令可执行。
8位机取指、读操作数、执行指令、写操作结果都是串行进行的。在8086中,指令的提取和执行是分别由总线接口部件和执行部件完成的,它们各行其责又相互配合。它们之间形成指令级的流水线,使得8086CPU可以在执行指令的同时进行读取指令的操作。 执行部件从指令队列中取得指令的过程是数据在CPU 内部寄存器之间传送的过程,所花费的时间远远小于总线访问的时间。一般情况下,EU可以不断地从指令队列中取得指令并执行指令, 与BIU从对存储器的访问并行执行。只有在遇到系统复位或执行转移指令等特殊情况,指令队列被刷新时,EU才需要等待BIU进行取指操作。或者在EU需要操作数而BIU正忙时, EU需要等待BIU执行完当前的操作,再去取操作数,等到EU得到操作数以后,才能进行这条指令的执行操作。
8086在执行指令的工作过程。因为在8086 CPU中,执行单元和总线接口单元是单独的,它们可以并行工作。当执行单元执行指令时,总线接口单元进行指令的预取。 当EU在执行第一条指令时,BIU进行总线操作预取下面的指令;EU执行完第一条指令后,BIU已经将第二、第三条指令都取到指令队列里了,EU不需要等待就可以继续执行第二条指令。 BIU在EU执行第二条指令的同时执行总线写周期来保存第一条指令的运算结果,并接着预取下一条指令,即第四条指令。由于第三条指令需要操作数, 因此EU在执行第三条指令之前等待BIU读取操作数,然后执行。 同样,在EU执行第三条指令的同时,BIU又开始预取下面的指令了。可以清楚地看出,由于8086实现了指令级的流水,因此使得系统的利用率大大提高。比起传统的串行执行方式,8086执行指令的速度大大加快。