JMP指令如何影响8086的工作?

时间:2019-07-19 15:43:37

标签: x86 cpu-architecture x86-16 machine-language

我知道8086具有BIU和EU,这有助于流水线处理处理器。 BIU有一个6字节的预取队列,该队列取指令指针指向的地址后面的字节。现在,当要执行的指令变成对另一位置的跳转指令时,所有预取的6个字节会发生什么?它们会被冲洗然后重新加载吗? (那会破坏处理器的流水线效率吗?)

1 个答案:

答案 0 :(得分:3)

是的,跳转丢弃了8086中的指令预取队列,并且以后的微体系结构工作类似。任何控制传输后的指令提取均始于空缓冲区。

对于JIT /自修改代码,这意味着任何跳转都足以避免获取过时的指令。

  

它们会冲洗然后重新装入吗?   那破坏了处理器的流水线效率吗?

除非是jmp +0 nop,否则缓冲区中的指令来自错误的路径。因此,它们不会被 re 加载;它们没用,必须加载正确的路径。

那不是很好,而且是跳跃的额外费用。 这就是为什么像Pentium这样的后来有序CPU都具有分支预测的原因,因此它们可以在跳转甚至解码之前就从正确的路径中获取。(分支预测需要预测存在的分支,例如给定一个提取块地址,可以预测下一个要提取的块,以及预测条件分支的发展方式。)

8086并不是5级RISC的有效管道。

无论如何,指令获取通常是8086上的主要瓶颈,因此在大多数跳转中,缓冲区通常可能并不满。您最多只会损失6个字节(3个字的读取)浪费的预取工作,并且可能更少。 (这就是为什么在8086上优化速度在很大程度上是针对代码大小进行了优化,除了避免了一些诸如乘法之类的慢指令。这就是为什么x86的紧凑型可变长指令是8086的理想设计。)

我不知道跳转解码/执行所花的时间,但跳转长度为2或3个字节(在x86-16中),对于使用opcode + modrm + disp16 +可选的间接跳转,甚至为4+前缀。刚刚执行的跳转指令可能会使8086上的预取缓冲区接近于空。


在纸上,x86 ISA至少通常要求使用诸如iretcpuid之类的序列化指令,以避免产生过时指令的风险。但是为了避免破坏现有代码,没有真正的x86 CPU会比跳转 1

具有分支预测和推测性执行功能(例如P6-系列)的现代OoO x86 CPU不需要任何东西。他们积极地监听管道,以检测与飞行指令重叠的存储。 Observing stale instruction fetching on x86 with self-modifying code


脚注1:多年来,在x86上经常出现超越纸张规格以保持与广泛使用的软件的兼容性的现象。真正的向后兼容和二进制兼容性基本上是x86与更清洁的RISC ISA的主要卖点,直到x86变得如此占主导地位,以至于其他ISA放弃了针对大功率/高性能市场的打算。 (由于晶体管预算的增长和聪明的设计思想,使得有可能支付“ x86税”并且仍然可以快速运行。

对于无法运行现有版本的DOS,Windows,Lotus Notes或任何其他版本的新型更快的CPU,市场将产生巨大阻力。