热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

ARM中的ldr指令与adr、ldr伪指令之间的区别

ARM汇编语言中有ldr指令和ldr、adr伪指令,他们都可以将标号表达式作为操作数。区别如下:ldr指令和adr、ldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的&

 ARM汇编语言中有ldr指令和ldradr伪指令,他们都可以将标号表达式作为操作数。区别如下:

ldr指令和adrldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的值;adrldr伪指令用于获取标号的地址。

adrldr伪指令的区别:adr是获取相对PC的地址,与程序当前运行的位置相关,是小范围的地址读取伪指令;ldr是获取绝对地址,绝对地址是在link的时候确定的,它与程序当前运行位置无关,是大范围读取地址伪指令。

下面通过分析一段代码以及对应的反汇编接过来说明他们的区别。

       ldr r0,_start

       adr r0,_start

       ldr r0,=_start

_start:

       b _start

       编译的时候设置r00x30000000,下面是反汇编的结果:

0x00000000:e59f0004   ldr r0,[pc,#4]    ;0xc

0x00000004:e28f0000   add r0,pc,#0     ;0x0

0x00000008:e59f0000   ldr r0,[pc,#0]    ;0x10

0x0000000c:eafffffe     b  0xc

0x00000010:3000000c   andcc r0,r0,ip

       1.ldr r0,_start

       这是一条指令,从内存地址_start的位置装载该地址存放的数据。

       在这里_start是一个标号(是一个相对程序的表达式),汇编程序计算相对于PC的偏移量,并生成相对于PC的前索引的指令:ldr r0,[pc,#4]。指令执行后,r0=0xeafffffe(计算方法:r0 = [pc(0x00000000+8)+4]= [0x0000000c] = 0xeafffffe)。

       ldr r0,_start是根据_start对当前PC的相对位置读取其所在地址的值,因此可以在和_start标号的相对位置不变的情况下获取数据值。

       2.adr r0,_start

       这是一条伪指令,总是会被汇编程序会变为一个指令,汇编程序尝试产生单个ADDSUB指令来装载该地址。如果不能在一个指令中构造该地址,则生成一个错误,并且汇编失败。

       这里是取得标号_start的地址到r0,因为地址是相对程序的,因此adr的产生依赖于位置的代码,在此例中被汇编成:add r0,pc,#0。因此该代码可以在和标号相对位置不变的情况下移动。

       假如这段代码在0x30000000运行,那么adr r0,_start得到r0 = 0x3000000c;如果在地址0运行,那么就是0x0000000c了。

       通过这一点可以判断程序在什么地方运行。U-Boot中那段relocate代码就是通过adr实现当前程序是在RAM中还是FLASH中。

       3.ldr r0,=_start

       这是一条伪指令,_start是一个绝对地址(也即运行地址)。这个绝对地址是在链接的时候确定的,它占用232bit的空间,一条是指令,另一条是文字池中存放_start的绝对地址。在此例中生成的指令为:ldr r0,[pc,#0],对应文字池中的地址以及值为:0x00000010:3000000c,因此该伪指令执行后r0的值为0x3000000c。因此可以看出,不管这段代码将来在什么地方运行,它的结果都是r0=0x3000000c

       由于ldr r0,=_start取得的是_start的绝对地址,这句代码可以在_start标号的绝对位置不变的情况下移动,如使用寄存器pc在程序中可以实现绝对转移。


推荐阅读
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了StartingzookeeperFAILEDTOSTART相关的知识,希望对你有一定的参考价值。下载路径:https://ar ... [详细]
  • 本文介绍了2020年计算机二级MSOffice的选择习题及答案,详细解析了操作系统的五大功能模块,包括处理器管理、作业管理、存储器管理、设备管理和文件管理。同时,还解答了算法的有穷性的含义。 ... [详细]
author-avatar
松恋崖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有