0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ARM指令:adr和ldr的用法区别

如意 来源:CSDN 作者:孙晓明 2020-06-20 10:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

其实这两个都是伪指令:adr是小范围的地址读取伪指令,ldr是大范围的读取地址伪指令。可实际上adr是将基于PC相对偏移的地址值或基于寄存器相对地址值读取的为指令,而ldr用于加载32为立即数或一个地址到指定的寄存器中。到这儿就会看到其中的区别了。如果在程序中想加载某个函数或者某个在联接时候指定的地址时请使用adr,例如在lds中需要重新定位的地址。当加载32为的立即数或外部地址时请用ldr。

我给大家先举个例子:

AREA test,CODE,READONLY

ENTRY

ldr r0,_start

adr r0,_start

ldr r0,=_start

nop

_start

nop

END

这段代码并无实际意义,只是为了方便说明。我们反汇编一下看看:

4: ldr r0,_start

0x00000000 E59F0008 LDR R0,[PC,#0x0008]

5: adr r0,_start

0x00000004 E28F0004 ADD R0,PC,#0x00000004

6: ldr r0,=_start

0x00000008 E59F0004 LDR R0,[PC,#0x0004]

7: nop

8:

9:

10: _start

0x0000000C E1A00000 NOP

11: nop

ldr r0, _start

从内存地址 _start 的地方把值读入。执行这个后,r0 = 0xe1a00000

adr r0, _start

取得 _start 的地址到 r0,但是请看反编译的结果,它是与位置无关的。其实取得的时相对的位置。例如这段代码在 0x00000000 运行,那么 adr r0, _start 得到 r0 = 0x00000010;

ldr r0, =_start

这个取得标号 _start 的绝对地址。这个绝对地址是在 link 的时候确定的。看上去这只是一个指令,但是它要占用 2 个 32bit 的空间,一条是指令,另一条是 _start 的数据(因为在编译的时候不能确定 _start 的值,而且也不能用 mov 指令来给 r0 赋一个 32bit 的常量,所以需要多出一个空间存放 _start 的真正数据,在这里就是 0x0000000c)。

因此可以看出,这个是绝对的寻址,不管这段代码在什么地方运行,它的结果都是 r0 = 0x0000000c。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    135

    文章

    9499

    浏览量

    388746
  • adr
    adr
    +关注

    关注

    0

    文章

    9

    浏览量

    11711
  • LDR
    LDR
    +关注

    关注

    0

    文章

    100

    浏览量

    8145
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ARM架构与DSP有什么区别?哪一个更好?

    ARM架构与DSP有什么区别?哪一个更好?
    发表于 11-19 06:14

    利用Arm i8mm指令优化llama.cpp

    本文将为你介绍如何利用 Arm i8mm 指令,具体来说,是通过带符号 8 位整数矩阵乘加指令 smmla,来优化 llama.cpp 中 Q6_K 和 Q4_K 量化模型推理。
    的头像 发表于 07-24 09:51 1514次阅读
    利用<b class='flag-5'>Arm</b> i8mm<b class='flag-5'>指令</b>优化llama.cpp

    请帮忙看看这个TI ADR芯片的具体型号

    图片就是这样,验证过,丝印TI 26 ADR也可以用,请大家帮忙给出具体型号,感谢!
    发表于 07-06 23:08

    Analog Devices Inc. ADR1399H-EBZ评估板特性/示意图

    Analog Devices Inc. ADR1399H-EBZ评估板设计用于评估ADR1399超稳定7.05V分压基准,采用4引脚TO-46封装。
    的头像 发表于 06-25 10:38 604次阅读
    Analog Devices Inc. <b class='flag-5'>ADR</b>1399H-EBZ评估板特性/示意图

    Analog Devices Inc. ADR1399精密分流基准数据手册

    Analog Devices Inc. ADR1399精密分流基准在各种电压、温度和静态电流范围内具有出色的温度稳定性。ADR1399在单片基板上结合了温度稳定环路和有源齐纳,几乎消除了电压随温度的变化。
    的头像 发表于 06-24 15:04 599次阅读
    Analog Devices Inc. <b class='flag-5'>ADR</b>1399精密分流基准数据手册

    RISC-V和ARM有何区别

    与RISC-VARM是一种精简指令集(RISC),以该指令集为基础的处理器通常被称为ARM芯片,它在全球范围内得到了极为广泛的应用。而RISC-V也是精简指令集,是美国加
    的头像 发表于 06-24 11:38 1730次阅读
    RISC-V和<b class='flag-5'>ARM</b>有何<b class='flag-5'>区别</b>?

    Analog Devices Inc. ADR3625大电流输出电压基准数据手册

    Analog Devices Inc. ADR3625大电流输出电压基准是低功耗、高精度元件,最大温度系数为3ppm/°C(B级),采用8引线MSOP封装。ADR3625能够提供高达70 mA电流
    的头像 发表于 06-18 11:49 674次阅读
    Analog Devices Inc. <b class='flag-5'>ADR</b>3625大电流输出电压基准数据手册

    Analog Devices Inc. EVAL-ADR3650EBZ评估板数据手册

    Analog Devices EVAL-ADR3650EBZ评估板设计用于评估电路板上包含的ADR3650。该印刷电路板 (PCB) 具有用于GNDS和VOUT引脚、无源器件以及用于更广泛设置
    的头像 发表于 06-14 11:33 697次阅读
    Analog Devices Inc. EVAL-<b class='flag-5'>ADR</b>3650EBZ评估板数据手册

    步进电机控制指令详解

    这些指令主要是针对用 PLC 直接联动伺服放大器,目的是可以不借助其他扩展设备(例如1GM 模块)来进行简单的点位控制, 使用这些指令时最好配合三菱的伺服放大器 (如 MR-J2)。然而,我们也可以用这些指令来控制步进电机的运行
    的头像 发表于 06-12 10:33 1598次阅读
    步进电机控制<b class='flag-5'>指令</b>详解

    arm指令速查手册

    ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,该企业设计了大量高性能、廉价、耗能低的 RISC 处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点,适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP 和移动式应用等。
    发表于 06-05 17:13 1次下载

    ADR1001 adi

    电子发烧友网为你提供ADI(ADI)ADR1001相关产品参数、数据手册,更有ADR1001的引脚图、接线图、封装手册、中文资料、英文资料,ADR1001真值表,ADR1001管脚等资
    发表于 03-12 18:55
    <b class='flag-5'>ADR</b>1001 adi

    乐得瑞LDR6282:双C口DRP及USB PD3.0控制芯片

    乐得瑞LDR6282:双C口DRP及USB PD3.0控制芯片
    的头像 发表于 03-06 15:51 1172次阅读

    Arm主板与x86主板的区别

    等领域中占据了重要地位。本文旨在探讨Arm主板与x86主板之间的区别,分析其在架构、性能、能效、生态系统以及应用场景等方面的差异,以帮助读者更好地理解这两种技术的
    的头像 发表于 01-07 12:21 1430次阅读
    <b class='flag-5'>Arm</b>主板与x86主板的<b class='flag-5'>区别</b>

    ARM嵌入式编程高效技巧

    理解ARM架构 在开始编程之前,深入理解ARM架构的特点和指令集是基础。ARM处理器支持多种指令集,包括
    的头像 发表于 12-28 09:17 1051次阅读

    LDR6500:音频双C支持,数字与模拟的完美结合

    这意味着,在使用LDR6500时,用户不仅可以享受到高品质的音频体验,还能获得稳定的电源供应,满足各种设备的充电需求。无论是将手机连接到支持DP的外设实现高效投屏,还是通过DP-to-C转接线连接
    的头像 发表于 12-09 08:47 859次阅读
    <b class='flag-5'>LDR</b>6500:音频双C支持,数字与模拟的完美结合