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

Architecture 指令指针是程序可见寄存器吗?,architecture,x86,Architecture,X86,我在读英特尔微处理器第八版。我看到了以下文本: 编程模型 8086至Core2的编程模型被认为是程序可见的,因为其寄存器在应用程序编程期间使用,并由指令指定。本章后面详述的其他寄存器被认为是程序不可见的,因为它们在应用程序编程期间不可直接寻址,但在系统编程期间可间接使用 这就产生了一种想法,即8086和8088中的所有指令都是程序可见寄存器,包括指令指针。是这样吗?您不能直接触摸指令指针,但如果需要,您可以通过一个简单的技巧获得它: fetch_eip: mov eax, [esp]

我在读英特尔微处理器第八版。我看到了以下文本:

编程模型

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


这就产生了一种想法,即8086和8088中的所有指令都是程序可见寄存器,包括指令指针。是这样吗?

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

fetch_eip: mov eax, [esp]
           ret
然后:

这将把指令指针
eip
的值放入
eax
(因为它将是调用
fetch\u eip
时堆栈指针
esp
所引用的内容)


eip
作为
mov
操作的目标是无效的,因此您不能直接处理
eip
。影响它的唯一方法是跳转操作、调用操作(如此技巧所利用的)和其他一些有限的情况。

指令指针是一个专用寄存器,有关所有8086寄存器的列表,请参阅本文:


一般来说,IP没有理由“程序可见”。它的值将受到使用影响控制流的任何指令的代码的影响,例如
调用
jmp
。不需要IP的实际值。

值得注意的是,在x86-64上,您可以使用
lea-rax,[rip]
直接读取
rip
的值。
call fetch_eip