语法:

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 - 图1

扩充:

我们经常会遇到目标地址后面有字母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