bl - ShenYj/ShenYj.github.io GitHub Wiki

bl指令

带返回的跳转指令,一般用来在 ARM64汇编下调用函数时使用,在其他汇编下对应 callcallq(AT&T) 指令

BL 指令是另一个跳转指令(相对于 B 指令),但跳转之前,会在寄存器 R14 中保存 PC 的当前内容个,因此,可以通过将 R14 的内容重新加载到 PC 中,来返回到跳转指令之后的那个指令处执行,该指令是实现子程序调用的一个基本但常用的手段

格式:BL{条件} 目标地址

  • BL Label ; 当程序无条件跳转到标号 Label 处执行时,同时将当前的 PC 值;保存到 R14 中

BBL 在不写条件时,都是跳转到指定位置, 在使用 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中的地址返回原始函数的位置了

⚠️ **GitHub.com Fallback** ⚠️