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

    文章

    9164

    浏览量

    369061
  • adr
    adr
    +关注

    关注

    0

    文章

    9

    浏览量

    11506
  • LDR
    LDR
    +关注

    关注

    0

    文章

    99

    浏览量

    7633
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

    CISC(复杂指令集)与RISC(精简指令集)的区别  

    的X86 CPU为代表,而RISC以ARM,MIPS,RISC-V,IBM POWER PC 为代表。RISC的设计初衷针对CISC CPU复杂的弊端,选择一些可以在单个CPU周期完成的指令,以降低CPU
    发表于 07-30 17:21

    RV 和ARM有什么区别

    district RV 和ARM有什么区别
    发表于 06-26 12:41

    三菱PLC传送指令用法

    三菱PLC(可编程逻辑控制器)在工业自动化领域中扮演着至关重要的角色。其中,传送指令(MOV)作为PLC编程中的基础指令之一,其正确使用对于实现数据的准确、高效传输至关重要。本文将详细讲解三菱PLC传送指令(MOV)的
    的头像 发表于 06-18 09:41 4596次阅读

    PLC中ALT和ALTP指令区别

    在PLC(可编程逻辑控制器)编程中,ALT和ALTP是两个重要的指令,它们各自具有独特的功能和应用场景。本文将从多个方面对这两个指令进行详细的分析和比较,以便读者能够更深入地理解它们之间的区别
    的头像 发表于 06-17 16:42 4057次阅读

    PLC中SFTL指令用法

    Left Logical)指令是PLC指令集中的一种重要指令,用于处理数据的左移操作。本文将详细阐述PLC指令SFTL的用法,包括其定义、
    的头像 发表于 06-15 17:48 3622次阅读

    数控车床m99指令用法

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

    adrldr什么区别

    adrldr什么区别 还有为啥arm 汇编能反汇编不都已经是汇编了?
    发表于 05-17 06:27

    FPGA与ARM的本质区别

    FPGA(Field-Programmable Gate Array)与ARM在多个方面存在本质区别。 首先,从它们的定义和结构上来看,FPGA是一种现场可编程门阵列,属于可编程器件的一种。它的内部
    发表于 04-28 09:00

    FPGA与ARM的本质区别是什么?

    FPGA(Field-Programmable Gate Array)与ARM在多个方面存在本质区别。 首先,从它们的定义和结构上来看,FPGA是一种现场可编程门阵列,属于可编程器件的一种。它的内部
    发表于 04-28 08:56

    fpga封装技术和arm架构有什么区别

    FPGA封装技术与ARM架构在多个方面存在显著的区别
    的头像 发表于 03-26 15:50 774次阅读

    loop指令用法及功能

    循环指令是计算机编程中的一种基本控制结构,用于重复执行特定的代码块,以实现重复操作、批处理和自动化等功能。循环指令在编程中具有广泛的应用场景,并且使用循环可以大大提高代码效率和减少冗余。 循环指令
    的头像 发表于 02-14 16:12 2352次阅读