一步一步写ARM汇编(二)

b与bl

b     无条件跳转,不考虑回来的问题

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指令

注3:进入子函数,通过栈保存返回地址+通用寄存器的值                                                                                                                                                                    


猜你喜欢

转载自blog.csdn.net/weixin_42048417/article/details/80587756