修改或访问程序计数器是否可能?

5

在阅读有关程序计数器的内容时,我了解到程序计数器是特殊的,因为没有直接修改其值的方法。

是否有间接访问/修改程序计数器内容的方法?


SO要跳,你能访问电脑吗? - Amit Singh Tomar
3
你在谈论哪种处理器?x86?MIPS?ARM?... - old_timer
2个回答

12

你必须理解,如果你修改了电脑,下一条执行的指令将是在新的PC地址上执行。这只是一个无条件跳转,所有的处理器都有这样的指令。

通常情况下没有LD PC,addr指令,但这正是JMP addr所做的,因此不正确的说法是你不能直接修改它的值。 但是你不能修改它的值而不修改代码的执行路径 - 执行将从指定的地址继续。

在大多数情况下,也可以通过间接方式进行修改,例如将堆栈指针设置为包含新地址的位置并调用RET返回指令。

不同的处理器和体系结构可能会以多种方式表现出不同的行为,我提供的指令助记符是“通用”的,不适用于任何特定的指令集。


+1. 你可以补充说明call指令和条件跳转也会修改程序计数器。你还可以使用jmp eax(跳转到EAX指向的地址)和jmp [eax](跳转到EAX指向的内存中存储的地址)。在x86上,int指令类似于call。有很多方法可以修改程序计数器。 - Jim Mischel
1
@Jim:没错,但无条件跳转只修改PC寄存器而不做其他任何事情。实际上,即使只是增加它,每个指令都可以修改PC寄存器。我试图避免特定于体系结构/指令集,并且不涉及寻址模式的详细信息;我的addr参数旨在表示任何有效的地址表示或寻址模式,包括寄存器间接寻址。如果Amit想要更具体的答案,他必须指定一个体系结构。 - Clifford

4
无条件跳转指令直接修改PC的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接