ARM的R15与CPU的通用PC有何不同? 它们都只是程序计数器。有什么区别?
答案 0 :(得分:4)
考虑到通用PC是基于Intel x86的CPU,在x86的情况下,您无法直接操作PC(指令指针),但它会被提供的控制流指令隐式更新。
在ARM的情况下,历史上程序计数器(PC),映射为索引15(第16个寄存器)的寄存器可以通过算术指令直接操作。例如,您可以向PC添加16,这将改变指令流的流程,类似于16字节的正向跳转指令。
答案 1 :(得分:1)
ARM PC可能比大多数CPU更像通用寄存器,但它仍然非常特殊。在许多情况下,传统的简单算术指令可以使用PC
作为输入参数。这里它充当指针或数组基础。它也可以用作这些指令的控制传输输出。作为只读值,它可用于以独立于PC的方式计算返回值。在近旁代码中用作常量表查找也很有用。对于这些情况,PC
非常像常规寄存器。这可能在许多RISC CPU上比在CISC ISA上更常见。
但是,当PC用作目标(左值或更新和写入)时,行为通常是非标准的。 R15 / PC的特殊情况(对于某些ARM架构版本)的一些示例是,
adcs
- 将SPSR
复制到CPSR
adds
- 将SPSR
复制到CPSR
ands
- 将SPSR
复制到CPSR
bics
- 将SPSR
复制到CPSR
bx r15
- 非常劝阻或不支持。clz r15
- 不受支持。mcr pXX, xx, r15,...
- 不可预测的在大多数情况下,使用PC
作为指令的目的地会有一些特殊情况。特别是,使用 S (通常设置条件代码)可以用于从异常中返回。从异常返回或直接返回时,这可能会被用作某种胶合代码。在某些情况下,指令的含义可能会完全改变。例如,ldm sp, {r0-r15}^
和ldm sp, {r0-r14}^
使用不同的寄存器库;第一种是根据SPSR中的模式加载寄存器;而第二个会将寄存器加载到用户模式。
对于加载/存储,原子,模式操作,协处理器和复杂算术(64位乘法等)指令,PC
通常不受支持或具有不同的含义;不同的含义通常是处理系统级代码异常的机制。