关于adr指令的理解
好的,我们来详细解释一下 ADR 指令(在 ARM 架构中最常见):
核心概念
ADR 指令的核心作用是:将相对于当前程序计数器值的标签(地址)加载到寄存器中。
关键点详解
-
相对寻址:
- 它计算的目标地址是基于当前
PC值加上或减去一个偏移量得到的。 - 它不直接加载一个绝对的物理地址或虚拟地址(像
LDR Rd, =label那样)。
- 它计算的目标地址是基于当前
-
加载标签地址:
- 它的操作数通常是一个符号(标签),这个标签代表代码段或数据段中的某个位置。
- 例如:
ADR x0, my_label表示将符号my_label所在内存位置的地址加载到寄存器x0中。
-
基于 PC (Program Counter):
- 指令内部隐含地使用了当前
PC寄存器的值作为计算的基准点。 - 编译器/汇编器在生成机器码时,会计算标签所在地址与
ADR指令所在地址之间的偏移量。
- 指令内部隐含地使用了当前
-
位置无关代码:
- 这是
ADR指令最大的优势。由于加载的地址是相对于PC计算的,只要这段代码和my_label标签所代表的内容之间的相对位置没有改变,那么无论整个程序块被加载到内存中的哪个位置(地址),ADR指令都能正确地计算出my_label的地址。这在动态链接库、可重定位代码、PIC 等场景中至关重要。
- 这是
-
范围有限:
ADR指令的偏移量编码在指令位宽内,通常范围较小。- AArch64:
ADR Rd, label:偏移量范围是±1MB(-1048575 到 1048575 字节)。
- AArch32 (Thumb):
ADR Rd, label:偏移量范围较小,通常是±4095字节(具体取决于模式)。
- 如果标签超出了这个范围,汇编器会报错。此时需要使用
ADRP+ADD或LDR(绝对加载)等替代方案。
-
生成有效地址:
ADR执行的结果是将计算得到的地址值存入目标寄存器Rd。它不会读取该地址处的内存内容。要读取内容,需要后续使用LDR、STR等其他内存访问指令。LDR x1, [x0]:读取寄存器x0中地址指向的内存内容到x1。
-
效率:
- 通常比
LDR Rd, =label更高效。因为ADR是一条直接计算地址的指令(通常单周期),而LDR Rd, =label会在内存中创建一个地址池(literal pool),然后通过一条LDR指令去加载这个绝对地址(多一次内存访问)。
- 通常比
与相关指令的对比
ADRP:- 用于加载标签所在内存页(Page)的基地址。它将
PC和标签地址的高位部分对齐到 4KB 页的边界,然后加载这个基地址到寄存器。之后通常配合ADD或LDR/STR的立即数偏移来访问页内的具体地址。 - 范围更大,达到
±4GB(相对 ±4GB 对齐到 4KB 页边界)。
- 用于加载标签所在内存页(Page)的基地址。它将
LDR Rd, =label:- 这是伪指令(在汇编层面用
LDR表示,但汇编器处理方式不同)。汇编器会在内存中创建一个地址池(literal pool) 存放标签的 绝对地址值,然后生成一条真正的LDR指令去从池中加载这个绝对地址。 - 可以加载任意地址(范围只受地址池位置限制),但非位置无关(代码移动到不同地址后,地址池的值不变,指向错误位置)。效率通常低于
ADR(需要内存访问)。
- 这是伪指令(在汇编层面用
LDR Rd, [PC, #offset]:- 这是
ADR实现的一种低级形式(在 AArch32 常见)。ADR本质上会被汇编器编译成这种形式(或等效指令),在 AArch64 中是独立的编码。
- 这是
使用场景示例
.section .text
_start:
...
ADR x0, message // 将字符串 "Hello World!" 的地址加载到 x0 (位置无关!)
BL puts // 调用打印函数(puts),参数地址在 x0
...
B .
.section .data
message:
.asciz "Hello World!"
总结
ADR 指令是一个高效且实用的指令,用于在位置无关代码中安全且正确地加载相对较近的标签地址到寄存器。理解其基于 PC 的相对寻址特性、有限的范围以及与非位置无关指令(如 LDR Rd, =label)的区别至关重要。在需要加载附近地址的场景(如访问函数内部标签、局部的静态数据)时,它是首选。
ADR1001 adi
电子发烧友网为你提供ADI(ADI)ADR1001相关产品参数、数据手册,更有ADR1001的引脚图、接线图、封装手册、中文资料、英文资料,ADR
求助,关于ADR4550输出电压的疑问求解
我采用ADR4550做为18位SAR ADC的参考电压,数据手册中描述ADR4550的输入电压范围为5.1~15V,我采用7V供电,但ADR45
ADR4520/ADR4525/ADR4530/ADR4533/ADR4540/ADR4550低噪声基准电压源
电子发烧友网站提供《ADR4520/ADR4525/ADR4530/ADR
资料下载
刘洋
2023-11-22 15:06:21
ADR525/ADR530/ADR550:高分流时尚Voltage参考数据Sheet
ADR525/ADR530/ADR550:高分流时尚Voltage参考数据Sheet
资料下载
王毅山
2021-05-27 19:19:01
ADR3525/ADR3530/ADR3533/ADR3540/ADR3550:微功耗、高精度基准电压表
ADR3525/ADR3530/ADR3533/ADR3540/
资料下载
李伟
2021-05-13 20:45:52
采用DFN8封装的1A线性充电芯片HM4051ADR
M4051ADR是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。其底部带有散热片的DFN8封装与较少的外部元件数目使得HM4051ADR成为便携式应用的理想HM4051
资料下载
h1654156040.5061
2021-03-13 10:27:22
关于ADR423输出电流问题求解
ADR423的数据手册上显示高输出电流为10mA,但是实际中用5V供电,实测输出电流只有2mA左右,再增加电流参考电压就降低到了1.6V,这是为什么?
ADR3625/ADR3630/ADR3650: Precision, Micropower, High Current Output Voltage References Data Sheet ADR3625/ADR3630/ADR3650: Precision, Microp
电子发烧友网为你提供ADI(ADI)ADR3625/ADR3630/ADR3650: Precision, Micropower, High C
关于sleep指令的详细说明
之前一直没有真正理解sleep指令,最近在做智能水表的产品的时候,用了一款8位的单片机PIC16F690,当看到程序中的sleep指令时以为执行
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览