ARM汇编ADR,LDR等伪指令

 arm中LDR伪指令与LDR加载指令LDR伪指令的形式是“LDR Rn,=expr”。下面举一个例子来说明它的用法。 COUNT EQU 0x40003100 …… LDR R1,=COUNT MOV R0,#0 STR R0,[R1] COUNT是我们定义的一个变量,地址为0x40003100.这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法。 LDR R1,=COUNT是将COUNT这个变量的地址,也就是0x40003100放到R1中。 MOV R0,#0是将立即数0放到R0中。最后一句STR R0,[R1]是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。实际就是将0放到地址为0x40003100的存储单元中去。可 见这三条指令是为了完成对变量COUNT赋值。用三条指令来完成对一个变量的赋值,看起来有点不太舒服。这可能跟arm的采用RISC有关。 下面还有一个例子 ;将COUNT的值赋给R0 LDR R1,=COUNT LDR R0,[R1] LDR R1,=COUNT这条伪指令,是怎样完成将COUNT的地址赋给R1,有兴趣的可以看它编译后的结果。这条指令实际上会编译成一条LDR指令和一条 DCD伪指令。

  请问ARM指令LDR和arm伪指令LDR有什么区别伪指令LDR{cond} register, ={expr|label-expr} expr为32为常量。编译器根据expr的取值情况来处理这条伪指令:1、当expr表示的地址没有超过mov或mvn指令中地址的取值范围时,编译器用合适的mov指令或mvn指令代替该LDR伪指令。

  2、当expr表示的地址超过了mov或mvn指令中地址的取值范围时,编译器将该常数放在缓冲区中,同时用一条基于PC的LDR指令读取该常数。

  ……

  通过上面两种可以得出伪指令LDR和arm指令LDR的区别,具体使用时,可以不用考虑二者的区别,由编译器决定的,看源码时,你只要搞清楚它的功能就行。

  第一个就是把0xf830这个值放到r2中去,第二个和第三个的意义也是一样的。最后一条指令应该是错误的。

  由 于arm是risc精简指令集,指令都是32位的,在编码中操作码,目标和源寄存器是要占掉32位一部分,所以一条指令里面不可能存一个32位的立即数, 所以arm提供了一条伪指令来完成一条指令load一个32位的立即数。方法是在这条指令附近放要load的值,再利用当前的pc+偏移load这个数, 注意ldr的原来的意义是将内存的某个值load到寄存器里面。

  比如:ldr r0, =0x5000010经过arm的assembler的翻译实际上就是:ldr r0, [pc+#0x4] ;;指令是4byte 32位,就是将内存中下一个word放到r0中0x500010 ;;这个地方放的是数值这里,0x4是在它立即数的范围内的具体的看看文档,ads的pdf目录下有一个AssemblerGuide arm指令中mov和ldr的区别arm是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。

  比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中。

  而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。

  x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。

  另外还有一个就是ldr伪指令,虽然ldr伪指令和arm的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:ldr r0, =0x12345678这 样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超 过512.而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令 的。

  ldr伪指令和ldr指令不是一个同东西。

  LDR R1,=COUNT MOV R0,#0 STR R0,[R1] COUNT是我们定义的一个变量,地址为0x40003100.这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法。

  LDR R1,=COUNT是将COUNT这个变量的地址,也就是0x40003100放到R1中。

  MOV R0,#0是将立即数0放到R0中。最后一句STR R0,[R1]是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。实际就是将0放到地址为0x40003100的存储单元中去。可 见这三条指令是为了完成对变量COUNT赋值。用三条指令来完成对一个变量的赋值,看起来有点不太舒服。这可能跟arm的采用RISC有关。

  arm伪指令之地址读取:ADR ADRL LDR 1、ADR伪指令—— 小范围的地址读取ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器 中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不 能用一条指令实现,则产生错误,编译失败。

  ADR伪指令格式 :ADR{cond} register, expr地址表达式expr的取值范围:当地址值是字节对齐时,其取指范围为: +255 ~ 255B;当地址值是字对齐时,其取指范围为: -1020 ~ 1020B;2、ADRL伪指令——中等范围的地址读取ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。

  ADRL伪指令格式:ADRL{cond} register, expr地址表达式expr的取值范围:当地址值是字节对齐时,其取指范围为: -64K~64K;当地址值是字对齐时,其取指范围为: -256K~256K;3、LDR伪指令——大范围的地址读取LDR 伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或 MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。

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

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

相关文章

分享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或者缓存代理之上的负载…

连接网络后浏览器却上不了网

解决在IE浏览器中 更新后的系统IE浏览器需要搜索才能出现 完成

python验证码重叠_用Python机器学习搞定验证码

写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种:图像类滑动类点击类语音类今天先来看看图像类,这类验证码大多是数字、字母的组合,国内也有使用汉字的。在这个基础上增加噪点、干扰线、变形、重叠、不同字体颜色等…

ecshop 函数列表大全

ecshop 函数列表大全 所有函数功能说明:lib_time.phpgmtime()P: 获得当前格林威治时间的时间戳 /$0server_timezone()P: 获得服务器的时区 /$0local_mktime($hour NULL , $minute NULL, $second NULL, $month NULL, $day NULL, $year NULL)P: 生成一个用户自定义时区日期的…

shell环境变量以及set,env,export的区别

一.shell环境变量的分类以及set env export的区别: set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell有不同的私有变量 bash,ksh,csh每中shell私有变量都不一样 env:显示(设置)用户变量变量 export:显示(设置)当前导出成用户变量的shell变量。 举…