x86上的零更改跳转是否清除了指令预取队列?

时间:2017-04-05 21:05:59

标签: assembly x86

在x86上,有人可以确认,零位移跳跃(即不会改变CS或IP值的跳转)是否会清除指令预取队列?

1 个答案:

答案 0 :(得分:7)

跳转到本来会执行的下一个语句会清除任何具有一个的Intel x86 CPU上的指令预取队列。在自修改代码中这样做是很常见的,以确保实际执行修改后的代码。英特尔甚至采用跳转作为手段来确保即使在现代CPU上也能正确执行自修改代码。

来自Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3: System Programming Guide

  

8.1.3处理自我和交叉修改代码

     

...

     

随着处理器微体系结构变得更加复杂,并开始在退休之前推测性地执行代码   point(如在P6和更新的处理器系列中),关于应该执行哪些代码的规则,pre-或   修改后,变得模糊。编写自修改代码并确保它符合当前和   未来版本的IA-32架构,使用以下编码选项之一:

things = []
for path in cmds.ls(sl=1,l=1):
    n = node()
    n.path = path
    things.append(n)

(选项2是使用序列化指令而不是跳转,但早期的x86 CPU上不存在这些指令。)