ARM64架构中ADRP指令Label的工作机制及计算疑问
ARM64 ADRP指令核心问题解答
什么是程序标签?
程序标签是汇编代码里用来标记特定内存地址的符号,比如某个函数的入口、全局变量的起始位置,或者代码段里的某个标记点。编译器/汇编器会把标签转换成对应地址与ADRP指令地址的相对偏移量;如果二进制文件丢失了符号表,反汇编工具就会把这个偏移量直接显示成数字(也就是你看到的13159)。
如何正确计算ADRP的寄存器存储值?
你之前的计算错误在于误解了偏移数字的含义——13159不是直接和指令地址相加的数值,而是页偏移的数量(每个页是4KB,即0x1000字节)。ADRP的核心逻辑是生成标签所在4KB页的地址,正确计算步骤如下:
- 取ADRP指令的地址:你的例子里是
0x100595c74 - 计算指令所在的4KB页基地址:将指令地址的低12位清零(因为4KB对齐),用位运算实现:
0x100595c74 & 0xFFFFF000 = 0x100595000 - 计算实际偏移量:把反汇编显示的数字(13159)左移12位(等价于乘以4096),得到
13159 << 12 = 0x33AB000 - 页基地址加偏移量:
0x100595000 + 0x33AB000 = 0x1038FC000,这就是最终存入x17寄存器的值,和你实际观察到的结果一致。
如何获取指令页地址?
指令页地址就是ADRP指令所在地址的4KB对齐地址,只需要把指令地址的低12位(二进制最后12位,对应十六进制最后3位)清零即可,用位运算表示为:指令地址 & 0xFFFFF000。比如你的例子中,指令地址0x100595c74经过运算后得到的指令页地址是0x100595000。
内容的提问来源于stack exchange,提问作者pilokenorse
相关产品推荐
相关产品推荐

