Cortex-M3中,最基本的无条件转移指令有如下两条。
● B Label:转移到 Label 处对应的地址。
● BX reg:转移到由寄存器 reg 给出的地址。
在BX指令中,reg的最低位指示出在转移后,将进入的状态是ARM(LSB=0)还是Thumb (LSB=1)。而Cortex-M3只在Thumb中运行,因此就必须保证reg的LSB=1,否则出错。
在呼叫子程序时,如果需要保存返回地址,则可以使用如下指令。
● BLLabel:转移到 Label 处对应的地址,并且把转移前的下条指令地址保存到 LR。
● BLX reg:转移到由寄存器 reg 给出的地址,根据 REG 的 LSB 切换处理器状态,并且把转移前的下条指令地址保存到LR。
执行这些指令后,就把返回地址存储到LR(R14)中了,从而才能使用“BX LR”等形式返回。
使用BLX要小心,因为它还带有改变状态的功能。因此reg的LSB必须是1,以确保不会试图进入ARM状态。