21天学通Linux嵌入式开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.3 子程序呼叫及转移指令

Cortex-M3中,最基本的无条件转移指令有如下两条。

· B Label:转移到Label处对应的地址。

· BX reg:转移到由寄存器reg给出的地址。

在BX指令中,reg的最低位指示出在转移后,将进入的状态是ARM(LSB=0)还是Thumb(LSB=1)。而Cortex-M3只在Thumb中运行,因此就必须保证reg的LSB=1,否则出错。

在呼叫子程序时,如果需要保存返回地址,则可以使用如下指令。

· BL Label:转移到Label处对应的地址,并且把转移前的下条指令地址保存到LR。

· BLX reg:转移到由寄存器reg给出的地址,根据REG的LSB切换处理器状态,并且把转移前的下条指令地址保存到LR。

执行这些指令后,就把返回地址存储到LR(R14)中了,从而才能使用“BX LR”等形式返回。

使用BLX要小心,因为它还带有改变状态的功能。因此reg的LSB必须是1,以确保不会试图进入ARM状态。