7. 分支指令

这些导致执行跳转到通常由标签指定的目标位置(参见 label 汇编指令)。条件分支和 itite指令测试应用程序状态寄存器 (APSR) N(负)、Z(零)、C(进位)和 V(溢出)标志以确定是否应执行分支。

大多数公开的汇编指令(包括移动操作)都会设置标志,但有明确的比较指令可以测试值。

在描述比较函数的部分中提供了有关条件标志含义的更多详细信息。

7.1. 文档约定

符号: Rm表示ARM寄存器R0-R15。LABEL 表示用 label()汇编指令定义的标签 。 <condition>表示以下条件说明符之一:

  • eq等于(结果为零)

  • ne 不等于

  • cs 携带套装

  • cc 随身携带

  • mi 减(负)

  • pl 加(正)

  • vs 溢出集

  • vc 溢出清除

  • hi >(无符号比较)

  • ls <= (无符号比较)

  • ge >= (有符号比较)

  • lt < (有符号比较)

  • gt > (有符号比较)

  • le <= (有符号比较)

7.2. Branch to label

  • b(LABEL)无条件分支

  • beq(LABEL) 分支如果相等

  • bne(LABEL) 分支如果不相等

  • bge(LABEL) 分支,如果大于或等于

  • bgt(LABEL) 分支,如果大于

  • blt(LABEL) 分支如果小于 (<)(有符号)

  • ble(LABEL) 分支,如果小于或等于 (<=)(有符号)

  • bcs(LABEL) 如果设置了进位标志,则

  • bcc(LABEL) 如果进位标志清除,则

  • bmi(LABEL)分支如果为负

  • bpl(LABEL) 分支如果为正

  • bvs(LABEL) 如果设置了溢出标志,则

  • bvc(LABEL)如果溢出标志清除,则

  • bhi(LABEL) 分支如果更高(无符号)

  • bls(LABEL) 分支如果小于或等于(无符号)

7.3. 长枝

上面列出的分支指令生成的代码使用固定位宽来指定分支目标,这是与 PC 相关的。因此,在分支指令远离其目标的长程序中,汇编器将产生“分支不在范围内”错误。这可以通过“宽”变体来克服,例如

  • beq_w(LABEL) 长分支如果相等

宽分支使用 4 个字节来编码指令(相比之下,标准分支指令使用 2 个字节)。

7.4. 子程序(函数)

当进入子程序时,处理器将返回地址存储在寄存器 r14 中,也称为链接寄存器 (lr)。通过从链接寄存器更新程序计数器(r15 或 pc)执行子程序调用后返回指令,该过程由以下指令处理。

  • bl(标签)

LABEL 返回地址存入链接寄存器(r14)后,将执行转移到指令。

  • bx(Rm) 跳转到 Rm 指定的地址。

通常bx(lr)发出从子程序返回。对于嵌套子程序,在执行内部子程序调用之前,必须保存外部作用域的链接寄存器(通常在堆栈中)。