7. 分支指令¶
这些导致执行跳转到通常由标签指定的目标位置(参见 label
汇编指令)。条件分支和 it
和ite
指令测试应用程序状态寄存器 (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)
发出从子程序返回。对于嵌套子程序,在执行内部子程序调用之前,必须保存外部作用域的链接寄存器(通常在堆栈中)。