You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AArch64架构BL指令跳转超过128MB会引发什么问题?

手册说明
分支指令  

B  

PC相对分支 ±128 MB

条件版本B.cond(后续介绍)的范围为±1 MB 

BL  

与B类似(分支范围±128 MB),但会将返回地址存储到LR(X30)中,表明这是一个函数调用

无条件版本
问题与解答

1. 为何将分支范围限制为±128MB?

AArch64的B和BL指令采用26位有符号立即数编码偏移量,而AArch64指令是4字节对齐的,所以这个偏移量需要左移2位。26位有符号数的范围是-2^25到2^25-1,左移2位后对应字节范围就是-2^27到2^27-4,刚好是±128MB。

这种设计是指令编码效率与实用场景的平衡:26位偏移量足以覆盖绝大多数常规程序的内部分支需求,同时不会占用过多指令编码位,保证指令集的紧凑性。如果要支持更大范围,就得占用更多编码位挤压其他指令的设计空间,或者需要额外指令序列实现长跳转,反而降低执行效率。

2. AArch64架构下BL指令跳转超过128MB时会出现什么问题?

首先在汇编阶段就会报错——因为无法用26位偏移量表示这么大的地址差,汇编器生成不了合法的BL机器码。

如果强行构造非法机器码让CPU执行,错误的偏移量会被加到PC上,导致跳转到错误地址,要么触发未定义指令异常,要么执行乱码,直接造成程序崩溃,行为完全不可控。

实际开发中遇到超过128MB的长跳转需求,需要用ADR/ADRP指令先把目标地址加载到寄存器,再用BLR指令通过寄存器跳转,这种方式支持全64位地址范围的函数调用。

内容的提问来源于stack exchange,提问作者huyubiao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:55:05