assembly bx lr在ARM汇编语言中做什么?

ih99xse1  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(301)

我不知道bx lr的作用是什么,它与bl (label)有什么不同,我知道bl (label)将函数的返回地址存储在链接寄存器中,但我不知道bx lr的作用是什么。

bn31dyow

bn31dyow1#

它几乎总是从一个函数返回,比如其他一些ISA(如AArch64)中的ret
bx代表branch and exchange instruction set,这意味着根据要分支到的地址的lsb(最低有效位),处理器将把下一条指令视为ARM或Thumb。
由于lr通常保存返回地址,这意味着这是一个函数的返回,如果lr的lsb为1,它会将该地址的代码视为thumb,否则,它会将其视为ARM。

w6lpcovy

w6lpcovy2#

简而言之,有些ARM处理器可以执行ARM或Thumb指令集,并在代码密度和性能之间进行权衡。BX是一种特殊形式的分支指令,能够在这两种指令集之间进行切换1。
它通过检测分支地址处的指令集(ARM或Thumb)来实现这一点。如果它与当前的指令集不同,它会在分支到该地址之前将处理器切换到它。

.global _main                 ; our main code is ARM
   
_main:
    ADR   r2, .ThumbProg + 1  ; r2 now points to Thumb code address
    BX    r2                  ; BX detects its Thumb and switches
                              ; processor state to execute it
                              ; execute it.

在目标地址检测指令集并不神奇或复杂。
ARM指令集是字对齐的,这意味着最低两位0和1被忽略,因为它们引用地址的半字和字节部分。同样,Thumb指令集是半字对齐的,这意味着位0被忽略,因为它引用地址的字节部分。
由于在这两种情况下都忽略位0,因此利用它可以轻松确定某个地址的代码是包含ARM代码还是Thumb代码。BX使用位0来:

  • 如果Thumb状态被设置为1,则执行Thumb状态下的分支地址
  • 如果分支地址设置为0,则在ARM状态下执行分支地址

1 ARM在指令名称中使用术语 exchanges 来表示改变执行状态。不幸的是,这会造成混淆。两个指令集并没有进行 * exchanges *,就像列车从一组轨道切换到另一组轨道一样。

相关问题