登录/注册

arm adr 列子

更多

好的!ARM 汇编中的 ADR 指令是一个 伪指令,它的主要作用是将一个标签(Label) 所表示的地址加载到一个寄存器中。这个地址是相对于程序计数器(PC)的偏移量计算出来的(PC-relative addressing)。

主要特点:

  1. 伪指令: 它本身不是处理器原生支持的指令。汇编器在编译时会将其转换成一条或多条等效的、处理器实际支持的指令(通常是 ADD Rd, PC, #offsetSUB Rd, PC, #offset)。
  2. PC 相对寻址: ADR 计算出的地址基于当前 PC 值加上(或减去)一个偏移量。这使得代码是位置无关的(Position-Independent Code, PIC),即无论代码加载到内存的哪个位置,只要标签与当前指令的相对位置不变,ADR 都能正确计算出标签的地址。
  3. 地址范围有限: 由于 ADR 最终被转换成基于 PC 的 ADD/SUB 指令,它所能加载的地址必须在当前 PC 值的一定偏移范围内(通常是 ±4095 字节)。
  4. 用途: 最常见的用途是获取局部数据区中的变量地址、函数内部的字符串常量地址,或者指向常量池(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

关键点回顾:

希望这些例子能帮助你理解 ARM ADR 指令的用法!

ADR1001 adi

电子发烧友网为你提供ADI(ADI)ADR1001相关产品参数、数据手册,更有ADR1001的引脚图、接线图、封装手册、中文资料、英文资料,ADR

2025-03-12 18:55:06

adr和ldr什么区别?

adr 和ldr什么区别 还有为啥arm 汇编能反汇编不都已经是汇编了?

2024-05-17 06:27:29

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

2023-10-12 18:46:26

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

ADR130:精密系列子带间隙电压基准数据表

ADR130:精密系列子带间隙电压基准数据表

资料下载 1123127317 2021-05-14 13:10:11

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

ADR130AUJZ

精密系列子带隙电压基准

2023-03-28 16:49:35

ADR425ARM-REEL7

ADR425ARM-REEL7 - Ultraprecision Low Noise, 2.048 V/2.500 V/ 3.00 V/5.00 V XFET Voltage References - Analog Devices

2022-11-04 17:22:44

求助 DS18B20的驱动列子

求助 DS18B20 的驱动列子

2022-10-11 06:51:27

ADR444BRZ基准电压源具有哪些性能呢

ADR440/ADR441/ADR443/ADR444/

2022-10-09 14:48:28

ARM指令:adr和ldr的用法区别

同学们在学习ARM指令时,多数都会对adr和ldr这两个命令产生疑惑,那他们究竟有什么区别呢?

2020-06-20 10:20:38

ADR5043A 3 Vout负精度参考配置

ADR5043A 3 Vout负精度参考配置的典型应用。 ADR5040 / ADR5041 /

2020-03-23 09:52:36
7天热门专题 换一换
相关标签