登录/注册

adr指令

更多

好的,关于 ARM 架构中的 adr 指令,以下是中文解释:

核心概念:

adr 指令(Address of Relative label)的作用是将一个相对于当前程序计数器(PC)的标签地址加载到目标寄存器中

关键点解释:

  1. 计算相对地址: adr 不是从内存中加载一个绝对地址值,而是计算标签相对于当前正在执行的指令的位置(PC)的偏移量(通常是一个小的、有符号的立即数偏移)。
  2. 目标: 将这个计算得到的地址值存储到指定的寄存器中。
  3. 用途: 主要用于获取:
    • 当前代码段内定义的局部标签(Label)的地址。
    • 与当前指令位置相近(通常在 ±1MB 范围内)的数据或代码的地址。
  4. 效率: 因为它通常被汇编器翻译成一条类似于 add Rd, PC, # 的指令(其中 # 是一个小的立即数偏移),所以它是一条单指令高效的获取附近地址的方法。
  5. 范围限制: adr 能表示的地址偏移范围相对较小(具体范围取决于使用的 ARM 指令集版本和指令编码,例如在 AArch32 的 Thumb 模式下可能只有 ±255 字节,在 ARM 模式下或 AArch64 下会更大,如 ±1MB)。如果标签距离当前 PC 太远,汇编器会报错。
  6. ldr 的区别(重要!):
    • adr Rd, label计算 label 的地址(相对于PC),并将结果存入寄存器 RdRd 中得到的是 label 本身的内存地址值。
    • ldr Rd, =label:这是一个伪指令。汇编器会:
      • 如果 label 的地址是一个可以用 movmvn 指令加载的小立即数,则生成 mov Rd, #imm
      • 否则,汇编器会在附近创建一个文字池(Literal Pool),将 label绝对地址存储在这个文字池中。然后生成一条 ldr Rd, [PC, #offset] 指令,从文字池中加载那个绝对地址值到寄存器 Rd。所以 ldr = 最终加载的是存储在文字池中的地址值,这个过程需要访问内存。
    • 简单记忆: adr算地址(PC相对偏移),ldr =读地址(从内存加载绝对地址值,可能需要额外空间存储)。

指令格式:

为什么使用 adr

  1. 位置无关代码(PIC): 由于 adr 使用 PC 相对寻址,生成的地址不依赖于代码加载的绝对位置。这使得代码可以被加载到内存中的任意地址运行,对于动态链接库(DLL/so)和某些引导程序至关重要。
  2. 效率: 相比 ldr =label(可能需要额外的内存访问和文字池空间),adr 通常只需要一条指令就能完成地址计算,更节省空间和执行时间(特别是对于附近的地址)。
  3. 访问邻近数据/代码: 访问定义在当前函数或附近的数据结构、跳转表条目或局部字符串常量时非常方便。

示例:

.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 结尾的字符串

在这个例子中:

  1. adr x0, my_message 这条指令计算出 my_message 标签(位于 .rodata 段)相对于当前 PC(指向 adr 指令本身)的偏移量,并将计算得到的地址值存入寄存器 x0
  2. 然后 bl printf 调用 printf 函数,并将 x0 中的值(即字符串 "Hello, World!\n" 在内存中的地址)作为第一个参数传递给它。

总结:

adr 是一个高效的 ARM 指令,用于计算并加载程序计数器(PC)附近标签的相对地址到寄存器中。它对于编写位置无关代码、高效访问临近数据和代码片段非常有用。理解它与 ldr =label 伪指令的区别(计算相对地址 vs 加载绝对地址)是掌握它的关键。

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

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

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

ADR440/ADR441/ADR443/ADR444/

2022-10-09 14:48:28

请问一下ARM指令和伪指令的区别在哪呢

对齐填充.equ @ 类似于C中宏定义重要的几个伪指令:ldr 大范围的地址加载指令adr 小范围的地址加载

2022-05-17 09:51:52

ARM汇编指令集分享

)0x0000_0014: 下一条数据.arm / .code32 声明以下的代码是ARM指令.thumb /.code16 声明以下的代码是thumb指令13、ldr和adrldr和

2022-04-06 10:41:15

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天热门专题 换一换
相关标签