ARM程序计数器区别特征
ARM的R15与CPU的普通PC有何不同?ARM程序计数器区别特征,arm,intel,computer-architecture,Arm,Intel,Computer Architecture,ARM的R15与CPU的普通PC有何不同? 它们都只是程序计数器。区别是什么?ARM的PC更类似于常规寄存器,但有一些限制,而x86的IP更类似于常规寄存器 考虑到通用PC是基于Intel x86的CPU,在x86的情况下,您不能直接操作PC(指令指针),但它会通过提供的控制流指令进行隐式更新 在ARM的情况下,映射为索引15处寄存器(第16寄存器)的程序计数器(PC)可以通过算术指令直接操作。例如,您可以将16添加到PC,这将改变指令流的流,类似于16字节前向跳转指令。ARM PC可能比大多数
它们都只是程序计数器。区别是什么?ARM的PC更类似于常规寄存器,但有一些限制,而x86的IP更类似于常规寄存器 考虑到通用PC是基于Intel x86的CPU,在x86的情况下,您不能直接操作PC(指令指针),但它会通过提供的控制流指令进行隐式更新
在ARM的情况下,映射为索引15处寄存器(第16寄存器)的程序计数器(PC)可以通过算术指令直接操作。例如,您可以将16添加到PC,这将改变指令流的流,类似于16字节前向跳转指令。ARM PC可能比大多数CPU更像一个通用寄存器,但它仍然非常特殊。在许多情况下,传统的简单算术指令可以使用
PC
作为输入参数。在这里,它用作指针或数组基。它也可用作这些指令的控制传输输出。作为只读值,它对于以独立于PC的方式计算返回值非常有用。在近邻代码中用作常量表查找也很有用。对于这些情况,PC
非常类似于常规寄存器。这在许多RISC CPU上可能比CISC ISA更常见
然而,当PC被用作目的地(左值或更新和写入)时,这种行为通常是不标准的。R15/PC的一些特殊情况(对于某些ARM Architecture版本)示例如下:
-将adc
复制到SPSR
CPSR
-将添加
复制到SPSR
CPSR
-将ands
复制到SPSR
CPSR
-将bics
复制到SPSR
CPSR
-强烈反对或不支持bx r15
-不受支持clz r15
-不可预测mcr pXX,xx,r15,…
- 等等
PC
作为指令的目标会有一些特殊情况。特别是,可以使用S(通常用于设置条件代码)从异常返回。当从异常返回或直接返回时,这可以用作某种贴面。在某些情况下,指令的含义可能会完全改变。例如,ldmsp,{r0-r15}^
和ldmsp,{r0-r14}^
使用不同的寄存器组;第一个将根据SPSR中的模式加载寄存器;而第二个将把寄存器加载到用户模式
对于加载/存储、原子、模式操作、协处理器和复杂算术(64位乘法等)指令,
PC
通常不受支持或具有不同的含义;不同的含义通常是处理系统级代码异常的机制。@USC为了补充这个非常好的答案,它简化了指令集(因为跳转只是将添加到magic 15寄存器,而不是专门用于此目的的指令)。还有两件事使r15变得有趣。它总是比您预期的位置提前2条指令(这是最早的ARM内核的流水线设计的遗产),其底部的两位是特殊的。因为ARM指令自然地与4字节边界对齐,所以底部2位始终为零;因此,r15
的位0被借用来表示处理器是在Thumb模式还是ARM模式下运行。@Iwillnotexistidoxist您应该添加它作为答案,请这样做:)@Iwillnotexistidoxist Mitch Alsup(一位半退休的专业计算机架构师,曾在罗斯的SPARC、摩托罗拉的88k和AMD的x86上工作)赛义德:历史记录表明GPRs中的PC“过于统一”。其他一些示例包括bx rN
和blx label
,它们明确修改了R15
寄存器。LR
(R14)在ARM ISA中也有点特殊;每种模式都有不同的LR
。Thumb使SP
(R13)也是固有的。对于纯ARM,任何寄存器都可以是堆栈。