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
    +关注

    关注

    134

    文章

    9373

    浏览量

    378641
  • adr
    adr
    +关注

    关注

    0

    文章

    9

    浏览量

    11642
  • LDR
    LDR
    +关注

    关注

    0

    文章

    100

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    利用Arm i8mm指令优化llama.cpp

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

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

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

    RISC-V和ARM有何区别

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

    步进电机控制指令详解

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

    ADR1001 adi

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

    你听说过MIPS吗?它和ARM有何区别

    基于MIPS指令集的君正X2000处理器。有些工程师对于MIPS不怎么了解,究竟MIPS和ARM有何区别呢?本期文对MIPS做一个简单介绍。MIPS和ARM都属于
    的头像 发表于 11-23 01:05 ?830次阅读
    你听说过MIPS吗?它和<b class='flag-5'>ARM</b>有何<b class='flag-5'>区别</b>?

    什么是RISC-V?以及RISC-V和ARM、X86的区别

    指令集架构,为学生和研究人员提供一个更加友好和易于理解的指令集,以便他们更好地学习和研究计算机处理器的设计和开发。 RISC-V与ARM、X86指令集架构的
    发表于 11-16 16:14

    数控车床m99指令用法

    我们将详细介绍M99指令用法。  一、M99指令的基本含义  M99指令是数控车床编程中的一个辅助功能代码,其基本含义是“程序结束并返回到程序开始处”。在数控车床的程序中,M99
    的头像 发表于 10-23 15:52 ?3243次阅读

    指令集架构与微架构的区别

    指令集架构(Instruction Set Architecture,ISA)与微架构(Microarchitecture)是计算机体系结构中的两个重要概念,它们在处理器的设计和实现中扮演着不同的角色。以下是对两者区别的详细阐述。
    的头像 发表于 10-05 15:10 ?1271次阅读

    RISC-V和arm指令集的对比分析

    RISC-V和ARM指令集是两种不同的计算机指令集架构,它们在多个方面存在显著的差异。以下是对这两种指令集的详细对比分析: 一、设计理念 RISC-V :RISC-V的设计理念是简化
    发表于 09-28 11:05

    ARM处理器和CPU有什么区别

    ARM处理器和CPU(中央处理器)之间的关系及区别,可以从多个维度进行深入探讨。首先,需要明确的是,ARM处理器并非一种独立的CPU类型,而是指由ARM公司设计的一系列处理器架构,这些
    的头像 发表于 09-10 11:24 ?3427次阅读

    ARM处理器的指令集包括哪些

    ARM处理器的指令集是一个庞大而复杂的系统,它涵盖了多种类型的指令,用于实现数据处理、程序控制、内存访问等多种功能。
    的头像 发表于 09-10 11:15 ?1622次阅读

    ARM处理器和CISC处理器的区别

    ARM处理器和CISC(复杂指令集计算机)处理器在多个方面存在显著的区别。这些区别主要体现在架构原理、性能与功耗、设计目标、应用领域以及市场生态等方面。
    的头像 发表于 09-10 11:10 ?1010次阅读

    riscv架构和arm区别是什么

    RISC-V和ARM都是流行的指令集架构(ISA),它们在设计、生态系统、应用领域和许可模式等方面有所不同。 RISC-V 1. 开源和免费: RISC-V是一个开源的指令集架构,这意味着任何人
    的头像 发表于 09-07 09:37 ?3356次阅读

    树莓派和arm开发板的区别

    树莓派(Raspberry Pi)和ARM开发板都是基于ARM架构的微型计算机,但它们之间存在一些关键区别。 一、历史背景 树莓派(Raspberry Pi) 树莓派是由英国树莓派基金会
    的头像 发表于 08-30 15:36 ?2033次阅读