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

Jam*_*gas 6 x86 assembly

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

Ros*_*dge 8

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

Intel 64和IA-32架构软件开发人员手册第3卷:系统编程指南:

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

...

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

(* OPTION 1 *)
Store modified code (as data) into code segment;
Jump to new code or an intermediate location;
Execute new code;
Run Code Online (Sandbox Code Playgroud)

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