bl - ShenYj/ShenYj.github.io GitHub Wiki
带返回的跳转指令,一般用来在 ARM64汇编下调用函数时使用,在其他汇编下对应 call
、callq(AT&T)
指令
BL
指令是另一个跳转指令(相对于 B
指令),但跳转之前,会在寄存器 R14
中保存 PC
的当前内容个,因此,可以通过将 R14
的内容重新加载到 PC
中,来返回到跳转指令之后的那个指令处执行,该指令是实现子程序调用的一个基本但常用的手段
格式:BL{条件} 目标地址
-
BL Label
; 当程序无条件跳转到标号 Label 处执行时,同时将当前的 PC 值;保存到 R14 中
B
与BL
在不写条件时,都是跳转到指定位置, 在使用BL
时遇到ret
会返回到BL
的下一行代码继续执行,我们函数调用后接收函数返回值的进一步处理的本质就是通过BL
指令实现, 而B
指令是无法返回原始位置的
-
示例
_test: bl mycode mov x3, #0x2 mov x4, #0x1 ret _mycode: mov x0, #0x1 mov x1, #0x2 add x2, x0, x1 ret
在
bl
跳转执行完ret
后会返回到mov x3, #0x2
这行代码继续向下执行,与lr
寄存器有关 -
bl指令能够返回的本质
在使用 bl指令调用函数时,就会将 bl指令的下一行指令地址存入到 lr寄存器中,当bl进入函数执行完,遇到ret指令返回时,将lr寄存器的值赋给 pc寄存器,实现程序的转移,通过lr中的地址返回原始函数的位置了