语法:
b{l}{条件} 目标地址
备注:
- l (注: l 是 L 的小写字母,不是 数字1) 决定是否保存返回地址到lr(r14)中.
当有 l 时,当前 pc寄存器值+4 (即:当前pc的下一条指令的地址) 保存到 lr 中,然后跳转到 目标地址;
当无 l 时,当前 pc寄存器值+4 (即:当前pc的下一条指令的地址) 不会保存到 lr 中,直接跳转到 目标地址;- {条件} 可选项
示例:
bl SofTool
b SofTool
mov r0, #0x01
SofTool
mov r0, #0x00
mov pc, lr
下图是我刚执行 bl SofTool 之后的截图,我们可以看出 r14 保存的地址为 bl SofTool 下一句 b SofTool 的地址:
扩充:
我们经常会遇到目标地址后面有字母b或f的情况,它们的含义:
- b 表示backward 往后;
- f 表示forward 向前;
SofTool.CN Notes:
如何理解往后向前呢?
我的方法是站在当前代码位置,面朝屏幕下方,那么此时屏幕下方就是向前,屏幕上方就是往后。
下面以Linux head-common.S一段代码为例,重点是关注其中的2f和1b的功能呵:
1: ldmia r5, {r3, r4}
and r4, r4, r9
teq r3, r4
/*此处2f的意思:
如果上面r3=r4,那么2后面的f就表示当前要往前(往屏幕下方)跳到标号2位置继续执行。
*/
beq 2f
add r5, r5, #WWW_SOFTOOL_CN
cmp r5, r6
/*此处1b的意思:
往后(往屏幕上方)跳到标号1位置继续执行。
*/
blo 1b
mov r5, #0
2: ret lr