登录/注册

arm adr ldr

更多

好的,关于 ARM 汇编中的 ARM(可能指伪指令或架构)、ADRLDR,以下是详细的中文解释:

  1. ARM (指架构或伪指令?):

    • 指架构: 最常见的意思是ARM 处理器架构本身。这是由 ARM Holdings 公司设计的精简指令集(RISC)处理器架构家族,广泛应用于移动设备、嵌入式系统等领域。当你写 ARM 汇编时,通常就是指为这种架构编写的程序。
    • 指伪指令: AREA 是在某些汇编器(如 ARM 自己的汇编器)中使用的伪指令(也叫汇编指令或编译器指令)。它的作用不是被 CPU 直接执行,而是告诉汇编器如何组织接下来的代码或数据。
      • 功能: AREA 用于定义一个代码段或数据段。它为汇编器生成的目标文件(如 ELF 文件)中的特定区域命名,并可以设置其属性(如可读、可写、可执行、是否为指令、是否为数据、对齐方式等)。
      • 示例:
        AREA |.text|, CODE, READONLY ; 定义一个名为 ".text" 的代码段,属性为只读、可执行
        AREA MyData, DATA, READWRITE ; 定义一个名为 "MyData" 的数据段,属性为可读写
      • 重要性: 正确使用 AREA 是引导链接器将代码和数据放到正确内存位置的基础。编译器(如 GCC)在将 C 代码编译成汇编时,会自动生成必要的 AREA 伪指令。在写裸机程序或操作时系统启动代码时,常需要手动编写。
    • 总结: 当你的代码中写 ARM 时,大概率是指 AREA 伪指令,用于定义程序中的段。
  2. ADR(伪指令):

    • 名称来源: ADRess (取地址)
    • 功能: ADR 是一个伪指令。它用于将相对于程序计数器(PC)的标签(或小范围偏移)的地址加载到目标寄存器中
    • 原理: 它产生的指令(如 ADD Rd, PC, #offsetSUB Rd, PC, #offset)利用 PC 值的偏移量来计算目标地址。
    • 应用场景:
      • 访问当前代码段内部的变量(如常数池中的常量)。
      • 访问当前代码段内的子程序或跳转目标(常用于分支跳转前的地址准备)。
      • 访问附近的数据结构。
    • 限制:
      • 因为使用 PC 相对寻址,地址必须处于当前 PC 值附近一个有限范围内(例如 ±4095 字节,具体范围取决于架构版本和指令集 - Thumb 下范围更小)。这个范围很小
      • 目标地址的计算依赖于当前 PC 值及其在指令流水线中的阶段(通常被认为是下两条指令的地址,即 PC + 8)。
      • 汇编器会根据实际偏移量选择最合适的指令(ADD/SUB)来替代 ADR。
    • 优点: 地址相对于 PC,生成的目标代码通常是位置无关代码(PIC)
    • 示例:
      ADR R0, my_label   ; 将 'my_label' 标签处的地址加载到 R0 中。
      ...                ; (假设 my_label 在附近的代码中)
      my_label:
          ...
  3. LDR(指令和伪指令):

    • 名称来源: LoaD Register (加载寄存器)
    • 功能:
      • 作为指令(Instruction): 主要用于从内存加载一个 32 位字到目标寄存器。它可以有不同的寻址模式(寄存器偏移、立即数偏移、前变址、后变址等)。
        LDR R1, [R2]        ; 从 R2 中存储的地址处加载一个字到 R1
        LDR R1, [R2, #4]    ; 从 R2+4 地址处加载一个字到 R1 (基址 + 偏移)
        LDR R1, [R2, R3]!   ; 从 R2+R3 地址处加载, 然后更新 R2 = R2 + R3
      • 作为伪指令(Pseudo-instruction): 这是最常见的用法。写法是 LDR Rd, =expression
        • 功能: 用于将任意 32 位常量(立即数)或任意地址(甚至在链接时可重定位的地址)加载到目标寄存器中
        • 原理:
          • 如果 expression 是一个简单的可以直接放入 MOVMVN 指令的立即数(通常范围在 0-255 或某个范围内),汇编器会生成相应的 MOVMVN 指令。
          • 如果 expression 的值太大无法直接用 MOV/MVN 加载,或者是一个标签(即地址),汇编器会将该常量或地址值存放到附近的一个“文字池”(literal pool)中(通常由汇编器管理,放在代码段的尾部或间隙处),然后生成一条 PC 相对寻址LDR 指令 来从文字池加载该值到寄存器(实质就是使用LDR Rd, [PC, #offset_to_pool_entry])。
        • 应用场景: 加载大常数(包括浮点数常量,但要注意对齐)、加载函数地址、加载全局变量地址。
        • 限制: 文本池中常量地址相对于加载指令的位置也有限制(通常比 ADR 的范围大得多,但也有限制,±4095 字节比较常见),汇编器通常会自动处理文本池位置,尽量避免超出范围错误(如果超出,可能需要在附近添加 .ltorg 伪指令强制放一个文字池)。
        • 优点: 非常灵活,可以加载任何 32 位值或地址。
      • 总结: LDR 既是一个基本的加载内存数据到寄存器的指令,也是一个非常强大的用于加载常量和地址的伪指令(格式 LDR Rd, = ...)。

关键区别总结

特性 AREA (伪指令) ADR (伪指令) LDR
类型 汇编器指令 (告诉汇编器做什么) 伪指令 (被汇编器翻译成其他指令) 指令 (CPU 执行) AND 伪指令 (LDR Rd, =...形式)
主要功能 定义代码/数据段及其属性 加载 PC 附近标签/数据的地址到寄存器 指令: 从内存地址加载数据到寄存器。
伪指令 (=): 加载大常量或任意地址到寄存器
寻址方式 - PC 相对寻址 指令: 多种内存寻址模式 (寄存器基址 + 偏移等)
伪指令(=): 利用PC 相对寻址加载文字池中的常量/地址
范围 - 非常小 (如 ±4095 字节) 伪指令(=):ADR 大得多 (但也有限制,±4095较常见),可加载任意位置地址/大常量
位置无关性 - 通常生成位置无关代码 (因为相对于 PC) 伪指令(=): 加载地址时常生成位置无关代码 (因为相对于 PC 从文字池加载)
典型用途 组织结构:定义代码段、数据段 获取附近标签地址 (如局部跳转、常数池访问) 指令: 访问内存数据。
伪指令 (=): 加载地址或大数值 (如 LDR R0, =0x12345678, LDR R0, =main, LDR R0, =global_var)

简单记忆:

希望这个详细的中文解释能够帮助你清晰理解 ARM 汇编中这三个关键概念/指令的区别和用法!

ADR1001 adi

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

2025-03-12 18:55:06

adrldr什么区别?

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

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

请问一下ARM汇编中的B跳转指令和LDR跳转的区别在哪

请问一下ARM汇编中的B跳转指令和LDR跳转的区别有哪些不同之处呢?

2022-07-21 15:57:43

BL(B)和LDR跳转范围是如何规定的

  LDR和BL在启动程序中,都是可以负责pc跳转的指令。   BL是地址无关指令,即和当前的运行地址无关。链接器脚本中标明了一个运行地址,但是arm中的代码实际是从地址0开始运行的。这个时候, 实际的地址和运行地

2022-07-03 10:29:48

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

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

2022-05-17 09:51:52

ARM汇编指令集分享

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

2022-04-06 10:41:15

ON最新优势到货型号:MC33063ADR2G,MC7805ABD2TR4G,LM317D2TR4G,LM317LDR2G

,NCP1653ADR2G,NCP1654BD65R2G,MC74HC14ADR2G,MC33063ADR2G,MC7805ABD2TR4G,M

2021-03-16 21:53:54

ARM指令:adrldr的用法区别

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

2020-06-20 10:20:38

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