我不知道bx lr的作用是什么,它与bl (label)有什么不同,我知道bl (label)将函数的返回地址存储在链接寄存器中,但我不知道bx lr的作用是什么。
bx lr
bl (label)
bn31dyow1#
它几乎总是从一个函数返回,比如其他一些ISA(如AArch64)中的ret。bx代表branch and exchange instruction set,这意味着根据要分支到的地址的lsb(最低有效位),处理器将把下一条指令视为ARM或Thumb。由于lr通常保存返回地址,这意味着这是一个函数的返回,如果lr的lsb为1,它会将该地址的代码视为thumb,否则,它会将其视为ARM。
ret
bx
lr
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来:
1 ARM在指令名称中使用术语 exchanges 来表示改变执行状态。不幸的是,这会造成混淆。两个指令集并没有进行 * exchanges *,就像列车从一组轨道切换到另一组轨道一样。
2条答案
按热度按时间bn31dyow1#
它几乎总是从一个函数返回,比如其他一些ISA(如AArch64)中的
ret
。bx
代表branch and exchange instruction set,这意味着根据要分支到的地址的lsb(最低有效位),处理器将把下一条指令视为ARM或Thumb。由于
lr
通常保存返回地址,这意味着这是一个函数的返回,如果lr
的lsb为1,它会将该地址的代码视为thumb,否则,它会将其视为ARM。w6lpcovy2#
简而言之,有些ARM处理器可以执行ARM或Thumb指令集,并在代码密度和性能之间进行权衡。BX是一种特殊形式的分支指令,能够在这两种指令集之间进行切换1。
它通过检测分支地址处的指令集(ARM或Thumb)来实现这一点。如果它与当前的指令集不同,它会在分支到该地址之前将处理器切换到它。
在目标地址检测指令集并不神奇或复杂。
ARM指令集是字对齐的,这意味着最低两位0和1被忽略,因为它们引用地址的半字和字节部分。同样,Thumb指令集是半字对齐的,这意味着位0被忽略,因为它引用地址的字节部分。
由于在这两种情况下都忽略位0,因此利用它可以轻松确定某个地址的代码是包含ARM代码还是Thumb代码。BX使用位0来:
1 ARM在指令名称中使用术语 exchanges 来表示改变执行状态。不幸的是,这会造成混淆。两个指令集并没有进行 * exchanges *,就像列车从一组轨道切换到另一组轨道一样。