- C语言中,函数A调用函数B的实质是什么?
- 实质是:跳转去执行函数B的代码,函数B执行完后还要返回到函数A继续执行后面的代码
- 对应的汇编指令就是跳转指令,跳转之前还得保存返回地址
B:Branch,跳转 BL:Branch with Link,跳转前先把返回地址保存在LR寄存器中
BX:Branch and eXchange,根据跳转地址的BIT0切换为ARM或Thumb状态(0:ARM状态,1:Thumb状态)
BLX:Branch with Link and eXchange
根据跳转地址的BIT0切换为ARM或Thumb状态(0:ARM状态,1:Thumb状态)
- B直接跳转,跳转后就啥也不管了,也不管返回;BL跳转前把返回地址保存再LR寄存器中,以后返不返回有对方程序决定,如果向返回就返回到LR所指示的地址去
- BX/BLX是变种,用于切换不同的指令集ARM/Thumb;其跳转地址的bit0决定是ARM/Thumb指令集
跳转除了B/BL指令外,直接对PC赋值也可以跳转
MOV PC, LR //将链接地址赋值给PC,返回 LDR PC,=0X20000 //直接赋值PC LDR PC, Function_test //也可以将标签直接赋给PC
注意MOV/LDR直接对PC赋值的操作是不会影响(设置)LR寄存器的,所以要保存返回地址的话,需要在程序中赋值PC前自行指定保存
ADR LR, Ret ; 伪指令,读取Ret标号的地址赋给LR,这是返回地址
ADR PC, Delay ; 伪指令,读取Delay标号的地址赋给PC,直接跳转
Ret
MOV R1, #1
Delay
MOV R0, #1000
Loop
SUBS R0, R0, #1
BNE Loop
MOV PC, LR ; 把LR赋给PC,返回