news 2026/2/28 7:59:09

ARM 汇编指令:LDR

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ARM 汇编指令:LDR

ARM 汇编指令:LDR

LDR在 ARM 汇编中是Load Register的缩写,即“加载数据到寄存器”

你可以把它理解为 C 语言等高级语言中的“读内存”“指针解引用”操作。

核心功能

从一个内存地址中读取数据(一个或多个字节),并将其放入指定的寄存器中。


基本语法

LDR{条件}{大小} 目标寄存器, 源内存地址

  • 目标寄存器:数据将被加载到哪个寄存器(如 R0, R1)。
  • 源内存地址:指定从哪里读取数据。它可以是:
    • 一个固定的地址(使用标签,如LDR R0, =my_var
    • 一个寄存器中存储的地址(指针)
    • 一个带有偏移量的地址

常见用法和示例

1.从固定地址/变量加载

这是最常见的形式,用于访问全局变量或常量。

.data my_var: .word 0x12345678 @ 在内存中定义一个32位字,值为0x12345678 .text LDR R0, =my_var @ 将 my_var 的地址(一个指针)加载到 R0 LDR R1, [R0] @ 这才是真正的 LDR:读取 R0 指向的内存地址的内容(0x12345678)到 R1

更常见的便捷写法(由汇编器自动处理):

LDR R1, =my_var @ 直接加载 my_var 的地址到 R1(常用于加载地址) LDR R2, my_var @ 直接读取 my_var 的值到 R2(一些汇编器支持)
2.从寄存器指定的地址加载(基础寄存器寻址)

将寄存器作为一个指针。

MOV R3, #0x20000000 @ 假设 0x20000000 是一个有效的内存地址(如 GPIO 寄存器) LDR R4, [R3] @ 读取地址 0x20000000 处的32位数据到 R4
3.带偏移量的加载(前变址)

先计算偏移地址再加载,并更新基址寄存器

LDR R5, [R6, #4]! @ 从地址 [R6+4] 处读取数据到 R5,然后 R6 = R6 + 4 @ "!" 表示更新基址寄存器 R6
4.带偏移量的加载(后变址)

先加载,再更新基址寄存器。

LDR R5, [R6], #4 @ 从地址 [R6] 处读取数据到 R5,然后 R6 = R6 + 4
5.带移位/索引寄存器的加载

偏移量由另一个寄存器给出,并可移位。

LDR R7, [R8, R9, LSL #2] @ 地址 = R8 + (R9 << 2)。常用于数组访问(R9 是索引,每个元素4字节)。

加载不同类型的数据(大小后缀)

默认情况下,LDR加载一个32位字(Word, 4字节)。但可以通过后缀加载不同大小的数据:

指令含义加载大小说明
LDRLoad Word32 位最常用,加载一个字
LDRHLoad Halfword16 位加载半个字,零扩展到32位
LDRSHLoad Signed Halfword16 位加载半个字,符号扩展到32位
LDRBLoad Byte8 位加载一个字节,零扩展到32位
LDRSBLoad Signed Byte8 位加载一个字节,符号扩展到32位

示例:

LDRB R0, [R1] @ 从地址 [R1] 读取一个字节(如 0xFF),存入 R0 后变为 0x000000FF(零扩展) LDRSB R0, [R1] @ 从地址 [R1] 读取一个字节(如 0xFF),存入 R0 后变为 0xFFFFFFFF(符号扩展,因为0xFF是负数)

伪指令:LDR =

这是初学者最容易混淆的地方。LDR Rd, =...经常被用作一个伪指令

  • LDR Rd, =label: 这通常意味着“将 label 的地址加载到 Rd”。汇编器会自动处理,可能会生成一条MOV指令或从附近的“文字池”中加载一个常量。

    LDR R0, =0x12345678 @ 将一个32位立即数常量 0x12345678 加载到 R0
  • LDR Rd, [Rn]:这才是“真正的” LDR 指令,从内存地址[Rn]加载数据。


与 STR 指令的关系

LDR的“逆操作”是STR。它们是配对使用的内存访问指令:

  • LDR R0, [R1]: 读内存。R0 = *R1;
  • STR R0, [R1]: 写内存。*R1 = R0;

总结表格

特性LDR指令
名称Load Register(加载到寄存器)
核心作用从内存读取数据到寄存器
类比C语言register = *address;(解引用操作)
常见用途1. 访问变量
2. 读取外设寄存器
3. 访问数组/结构体
关键变体LDRB(字节),LDRH(半字),LDRSB(有符号字节)等
配对指令STR(Store Register,将寄存器数据存入内存)

简单记忆:LDR就是把数据从内存“搬”到CPU的寄存器里。它是程序与内存交互、获取数据的最基本方式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/27 19:30:22

探索FDTD超材料吸收器的吸收光谱奥秘

FDTD超材料吸收器吸收光谱在当今科技飞速发展的时代&#xff0c;超材料以其独特的性质吸引了众多科研人员的目光。其中&#xff0c;FDTD&#xff08;时域有限差分法&#xff09;超材料吸收器的吸收光谱更是研究的热门领域。今天&#xff0c;咱们就一起来深入探究一番。 什么是F…

作者头像 李华
网站建设 2026/2/4 7:29:15

无锡黑锋 HF1841 1MHz 超小型、高效率、同步升压DC-DC变换器技术解析

一、芯片核心定位HF1841 是一款采用同步整流技术的微型、高效率、固定频率升压&#xff08;Boost&#xff09;DC-DC变换器 其核心价值在于 高达95%的转换效率、1MHz的高开关频率 以及 仅60μA的超低静态电流 专为单节/双节碱性/镍氢电池或单节锂电供电的便携设备设计&#xff0…

作者头像 李华
网站建设 2026/2/28 6:59:05

探索电动汽车纵向速度MPC控制器

电动汽车纵向速度MPC控制器。 采用上层控制器和下层控制器。 目标为控制车辆的纵向速度&#xff0c;使其跟踪上期望纵向速度曲线。 ●上层控制器&#xff1a;控制方式为MPC控制器&#xff0c;输入为车辆纵向速度和纵向加速度&#xff0c;输出为期望加速度&#xff0c;并且对加速…

作者头像 李华
网站建设 2026/2/27 3:11:40

基于主从博弈理论的共享储能与综合能源微网优化运行研究复现

【文章复现】《基于主从博弈理论的共享储能与综合能源微网优化运行研究》 区别于网上常规烂大街代码&#xff0c;用自己逻辑进行修改复现 可根据要求进行扩展或改写在能源领域的研究中&#xff0c;基于主从博弈理论的共享储能与综合能源微网优化运行是个相当有趣且有深度的话题…

作者头像 李华
网站建设 2026/2/27 20:34:03

【毕业设计】基于springboot+vue的高校奖学金申报评定管理系统的设计基于springboot高校学生奖学金评定系统的设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/28 2:16:09

【毕业设计】基于springboot+vue的新能源汽车信息咨询服务设计和实现基于Java Web的新能源汽车信息咨询服务(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华