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

    文章

    8647

    浏览量

    361733
  • adr
    adr
    +关注

    关注

    0

    文章

    9

    浏览量

    11447
  • LDR
    LDR
    +关注

    关注

    0

    文章

    92

    浏览量

    7435
收藏 人收藏

    评论

    相关推荐

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

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

    loop指令用法及功能

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

    ARM指令的寻址方式有几种?试分别举例说明

    ARM指令的寻址方式有几种?试分别举例说明  ARM指令集的寻址方式有基址寻址、立即寻址、寄存器寻址、寄存器间接寻址、寄存器相对寻址、相对基址寻址等多种方式。下面将逐一详细介绍这些寻址
    的头像 发表于 01-29 18:10 646次阅读

    三菱FX系列PLC置位与复位指令的使用教程

    有关三菱PLC置位与复位指令的功能说明,以FX2N为例,介绍其基本逻辑指令和步进指令用法,置位与复位指令(SET/RST),SET 、RS
    发表于 12-26 10:19 1120次阅读
    三菱FX系列PLC置位与复位<b class='flag-5'>指令</b>的使用教程

    ADR530基准电源如何使用?

    需要采集电流电压,所以需要一个基准源,选取ADR530,看了技术手册还是不太明白,它的具体用法?希望使用过的朋友给些建议。谢谢
    发表于 12-13 08:10

    plsy指令具体用法

    、WAV等。下面将详细介绍plsy的用法。 安装: 在使用plsy之前,首先需要在Unix系统中安装。你可以通过在终端上运行以下命令来安装plsy: sudo apt-get install plsy
    的头像 发表于 12-08 14:10 823次阅读

    ADR4520/ADR4525/ADR4530/ADR4533/ADR4540/ADR4550低噪声基准电压源

    电子发烧友网站提供《ADR4520/ADR4525/ADR4530/ADR4533/ADR4540/AD
    发表于 11-22 15:06 0次下载
    <b class='flag-5'>ADR</b>4520/<b class='flag-5'>ADR</b>4525/<b class='flag-5'>ADR</b>4530/<b class='flag-5'>ADR</b>4533/<b class='flag-5'>ADR</b>4540/<b class='flag-5'>ADR</b>4550低噪声基准电压源

    讲讲ARM指令集格式以及常用的ARM汇编指令

    对于搞嵌入式驱动或者操作系统的人来说,掌握汇编语言的使用还是比较重要的,毕竟有时候在分析定位问题的时候,多多少少都会有汇编的身影。本文主要讲讲ARM指令集格式以及常用的ARM汇编指令
    的头像 发表于 11-08 12:34 1000次阅读
    讲讲<b class='flag-5'>ARM</b><b class='flag-5'>指令</b>集格式以及常用的<b class='flag-5'>ARM</b>汇编<b class='flag-5'>指令</b>

    MCS51汇编中的DATA是伪指令吗?具体用法是什么?

    MCS51汇编中的DATA是伪指令吗?具体用法是什么?
    发表于 11-02 08:17

    如何在特权模式下用arm汇编指令使能和禁止irq中断?

    如何在特权模式下用arm汇编指令使能和禁止irq中断? 在 ARM 系统中,中断是非常常见的一种事件。在特权模式下,可以使用 ARM 汇编指令
    的头像 发表于 10-19 16:42 776次阅读

    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 Current Output Voltage
    发表于 10-12 18:46
    <b class='flag-5'>ADR</b>3625/<b class='flag-5'>ADR</b>3630/<b class='flag-5'>ADR</b>3650: Precision, Micropower, High Current Output Voltage References Data Sheet <b class='flag-5'>ADR</b>3625/<b class='flag-5'>ADR</b>3630/<b class='flag-5'>ADR</b>3650: Precision, Microp

    欧姆龙比较指令用法 欧姆龙cmp指令用法

    首先我们了解一下欧姆龙CMP指令,CMP指令是一种用于比较两个数值的指令,常用于控制系统中的逻辑判断和决策。该指令可以比较两个16位的数据,如果它们相等,则将零标志位设置为1,否则将其
    发表于 08-23 11:12 2705次阅读
    欧姆龙比较<b class='flag-5'>指令</b>的<b class='flag-5'>用法</b> 欧姆龙cmp<b class='flag-5'>指令</b><b class='flag-5'>用法</b>

    rh850和arm区别

    rh850和arm区别 RH850和ARM是两种不同的处理器架构。RH850是一款Renesas芯片家族,它基于32位RISC架构,广泛应用于汽车电子和工业控制系统等领域。ARM也是
    的头像 发表于 08-15 16:22 928次阅读

    SCL语言for指令用法

    小文老师说在最前面: 今天来给大家讲一下for这个指令用法,在PLC编程中,能用好for指令,会让我们的开发效率更高,想要更好的调用for指令,我们今天通过这篇文章,几分钟的时间带你严
    的头像 发表于 06-19 14:51 1605次阅读
    SCL语言for<b class='flag-5'>指令</b>的<b class='flag-5'>用法</b>

    Cortex-A7常用汇编指令

    学习Cortex-A7的常用汇编指令MOV、MSR、MRS、LDR、STR、PUSH、POP、STMFD、LDRMFD、B、BL、BX、BLX指令
    的头像 发表于 04-30 10:22 26.2w次阅读