arm64 blr指令

子程序调用 指令(BL和BLR) 执行BL的结果是, 将 PC寄存器值的下一个值(也就是PC+8)放到 返回地址(链接寄存器), 然后目的子程序的地址放到PC中。 BLR的结果 与 BL类似,但是 新的PC的值,从特定的寄存器取得 因为A64的Branch指令

<think>我们正在讨论ARM64架构下的无条件跳转指令。在ARM64(也称为AArch64)中,无条件跳转指令主要有两种:`B`(Branch)和`BR`(BranchtoRegister)。此外,还有用于函数调用的`BL`(BranchwithLink)和`BLR`(BranchwithLinktoRegister),它们会在跳转前将返回地址存储在链接寄存器(LR)中。###1.**`B`指令(Branch)**-**作用**:跳转到指定的目标地址(相对当前PC的偏移量)。-**语法**:`B<label>`-**特点**:-跳转范围较大(当前PC前后128MB)。-常用于循环、条件分支的无条件跳转部分以及函数内的跳转。####示例:```armasmBloop_start//无条件跳转到标签loop_start处```###2.**`BR`指令(BranchtoRegister)**-**作用**:跳转到寄存器中存储的地址。-**语法**:`BR<Xn>`-**特点**:-常用于间接跳转,如通过函数指针调用或跳转表实现switch语句。-目标地址由通用寄存器(如`X0`~`X30`)指定。####示例:```armasmBRX1//跳转到寄存器X1中存储的地址```###3.**`BL`和`BLR`指令(带链接的跳转)**虽然用户询问的是无条件跳转,但`BL`和`BLR`也属于无条件跳转,只是它们会保存返回地址(用于函数调用):-**`BL<label>`**:跳转到标签处的地址,并将返回地址(PC+4)存入LR寄存器。-**`BLR<Xn>`**:跳转到寄存器中的地址,并将返回地址存入LR。###4.**无条件跳转指令的特点**-**无延迟槽**:ARM64没有类似于MIPS的延迟槽(指令后立即执行跳转)。-**流水线友好**:现代ARM处理器通过分支预测优化无条件跳转。-**编码方式**:-`B`和`BL`使用26位有符号立即数(偏移量)编码,跳转范围$±128MB$[^1]。-`BR`和`BLR`使用寄存器操作数,可跳转到任意64位地址。###5.**应用场景**-**函数内跳转**(如`goto`或循环)→`B<label>`-**函数返回**→`RET`指令(实际是`BRLR`的别名)-**函数指针调用**→`BLR<Xn>`-**跳转表/switch语句**→使用`BR`跳转到表中的地址####示例:函数指针调用```c//C代码void(*func_ptr)(void)=...;func_ptr();//调用函数指针```对应的ARM64汇编:```armasmADRPX0,func_ptr//加载函数指针地址的高位部分LDRX0,[X0,#:lo12:func_ptr]//加载函数指针值到X0BLRX0//跳转到X0中的地址并保存返回地址到LR```###⚠️注意事项1.**跳转范围限制**:`B`指令的跳转范围有限($±128MB$),超出时需使用间接跳转(如`LDR`+`BR`)。2.**寄存器使用**:`BR`指令的目标寄存器必须为64位通用寄存器(X0-X30)。3.**特权级**:在用户模式下无法使用系统级跳转指令(如`ERET`)。>**扩展阅读**:ARM64还提供条件跳转指令(如`B.EQ`、`B.NE`),它们基于条件标志(NZCV)进行跳转,但用户询问的是无条件跳转,故不展开。§§相关问题§§1.ARM64中函数调用时如何传递参数?2.`RET`指令与`BRLR`有何区别?3.ARM64如何处理分支预测以提高跳转效率?[^1]:ARMArchitectureReferenceManualARMv8,forARMv8-Aarchitectureprofile</think>### ARM64 无条件跳转指令详解 在 ARM64 (AArch64) 架构中,无条件跳转主要通过以下指令实现: #### 1. **`B` 指令 (Branch)** ```armasm B <label> ``` - **作用**:直接跳转到指定标签处的地址 - **跳转范围**:当前指令位置 $±128MB$(26位有符号立即数偏移) - **示例**: ```armasm start: MOV X0, #1 B end // 无条件跳转到 end 标签 MOV X0, #2 // 此指令不会执行 end: RET ``` #### 2. **`BR` 指令 (Branch to Register)** ```armasm BR <Xn> ``` - **作用**:跳转到寄存器中的地址 - **用途**:实现函数指针调用、虚函数表跳转等动态跳转 - **示例**: ```armasm ADR X1, target_func // 将目标地址加载到 X1 BR X1 // 跳转到 X1 中的地址 ``` #### 3. **`BLR` 指令 (Branch with Link to Register)** ```armasm BLR <Xn> ``` - **作用**:跳转到寄存器地址,同时将返回地址(PC+4)存入 LR (X30) - **用途**:间接函数调用 - **示例**: ```armasm // 通过函数指针调用 LDR X0, [X1] // 加载函数指针到 X0 BLR X0 // 调用函数,返回地址存入 LR ``` #### 4. **`RET` 指令 (Return)** ```armasm RET {<Xn>} ``` - **作用**:从函数返回,默认使用 LR (X30) 作为返回地址 - **本质**:`RET` 是 `BR X30` 的别名指令 - **示例**: ```armasm my_function: // 函数体 RET // 等价于 BR X30 ``` #### 关键特性: 1. **无延迟槽**:ARM64 无条件跳转后**不会执行**紧随跳转指令后的指令(不同于 MIPS 架构) 2. **流水线优化**:现代 ARM64 处理器通过分支预测器优化无条件跳转性能[^1] 3. **链接寄存器**:X30 (LR) 专门用于存储函数返回地址 4. **指令编码**: - `B` 指令使用 26 位立即数偏移 - `BR/BLR` 使用寄存器操作数编码 #### 典型应用场景: 1. **函数调用/返回**: ```armasm caller: BL callee // 调用函数 (BL = Branch with Link) ... // 返回后继续执行 callee: ... // 函数体 RET // 返回调用者 ``` 2. **状态机跳转**: ```armasm state_machine: CMP X0, #1 B.EQ state1 // 条件跳转 B state2 // 无条件跳转到默认状态 ``` 3. **循环控制**: ```armasm loop_start: // 循环体 SUBS X0, X0, #1 B.NE loop_start // 条件循环 B loop_end // 循环结束跳转 ``` > **性能提示**:在热点路径中,优先使用相对跳转 `B <label>` 而非寄存器跳转 `BR`,前者具有更好的预测效率[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科技之光666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值