本节介绍使用0b1111作为寄存器说明符和使用0b1101作为寄存器说明符的规则。
Thumb指令通常不允许将0b1111用作寄存器说明符。当允许寄存器的值为0b1111时,可能有多个含义。对于寄存器读操作,有如下含义。
(1)读取PC的值,当前指令的地址加4。某些指令不使用寄存器说明符而隐含读取PC值,如条件分支指令B<c>。
(2)读取字对齐的PC值,即当前指令的地址加4,将[1:0]位强制设置为0。这使得ADR和LDR(literal)指令可以使用PC相对数据寻址。这些指令的Armv6-M编码中隐含了寄存器说明符。
对于寄存器写操作,有如下含义。
(1)可以将PC指定为指令的目标寄存器。Thumb交互工作定义了是忽略地址的位[0],还是确定执行指令的状态。如果它在分支之后选择执行状态,则位[0]的值必须为1。
指令可以隐含写入PC,如B<cond>,也可以使用寄存器掩码而不是寄存器说明符(POP)来编写。要跳转的地址可以是加载的值(如POP)、寄存器的值(如BX)或计算结果(如ADD)。
(2)丢弃计算结果。在某些情况下,当一条指令是另一条更通用指令的特例时,会执行该操作,但结果会被丢弃。在这些情况下,指令列在不同的页面上,更通用的指令在伪代码中有一个特殊情况,它会交叉引用另一个页面。该方法不适用于ARMv6-M编码。
Thumb指令集中定义了R13,它主要用作堆栈指针,使R13与Arm架构过程调用标准(Arm Architecture Procedure Call Standard,AAPCS)(PUSH和POP指令支持的架构使用模型)保持一致。
1.R13<1:0>的定义
R13的位[1:0]看作应为0或保留(Should Be Zero or Preserved,SBZP),向位[1:0]写入非零的值会导致无法预料的行为。读取位[1:0]将返回0。
2.R13指令支持
Armv6-M中的R13指令支持仅限于以下情况。
(1)R12作为MOV(寄存器)指令的源或目标寄存器,如
(2)通过对齐的倍数向上或向下调整R13,如
(3)R13作为ADD(SP+寄存器)的第一个操作数<Rm>,其中,Rd不是SP。
(4)R13作为CMP(寄存器)指令中的第一个操作数<Rn>。CMP对于检查堆栈非常有用。
(5)R13作为POP或PUSH指令中的地址。
其限制如下。
(1)不推荐使用ADD(寄存器)和CMP(寄存器)的高寄存器形式,不建议使用R13作为Rd。
(2)ADD(SP+寄存器),其中Rd==13,且Rm没有字对齐。