【问题标题】:Is it possible to modify or access Program counter?是否可以修改或访问程序计数器?
【发布时间】:2012-01-27 22:40:04
【问题描述】:

在阅读程序计数器时,我了解到程序计数器的特殊之处在于无法直接修改其值。

有没有间接的方式来访问/修改程序计数器的内容?

【问题讨论】:

  • 这么跳你能访问PC吗?
  • 你在说什么处理器? x86?米普斯?手臂? ...

标签: assembly embedded program-counter


【解决方案1】:

您必须了解,如果您修改 PC,则执行的下一条指令将是新 PC 地址处的指令。那就是简单的无条件跳转,所有处理器都有这样的指令。

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

在大多数情况下,也可以间接执行此操作,例如将堆栈指针设置为包含新地址的位置并调用 RET 返回指令。

不同的处理器和架构可能在很多方面表现不同,我上面建议的指令助记符是“通用的”,并不打算引用任何特定的指令集。

【讨论】:

  • +1。您可以添加 call 指令修改它,条件跳转也是如此。您可以执行jmp eax(跳转到EAX 指向的地址)和jmp [eax] 之类的操作来跳转到存储在EAX 指向的内存中的地址。 x86 上的int 指令很像call。修改程序计数器的方法很多。
  • @Jim:确实如此,但无条件跳转会修改 PC 并且没有其他作用。最终每条指令都可以修改 PC,即使它只是增加它。我试图成为非架构/指令集,而不是详细介绍寻址模式;我的 addr 参数旨在表示任何有效的地址表示或寻址模式,包括寄存器间接。 Amit 必须指定一个架构,他想要一个更具体的答案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2018-06-29
    • 2018-05-27
    • 1970-01-01
    相关资源
    最近更新 更多