• 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

    1. 根据跳转地址的BIT0切换为ARMThumb状态(0ARM状态,1Thumb状态)
    • B直接跳转,跳转后就啥也不管了,也不管返回;BL跳转前把返回地址保存再LR寄存器中,以后返不返回有对方程序决定,如果向返回就返回到LR所指示的地址去
    • BX/BLX是变种,用于切换不同的指令集ARM/Thumb;其跳转地址的bit0决定是ARM/Thumb指令集
    • image.png
    • 跳转除了B/BL指令外,直接对PC赋值也可以跳转

      MOV PC, LR //将链接地址赋值给PC,返回 LDR PC,=0X20000 //直接赋值PC LDR PC, Function_test //也可以将标签直接赋给PC

    • 注意MOV/LDR直接对PC赋值的操作是不会影响(设置)LR寄存器的,所以要保存返回地址的话,需要在程序中赋值PC前自行指定保存

      1. ADR LR, Ret ; 伪指令,读取Ret标号的地址赋给LR,这是返回地址
      2. ADR PC, Delay ; 伪指令,读取Delay标号的地址赋给PC,直接跳转
      3. Ret
      4. MOV R1, #1
      5. Delay
      6. MOV R0, #1000
      7. Loop
      8. SUBS R0, R0, #1
      9. BNE Loop
      10. MOV PC, LR ; LR赋给PC,返回