登录/注册

关于adr指令的理解

更多

好的,我们来详细解释一下 ADR 指令(在 ARM 架构中最常见):

核心概念

ADR 指令的核心作用是:将相对于当前程序计数器值的标签(地址)加载到寄存器中。

关键点详解

  1. 相对寻址:

    • 它计算的目标地址是基于当前 PC 值加上或减去一个偏移量得到的。
    • 不直接加载一个绝对的物理地址或虚拟地址(像 LDR Rd, =label 那样)。
  2. 加载标签地址:

    • 它的操作数通常是一个符号(标签),这个标签代表代码段或数据段中的某个位置。
    • 例如:ADR x0, my_label 表示将符号 my_label 所在内存位置的地址加载到寄存器 x0 中。
  3. 基于 PC (Program Counter):

    • 指令内部隐含地使用了当前 PC 寄存器的值作为计算的基准点。
    • 编译器/汇编器在生成机器码时,会计算标签所在地址与 ADR 指令所在地址之间的偏移量
  4. 位置无关代码:

    • 这是 ADR 指令最大的优势。由于加载的地址是相对于 PC 计算的,只要这段代码和 my_label 标签所代表的内容之间的相对位置没有改变,那么无论整个程序块被加载到内存中的哪个位置(地址),ADR 指令都能正确地计算出 my_label 的地址。这在动态链接库、可重定位代码、PIC 等场景中至关重要。
  5. 范围有限:

    • ADR 指令的偏移量编码在指令位宽内,通常范围较小。
    • AArch64:
      • ADR Rd, label:偏移量范围是 ±1MB(-1048575 到 1048575 字节)。
    • AArch32 (Thumb):
      • ADR Rd, label:偏移量范围较小,通常是 ±4095 字节(具体取决于模式)。
    • 如果标签超出了这个范围,汇编器会报错。此时需要使用 ADRP + ADDLDR(绝对加载)等替代方案。
  6. 生成有效地址:

    • ADR 执行的结果是将计算得到的地址值存入目标寄存器 Rd。它不会读取该地址处的内存内容。要读取内容,需要后续使用 LDRSTR 等其他内存访问指令。
    • LDR x1, [x0] :读取寄存器 x0 中地址指向的内存内容到 x1
  7. 效率:

    • 通常比 LDR Rd, =label 更高效。因为 ADR 是一条直接计算地址的指令(通常单周期),而 LDR Rd, =label 会在内存中创建一个地址池(literal pool),然后通过一条 LDR 指令去加载这个绝对地址(多一次内存访问)。

与相关指令的对比

使用场景示例

    .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

2025-03-12 18:55:06

DSD1794A的10脚(ADRO)11脚(ADR1)接哪里?是什么功能?

关于DSD1794A的10脚(ADRO)11脚(ADR1)接哪里?是什么功能?

2024-12-18 06:26:35

求助,关于ADR4550输出电压的疑问求解

我采用ADR4550做为18位SAR ADC的参考电压,数据手册中描述ADR4550的输入电压范围为5.1~15V,我采用7V供电,但ADR45

2024-05-28 07:16:31

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

理解S7-200高速输出指令

理解S7-200高速输出指令资料下载。

资料下载 姚小熊27 2021-04-22 14:59:16

采用DFN8封装的1A线性充电芯片HM4051ADR

M4051ADR是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。其底部带有散热片的DFN8封装与较少的外部元件数目使得HM4051ADR成为便携式应用的理想HM4051

资料下载 h1654156040.5061 2021-03-13 10:27:22

关于ADR423输出电流问题求解

ADR423的数据手册上显示高输出电流为10mA,但是实际中用5V供电,实测输出电流只有2mA左右,再增加电流参考电压就降低到了1.6V,这是为什么?

2024-01-05 07:15:10

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

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

ADR440/ADR441/ADR443/ADR444/

2022-10-09 14:48:28

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

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

2022-05-17 09:51:52

关于sleep指令的详细说明

之前一直没有真正理解sleep指令,最近在做智能水表的产品的时候,用了一款8位的单片机PIC16F690,当看到程序中的sleep指令时以为执行

2021-11-24 06:45:22

什么是“AT”指令,如何使用?

AT指令是S7-SCL中特有的一个指令,初学者可能会忽略此指令,或者对其理解

2021-04-09 15:25:52

ARM指令adr和ldr的用法区别

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

2020-06-20 10:20:38

7天热门专题 换一换
相关标签