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

ARM64架构中ADRP指令Label的工作机制及计算疑问

ARM64 ADRP指令核心问题解答

什么是程序标签?

程序标签是汇编代码里用来标记特定内存地址的符号,比如某个函数的入口、全局变量的起始位置,或者代码段里的某个标记点。编译器/汇编器会把标签转换成对应地址与ADRP指令地址的相对偏移量;如果二进制文件丢失了符号表,反汇编工具就会把这个偏移量直接显示成数字(也就是你看到的13159)。

如何正确计算ADRP的寄存器存储值?

你之前的计算错误在于误解了偏移数字的含义——13159不是直接和指令地址相加的数值,而是页偏移的数量(每个页是4KB,即0x1000字节)。ADRP的核心逻辑是生成标签所在4KB页的地址,正确计算步骤如下:

  1. 取ADRP指令的地址:你的例子里是0x100595c74
  2. 计算指令所在的4KB页基地址:将指令地址的低12位清零(因为4KB对齐),用位运算实现:0x100595c74 & 0xFFFFF000 = 0x100595000
  3. 计算实际偏移量:把反汇编显示的数字(13159)左移12位(等价于乘以4096),得到13159 << 12 = 0x33AB000
  4. 页基地址加偏移量:0x100595000 + 0x33AB000 = 0x1038FC000,这就是最终存入x17寄存器的值,和你实际观察到的结果一致。

如何获取指令页地址?

指令页地址就是ADRP指令所在地址的4KB对齐地址,只需要把指令地址的低12位(二进制最后12位,对应十六进制最后3位)清零即可,用位运算表示为:指令地址 & 0xFFFFF000。比如你的例子中,指令地址0x100595c74经过运算后得到的指令页地址是0x100595000。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:42:24