指令指针是程序可见寄存器吗?

fud*_*din 4 architecture x86

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

在此输入图像描述

编程模型

8086到Core2的编程模型被认为是程序可见的,因为它的寄存器在应用程序编程期间使用并由指令指定.本章后面详述的其他寄存器被认为是程序不可见的,因为它们在应用程序编程期间不能直接寻址,但可以在系统编程期间间接使用.

这使得人们认为8086和8088中的所有指令都是程序可见寄存器,包括指令指针.是这样吗?

Joh*_*lla 6

你不能直接触摸指令指针,但如果你需要一个简单的技巧,你可以得到它:

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直接操纵.影响它的唯一方法是使用跳转操作,调用操作(由此技巧利用)以及其他一些有限的情况.

  • 值得注意的是,在x86-64上你可以*用`lea rax,[rip]`直接读取`rip`的值. (4认同)