【发布时间】:2012-01-27 22:40:04
【问题描述】:
在阅读程序计数器时,我了解到程序计数器的特殊之处在于无法直接修改其值。
有没有间接的方式来访问/修改程序计数器的内容?
【问题讨论】:
-
这么跳你能访问PC吗?
-
你在说什么处理器? x86?米普斯?手臂? ...
标签: assembly embedded program-counter
在阅读程序计数器时,我了解到程序计数器的特殊之处在于无法直接修改其值。
有没有间接的方式来访问/修改程序计数器的内容?
【问题讨论】:
标签: assembly embedded program-counter
您必须了解,如果您修改 PC,则执行的下一条指令将是新 PC 地址处的指令。那就是简单的无条件跳转,所有处理器都有这样的指令。
通常没有LD PC,addr 指令,但这正是JMP addr 所做的,所以不能直接修改它的值是不正确的。但是,您不能在不修改代码执行路径的情况下修改其值 - 从指定的地址继续执行。
在大多数情况下,也可以间接执行此操作,例如将堆栈指针设置为包含新地址的位置并调用 RET 返回指令。
不同的处理器和架构可能在很多方面表现不同,我上面建议的指令助记符是“通用的”,并不打算引用任何特定的指令集。
【讨论】:
call 指令修改它,条件跳转也是如此。您可以执行jmp eax(跳转到EAX 指向的地址)和jmp [eax] 之类的操作来跳转到存储在EAX 指向的内存中的地址。 x86 上的int 指令很像call。修改程序计数器的方法很多。
无条件跳转指令直接修改PC的值。
【讨论】: