我正在阅读英特尔微处理器第8版。我看到了以下文字:
编程模型
8086到Core2的编程模型被认为是程序可见,因为它的寄存器在应用程序编程期间使用并由指令指定。本章后面详述的其他寄存器被认为是程序不可见,因为它们在应用程序编程期间不能直接寻址,但可以在系统编程期间间接使用。
这使人们认为8086和8088中的所有指令都是程序可见寄存器,包括指令指针。是这样吗?
答案 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没有理由“程序可见”。它的值会受到使用影响控制流的任何指令的代码的影响,例如call
或jmp
。不应要求IP的实际价值。