arm adr 列子
好的!ARM 汇编中的 ADR 指令是一个 伪指令,它的主要作用是将一个标签(Label) 所表示的地址加载到一个寄存器中。这个地址是相对于程序计数器(PC)的偏移量计算出来的(PC-relative addressing)。
主要特点:
- 伪指令: 它本身不是处理器原生支持的指令。汇编器在编译时会将其转换成一条或多条等效的、处理器实际支持的指令(通常是
ADD Rd, PC, #offset或SUB Rd, PC, #offset)。 - PC 相对寻址: ADR 计算出的地址基于当前 PC 值加上(或减去)一个偏移量。这使得代码是位置无关的(Position-Independent Code, PIC),即无论代码加载到内存的哪个位置,只要标签与当前指令的相对位置不变,ADR 都能正确计算出标签的地址。
- 地址范围有限: 由于 ADR 最终被转换成基于 PC 的 ADD/SUB 指令,它所能加载的地址必须在当前 PC 值的一定偏移范围内(通常是 ±4095 字节)。
- 用途: 最常见的用途是获取局部数据区中的变量地址、函数内部的字符串常量地址,或者指向常量池(literal pool)中的值的指针。
示例:
示例 1:加载字符串地址
.section .text
.global _start
_start:
ADR R0, my_message @ 将标签 my_message 的地址加载到寄存器 R0
@ 汇编器会计算 my_message 相对于当前 PC 的偏移量
@ 并生成类似 ADD R0, PC, #<offset> 的指令
@ 假设我们有一个系统调用 (syscall) 需要字符串地址在 R0 中 (比如打印)
MOV R7, #4 @ 系统调用号 4 (Linux write)
MOV R1, R0 @ R1 = 字符串地址 (现在在 R0 中)
MOV R0, #1 @ 文件描述符 1 (stdout)
ADR R2, msglen @ 将标签 msglen 的地址加载到 R2 (msglen 存的是字符串长度)
LDR R2, [R2] @ 从 msglen 地址加载实际的长度值到 R2
SVC 0 @ 执行系统调用 (打印字符串)
@ ... 其他代码或退出 ...
my_message: @ 这个标签定义了一个字符串
.asciz "Hello, ARM ADR!\n" @ .asciz 表示以 null 结尾的 ASCII 字符串
.align 2 @ 确保下一个数据项对齐 (地址是4的倍数)
msglen: @ 这个标签定义了一个存储字符串长度的字
.word . - my_message - 1 @ 计算字符串长度 (不包括结尾的 null)
@ . 表示当前地址
@ my_message 是字符串起始地址
@ -1 是为了去掉结尾的 null 字节
示例 2:加载跳转表地址进行分支
.section .text
.global _start
_start:
MOV R0, #2 @ 假设我们有一个操作选项值 (比如 2) 在 R0 中
@ 使用 ADR 加载跳转表的基地址到 R1
ADR R1, jump_table @ R1 = jump_table 的基地址
@ 计算跳转表项的偏移量 (每个项是 4 字节)
LSL R0, R0, #2 @ R0 = R0 * 4 (因为每个地址占 4 字节)
@ 获取目标函数的地址
LDR PC, [R1, R0] @ PC = [R1 + R0] -> 加载表中对应的地址到 PC 实现跳转
@ ... (Option 0, 1, 3 的处理代码或退出点) ...
@ 定义跳转表 (存储函数入口地址的数组)
jump_table:
.word handle_option0 @ 第0项: handle_option0 函数的地址
.word handle_option1 @ 第1项: handle_option1 函数的地址
.word handle_option2 @ 第2项: handle_option2 函数的地址
.word handle_option3 @ 第3项: handle_option3 函数的地址
handle_option0:
@ 处理选项 0 的代码
B exit_program
handle_option1:
@ 处理选项 1 的代码
B exit_program
handle_option2: @ 这里就是上面代码跳转到的目标
@ 处理选项 2 的代码 (例如打印 "Option 2 chosen")
ADR R0, opt2_msg
@ ... (假设这里有打印字符串的代码,如上例) ...
B exit_program
handle_option3:
@ 处理选项 3 的代码
B exit_program
exit_program:
@ 程序退出代码 (例如 MOV R7, #1; SVC 0)
.section .data
opt2_msg:
.asciz "You selected Option 2!\n"
.align 2
关键点回顾:
ADR Rd, label是将标签label的 PC 相对地址加载到寄存器Rd。- 它是位置无关的关键工具。
- 适用于加载附近的数据或代码标签地址。
- 如果地址距离 PC 太远(超过 ±4095 字节),汇编器通常会报错。此时需要使用
LDR Rd, =label(常称为“伪 LDR”)指令,它会将地址放入常量池并从那里加载。 - 在阅读或编写使用
ADR的代码时,要时刻记住它加载的是地址,而不是该地址处的值。要获取值,还需要使用加载指令如LDR/STR(对于内存)或B/BL(对于代码地址)。
希望这些例子能帮助你理解 ARM ADR 指令的用法!
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
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
ADR425ARM-REEL7
ADR425ARM-REEL7 - Ultraprecision Low Noise, 2.048 V/2.500 V/ 3.00 V/5.00 V XFET Voltage References - Analog Devices
换一换
- 如何分清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功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览