我正在阅读英特尔微处理器第8版.我发现了以下文字:

编程模型
8086到Core2的编程模型被认为是程序可见的,因为它的寄存器在应用程序编程期间使用并由指令指定.本章后面详述的其他寄存器被认为是程序不可见的,因为它们在应用程序编程期间不能直接寻址,但可以在系统编程期间间接使用.
这使得人们认为8086和8088中的所有指令都是程序可见寄存器,包括指令指针.是这样吗?
你不能直接触摸指令指针,但如果你需要一个简单的技巧,你可以得到它:
fetch_eip: mov eax, [esp]
ret
Run Code Online (Sandbox Code Playgroud)
然后:
call fetch_eip
Run Code Online (Sandbox Code Playgroud)
这将把eip指令指针的值放入eax(因为它将esp是你调用时堆栈指针所引用的内容fetch_eip).
eip成为一个mov操作的目的地是无效的,所以你不能eip直接操纵.影响它的唯一方法是使用跳转操作,调用操作(由此技巧利用)以及其他一些有限的情况.