b与bl
bl 在跳转时会把下一条指令的地址装载到lr寄存器中,以方便cpu最终能回来
示例:通过bl跳到func,通过b跳到over,通过调试查看lr值,示例代码如下,
area example,code,readonly
entry
start
;bl和b
mov r0,#0x1
bl func
mov r2,#0x3
b over
func
mov r1,#0x2
bx lr
over
b over
end
提高:程序在执行时,先跳到func1, 再跳到func2,再跳到func3,然后再返回主程序继续执行。示例代码如下,
area example,code,readonly
entry
start
mov r0,#0x1
bl func1
mov r0,#0x2
b over
func1
mov r1,lr
bl func2
mov r0,#0x3
mov pc,r1
func2
mov r2,lr
bl func3
mov r0,#0x04
mov pc,r2
func3
mov r0,#0x05
bx lr
over
b over
end
注1:bl指令的偏移量不是相对于正在执行的那条指令,而是相对于预取指令-三级流水线
注2:bl命令,最大寻址空间为±32M,访问其他内存通过ldr指令