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

 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在程序中可以实现绝对转移。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js解释器rhino查看执行环境

rhino是一个Mozilla的开源的由java写的javascript解释器。 文档地址 https://developer.mozilla.org/en/Rhino_documentation 安装方法 http://www.terminally-incoherent.com/blog/2008/01/08/rhino-scripting-java-with-javascript 安装。 ubuntu下直接 sudo apt-get insta…

mapgis转arcgis数据后发现属性表内没有数据

示例: 编辑点属性结构 将注释赋为属性

对python生态系统的认识_SAS,R与Python的区别详细对比

本文概述在本主题中, 我们将比较这三种语言的各个方面, 以使你对这些语言的市场价值和功能有清晰的认识, 以便你可以选择可以向前发展的语言。众所周知, 要学习数据分析, 可以使用三种重要的语言, 分别是Python, R和SAS。如果你是数据科学界的新手, 并且没有上述任何一种语言的…

ARM汇编ADR,LDR等伪指令

arm中LDR伪指令与LDR加载指令LDR伪指令的形式是“LDR Rn,expr”。下面举一个例子来说明它的用法。 COUNT EQU 0x40003100 …… LDR R1,COUNT MOV R0,#0 STR R0,[R1] COUNT是我们定义的一个变量,地址为0x40003100.这中定…

分享50款非常漂亮的桌面壁纸

我喜欢根据季节更换桌面壁纸,换上一张清爽的桌面壁纸,心情也会变得舒畅。所以,今天我为大家收集了一批夏天壁纸,虽然夏天还未到来,不过这些壁纸真的非常漂亮,尽情欣赏吧。 (编译来源&#xff1a…

获取字段 命名空间和类_系统架构之命名规范

数据库设计规范表设计规范表名全部小写,单词间通过_间隔主键命名为id,类型为Long,长度为20位,非自增2. 外键及索引命名规范唯一索引:ux_表名_索引字段。如:ux_resource_code普通索引:ix_表名_索…

arcgis创建剖面线execl文件

如何快速创建剖面线,参考https://blog.csdn.net/qq_39397927/article/details/118730100 由于创建完的剖面线不带有野外编号,所以我们需要进行空间连接,因为斜坡单元转点后的数据是具有编号,所以进行空间连接将斜坡编号赋值给剖面…

VMWare网络设置的3中方式

一 VMware网络设置的三种方式 1 Host-only连接方式 让虚机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚机IP地址位于同一网段。最终结果是新建了一个由所有虚机与宿主主机…

跨行取款费用银行|工行|建设|农行|中行|各大银行

跨行ATM 跨行取款费用 中行(中国银行):同城跨行4元/笔;省内跨行9元/笔;省外跨行12元/笔;境外15元/笔。 建行(建设银行):同城跨行收取2元/笔,异地跨行(省内/…

arcgis计算地形起伏度

不懂的方面请进群询问

Ubuntu中用gedit保存文件失败的解决办法

1、Ubuntu中用gedit编辑文件后不能保存 这是因为没有相关文件的写权限,更改文件权限使用chmod命令,参见P289 2、Ubuntu中用gedit保存文件时,提示要生成备份文件,但又提示备份文件无法写入 用ls -l命令查看文件的权限发现&#xff…

由于在客户端检测到一个协议错误_TLS协议的分析

TLS概述TLS(传输层安全性)协议基于SSL(安全套接字层)协议,该协议最初由Netscape开发,用于增强Internet上的电子商务安全性。SSL是在应用程序级实现的,直接位于TCP(传输控制协议&…

oracle 9i从入门到精通读书笔记2

第二章:PL/SQL基础 2.1 PL/SQL程序结构 2.1.1 PL/SQL块的类型 所有的PL/SQL程序都是以块作为基本单位,以及都是由块组成的。 这些块可以是按顺序出现的,也可以是嵌套的 块可以根据其带名称和不带名称以及在数据库中的存储方式分为以下类型&am…

利用envi对landsat8数据进行处理

envi5.3打开landsat头文件数据有问题 应用商店插件下载链接附有安装教程 envi应用商店.zip_envi商店-互联网文档类资源-CSDN下载 需要在应用商店下载对应工具 点击下载好的工具 此处点击完后直接在envi最上面open文件landsat头文件 选择波段加载影像 进行辐射定标 选择多光谱…

multibin

为提高boot引导速度,,需支持multibin。方法如下:1.D:\WINCE600\PLATFORM\SMDKV210\SMDKV210.batREM For Multiple XIP (using demand paging on BINFS)set IMGMULTIXIP12.调整config.bib镜像大小由于系统生成的XIPKERNEL约为3M。大于默认设置。所以改大到…

利用arcgis对斜坡单元批量后处理

之前作者利用arcgis自定义工具箱创建了利用dem生成斜坡单元的工具箱,工具箱下载链接如下 ArcGIS自动生成斜坡单元_arcgis生成斜坡单元,arcgis斜坡单元-互联网文档类资源-CSDN下载 在前几天用户使用过程中出现了一些问题 发现工作空间还是作者电脑路径 需要将此取…

python复制文件的代码_python 复制文件流程

例子代码:[rootmaster script]#vim copy_file.py#!/usr/bin/python#-*- coding:utf-8 -*-old_file_name raw_input("Please input you need copys file name:")old_file open(old_file_name,r)new_file open(langwang.txt,w)contentold_file.read()new_fi…

java指令和javac指令总结

假如在D:\Java存放了两个java源文件:MyJava.java,Fighting.javaMyJava.java如下:public class MyJava { public static void main(String[] arr) { System.out.println("MyJava"); }}Fighting.java如下:package mxw.…

大型网站的负载均衡器、db proxy和db

大型网站的负载均衡器、db proxy和db 本文主要分析网站后台架构中的负载均衡器,企业常用的硬件负载均衡器软件负载均衡器、数据库代理服务器和数据库。 1.1 负载均衡 在大型网站部署中,负载均衡至少有三层部署。第一层为web server或者缓存代理之上的负载…