购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.3 寄存器说明符的限制规则

本节介绍使用0b1111作为寄存器说明符和使用0b1101作为寄存器说明符的规则。

4.3.1 使用0b1111作为寄存器说明符的规则

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编码。

4.3.2 使用0b1101作为寄存器说明符的规则

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没有字对齐。 pCry2nH3ltkAa7swnMfqhNlahv2Z0Mg+Nd06IgN7DmTHJRPKkiohmtZixq5qH0v5

点击中间区域
呼出菜单
上一章
目录
下一章
×