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



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

跳转到无论如何都会执行的下一条语句,确实会清除任何具有指令预取队列的英特尔 x86 CPU 上的指令预取队列。在自修改代码中这样做是很常见的,以确保实际执行修改后的代码。英特尔甚至使用跳转进行记录,以确保即使在现代CPU上也能正确执行自我修改的代码。

摘自英特尔 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;

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

最新更新