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

时间:2012-02-02 15:08:45

标签: architecture x86

我正在阅读英特尔微处理器第8版。我看到了以下文字:

enter image description here

  

编程模型

     

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

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

2 个答案:

答案 0 :(得分:6)

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

fetch_eip: mov eax, [esp]
           ret

然后:

call fetch_eip

这会将指令指针eip的值放入eax(因为当你调用{{1}时,它将是堆栈指针esp引用的任何内容}})。

fetch_eip作为eip操作的目的地是无效的,因此您无法直接使用mov。影响它的唯一方法是使用跳转操作,调用操作(被这个技巧利用)以及其他一些有限的情况。

答案 1 :(得分:1)

指令指针是一个专用寄存器,请参阅本文以获取所有8086寄存器的列表:Inside the 8086 Central Processor Unit (CPU)

通常,IP没有理由“程序可见”。它的值会受到使用影响控制流的任何指令的代码的影响,例如calljmp。不应要求IP的实际价值。