【发布时间】:2015-01-20 23:39:39
【问题描述】:
我似乎无法理解 bx lr 的作用以及它与 bl(标签)有何不同。我知道 bl (label) 将该函数的返回地址存储在链接寄存器中,但我不知道 bx lr 做了什么。
【问题讨论】:
我似乎无法理解 bx lr 的作用以及它与 bl(标签)有何不同。我知道 bl (label) 将该函数的返回地址存储在链接寄存器中,但我不知道 bx lr 做了什么。
【问题讨论】:
bx 代表branch and exchange instruction set,这意味着根据要跳转到的地址的 lsb(最低有效位),处理器会将下一条指令视为 ARM 或拇指。
由于lr通常持有返回地址,说明这是一个函数的返回,如果lr的lsb为1,则将该地址处的代码视为thumb,否则,它将将其视为 ARM。
【讨论】:
bx/blx 通话时根据要跳转到的地址是偶数还是奇数来确定接下来要切换到哪种模式(这会导致分别切换到ARM 或Thumb 模式)。跨度>
bl nameOfFunction 指令通常用于调用子例程。 bl 指令将下一条指令的地址和当前模式保存到链接寄存器(lr)中,然后跳转到请求的子程序。自然,当那个子程序要返回时,它通过跳转到lr中的地址就知道要返回到哪里,而且由于lr还保存了调用函数的模式,所以也可以恢复。完成这项工作的指令是bx。