adr指令
好的,关于 ARM 架构中的 adr 指令,以下是中文解释:
核心概念:
adr 指令(Address of Relative label)的作用是将一个相对于当前程序计数器(PC)的标签地址加载到目标寄存器中。
关键点解释:
- 计算相对地址:
adr不是从内存中加载一个绝对地址值,而是计算标签相对于当前正在执行的指令的位置(PC)的偏移量(通常是一个小的、有符号的立即数偏移)。 - 目标: 将这个计算得到的地址值存储到指定的寄存器中。
- 用途: 主要用于获取:
- 当前代码段内定义的局部标签(Label)的地址。
- 与当前指令位置相近(通常在 ±1MB 范围内)的数据或代码的地址。
- 效率: 因为它通常被汇编器翻译成一条类似于
add Rd, PC, #的指令(其中#是一个小的立即数偏移),所以它是一条单指令且高效的获取附近地址的方法。 - 范围限制:
adr能表示的地址偏移范围相对较小(具体范围取决于使用的 ARM 指令集版本和指令编码,例如在 AArch32 的 Thumb 模式下可能只有 ±255 字节,在 ARM 模式下或 AArch64 下会更大,如 ±1MB)。如果标签距离当前 PC 太远,汇编器会报错。 - 与
ldr的区别(重要!):adr Rd, label:计算 label 的地址(相对于PC),并将结果存入寄存器Rd。Rd中得到的是label本身的内存地址值。ldr Rd, =label:这是一个伪指令。汇编器会:- 如果
label的地址是一个可以用mov或mvn指令加载的小立即数,则生成mov Rd, #imm。 - 否则,汇编器会在附近创建一个文字池(Literal Pool),将
label的绝对地址存储在这个文字池中。然后生成一条ldr Rd, [PC, #offset]指令,从文字池中加载那个绝对地址值到寄存器Rd。所以ldr =最终加载的是存储在文字池中的地址值,这个过程需要访问内存。
- 如果
- 简单记忆:
adr是算地址(PC相对偏移),ldr =是读地址(从内存加载绝对地址值,可能需要额外空间存储)。
指令格式:
-
AArch32 (ARM/Thumb):
adr{cond} Rd, label{cond}: 可选的条件码(如eq,ne,gt等)。Rd: 目标寄存器,用于存储计算得到的地址。label: 程序中的一个标签(Label),代表需要获取其地址的位置。
-
AArch64:
adr Rd, label(AArch64 中通常不使用条件码)
为什么使用 adr?
- 位置无关代码(PIC): 由于
adr使用 PC 相对寻址,生成的地址不依赖于代码加载的绝对位置。这使得代码可以被加载到内存中的任意地址运行,对于动态链接库(DLL/so)和某些引导程序至关重要。 - 效率: 相比
ldr =label(可能需要额外的内存访问和文字池空间),adr通常只需要一条指令就能完成地址计算,更节省空间和执行时间(特别是对于附近的地址)。 - 访问邻近数据/代码: 访问定义在当前函数或附近的数据结构、跳转表条目或局部字符串常量时非常方便。
示例:
.section .text
.global _start
_start:
adr x0, my_message // 将 my_message 标签的地址计算出来,存入寄存器 x0 (AArch64)
bl printf // 调用 printf 函数,x0 作为第一个参数 (字符串地址)
mov x0, #0 // 退出状态码 0
mov x8, #93 // syscall 号 93 (exit)
svc #0 // 执行系统调用
.section .rodata
my_message:
.asciz "Hello, World!\n" // 定义一个以 null 结尾的字符串
在这个例子中:
adr x0, my_message这条指令计算出my_message标签(位于.rodata段)相对于当前PC(指向adr指令本身)的偏移量,并将计算得到的地址值存入寄存器x0。- 然后
bl printf调用printf函数,并将x0中的值(即字符串"Hello, World!\n"在内存中的地址)作为第一个参数传递给它。
总结:
adr 是一个高效的 ARM 指令,用于计算并加载程序计数器(PC)附近标签的相对地址到寄存器中。它对于编写位置无关代码、高效访问临近数据和代码片段非常有用。理解它与 ldr =label 伪指令的区别(计算相对地址 vs 加载绝对地址)是掌握它的关键。
ADR1001 adi
电子发烧友网为你提供ADI(ADI)ADR1001相关产品参数、数据手册,更有ADR1001的引脚图、接线图、封装手册、中文资料、英文资料,ADR
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
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
ADR431-EP/ADR434-EP/ADR435-EP:增强型产品数据表
ADR431-EP/ADR434-EP/ADR435-EP:增强型产品数据表
资料下载
佚名
2021-05-27 18:59:29
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
ADR530是一款基准电压源
1970-01-01 08:00:00 至 1970-01-01 08:00:00
ADR364AUJZ-REEL7烧烤基准电压源
1970-01-01 08:00:00 至 1970-01-01 08:00:00
ARM汇编指令集分享
)0x0000_0014: 下一条数据.arm / .code32 声明以下的代码是ARM指令.thumb /.code16 声明以下的代码是thumb指令13、ldr和adrldr和
换一换
- 如何分清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功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览