关于ARM64架构下的bl和ret指令

本文介绍了ARM架构中BL与RET指令的基本作用及工作原理。BL指令用于保存返回地址并跳转,而RET指令则用于从子函数返回。通过实例演示了LR寄存器在调用过程中的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于bl和ret指令的作用

自己也在摸索学习的过程中,就简单的介绍下它们两个的作用吧,其实bl指令就是会将下一条指令的地址放入lr(x30)寄存器,以及跳转到后面的地址处。

具体过程如下所示
这里写图片描述

我们去关注下lr寄存器
这里写图片描述

进入sum函数,lr寄存器的值就改变了
这里写图片描述

当要去执行ret指令
这里写图片描述

成功跳转出来
这里写图片描述

为了去验证ret指令返回的就是地址就是根据lr寄存器来的,做以下的验证,去修改lr的寄存器的值
这里写图片描述

我们可以看到它又返回到了上面我们修改lr寄存器的位置
这里写图片描述

<think>好的,我现在需要回答用户关于arm64-v8a汇编中BL指令j_._ZdlPv的问题。首先,我要确保自己正确理解这两个概念,然后组织成清晰的中文解释。 首先,关于BL指令ARM架构中的BL是Branch with Link,也就是带链接的分支指令。它的主要作用是跳转到指定的目标地址执行,同时将返回地址(即下一条指令的地址)保存到链接寄存器LR(X30)中。这通常用于函数调用,调用函数后能正确返回到调用点。用户可能需要知道它的具体行为,比如如何保存返回地址,是否会影响其他寄存器,以及B指令的区别。比如,B指令只是单纯跳转,不会保存返回地址,而BL用于函数调用。另外,可能需要提到在ARM64中,函数调用通常使用BL,而返回则通过RET指令,使用LR中的地址。 接下来是j_._ZdlPv。这个看起来像是一个符号名称,可能是C++函数经过名称修饰后的形式。我需要分解这个符号。C++的名称修饰(name mangling)会根据函数名、参数类型、命名空间等生成唯一的符号。比如,_Z开头,后面跟着长度名称。_ZdlPv可能是operator delete(void*),因为dlPv分解的话,dl可能代表delete,Pv是void*的类型编码。所以,j_可能是跳转标签的前缀,比如跳转到operator delete函数。在汇编中,j_可能表示这是一个跳转目标,或者是一个外部函数引用,比如通过PLT(过程链接表)进行动态链接。 可能需要验证这个符号对应的C++函数。例如,使用c++filt工具来解析名称修饰后的符号。例如,运行c++filt _ZdlPv,应该会得到operator delete(void*)。这样,j_._ZdlPv可能是一个跳转到该函数的标签或外部符号引用,用于在汇编中调用operator delete。 现在需要确认这些信息是否正确。例如,BL指令是否在ARM64中确实使用X30作为LR,以及C++的名称修饰规则是否符合。例如,operator delete的参数类型是否正确,是否对应的符号是_ZdlPv。比如,对于void operator delete(void* ptr),名称修饰后确实是_ZdlPv。而前面的j_可能是本地标签或跳转标记,具体取决于上下文,比如在反汇编代码中可能表示跳转目标,或者链接时的重定位条目。 用户可能是在查看反汇编代码时遇到了这些指令,比如在分析二进制文件或调试时。需要解释清楚这两个部分的作用:BL用于调用函数,而j_._ZdlPv是被调用的函数,即释放内存的delete操作符。 另外,可能需要提到,在动态链接的情况下,BL可能会跳转到PLT条目,而PLT会处理动态链接库中的函数地址解析。例如,调用标准库中的operator delete时,汇编代码中的BL指令会跳转到对应的PLT条目,进而调用真正的函数。 最后,需要组织这些信息,分点解释BL指令j_._ZdlPv,确保语言准确且易于理解。同时,生成相关问题,帮助用户进一步了解相关主题,比如BLRET的配合,名称修饰的其他例子,或者ARM64的其他分支指令。</think>### ARM64-v8a BL指令详解 **BL指令**(Branch with Link)是ARM64架构中的**带链接分支指令**,主要作用为: 1. 跳转到指定目标地址执行子程序 2. 将返回地址(当前指令地址+4)保存到**链接寄存器X30**(LR) 3. 常用于函数调用场景,例如:`BL printf` 会跳转到printf函数并保存返回地址 典型特征: - 支持最大±128MB的跳转范围 - 与RET指令配合实现函数返回机制:`RET X30` 从LR恢复PC - 区别于普通B指令:B只跳转不保存返回地址 ### j_._ZdlPv符号解析 这是C++名称修饰(Name Mangling)后的符号,通过`c++filt`工具解析可得: ```bash $ c++filt _ZdlPv operator delete(void*) ``` 该符号表示: 1. 标准库中的内存释放函数 2. 对应C++代码:`void operator delete(void* ptr)` 3. 在汇编中通常通过PLT(过程链接表)进行动态链接调用 ### 典型使用场景 ```armasm ; 调用delete操作符的示例 ADRP X0, [heap_ptr] ; 加载堆指针地址 LDR X0, [X0] ; 获取指针值 BL j_._ZdlPv ; 调用operator delete ``` 此处BL指令会: 1. 跳转到`operator delete`的实现 2. 通过X0寄存器传递第一个参数(要释放的内存指针) 3. 执行完成后通过X30保存的地址返回到调用点[^1]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值