arm adr ldr
好的,关于 ARM 汇编中的 ARM(可能指伪指令或架构)、ADR 和 LDR,以下是详细的中文解释:
-
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伪指令,用于定义程序中的段。
-
ADR(伪指令):
- 名称来源: ADRess (取地址)
- 功能:
ADR是一个伪指令。它用于将相对于程序计数器(PC)的标签(或小范围偏移)的地址加载到目标寄存器中。 - 原理: 它产生的指令(如
ADD Rd, PC, #offset或SUB 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: ...
-
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是一个简单的可以直接放入MOV或MVN指令的立即数(通常范围在 0-255 或某个范围内),汇编器会生成相应的MOV或MVN指令。 - 如果
expression的值太大无法直接用MOV/MVN加载,或者是一个标签(即地址),汇编器会将该常量或地址值存放到附近的一个“文字池”(literal pool)中(通常由汇编器管理,放在代码段的尾部或间隙处),然后生成一条PC 相对寻址的LDR指令 来从文字池加载该值到寄存器(实质就是使用LDR Rd, [PC, #offset_to_pool_entry])。
- 如果
- 应用场景: 加载大常数(包括浮点数常量,但要注意对齐)、加载函数地址、加载全局变量地址。
- 限制: 文本池中常量地址相对于加载指令的位置也有限制(通常比
ADR的范围大得多,但也有限制,±4095 字节比较常见),汇编器通常会自动处理文本池位置,尽量避免超出范围错误(如果超出,可能需要在附近添加.ltorg伪指令强制放一个文字池)。 - 优点: 非常灵活,可以加载任何 32 位值或地址。
- 总结:
LDR既是一个基本的加载内存数据到寄存器的指令,也是一个非常强大的用于加载常量和地址的伪指令(格式LDR Rd, = ...)。
- 作为指令(Instruction): 主要用于从内存加载一个 32 位字到目标寄存器。它可以有不同的寻址模式(寄存器偏移、立即数偏移、前变址、后变址等)。
关键区别总结
| 特性 | 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) |
简单记忆:
AREA: "这里开始是一个区域,属性是 CODE/READONLY 等等"。定义段落。ADR: "取附近(小范围内)那个东西的地址给我"。取小范围地址。LDR(伪指令形式): "把这个(可能很大或很远)的值(数字或地址)加载到寄存器里,不管它在哪,你想办法"。加载任意东西。LDR(指令形式): "把内存中这个地址的值读出来放进寄存器"。读内存。
希望这个详细的中文解释能够帮助你清晰理解 ARM 汇编中这三个关键概念/指令的区别和用法!
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
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
BL(B)和LDR跳转范围是如何规定的
LDR和BL在启动程序中,都是可以负责pc跳转的指令。 BL是地址无关指令,即和当前的运行地址无关。链接器脚本中标明了一个运行地址,但是arm中的代码实际是从地址0开始运行的。这个时候, 实际的地址和运行地
2022-07-03 10:29:48
请问一下ARM指令和伪指令的区别在哪呢
对齐填充.equ @ 类似于C中宏定义重要的几个伪指令:ldr 大范围的地址加载指令adr 小范围的地址加载指令adrl 中等范围的地址加载指令nop 空操作
ARM汇编指令集分享
)0x0000_0014: 下一条数据.arm / .code32 声明以下的代码是ARM指令.thumb /.code16 声明以下的代码是thumb指令13、
ON最新优势到货型号:MC33063ADR2G,MC7805ABD2TR4G,LM317D2TR4G,LM317LDR2G
,NCP1653ADR2G,NCP1654BD65R2G,MC74HC14ADR2G,MC33063ADR2G,MC7805ABD2TR4G,M
换一换
- 如何分清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功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览