ARM汇编ADR,LDR等伪指令

发布者:数字思维最新更新时间:2016-01-12 来源: eefocus关键字: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中,0x5000010 这个地方放的是数值,这里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,小范围的地址读取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指令从文字池读出常量。


关键字:ARM  汇编  ADR  LDR  伪指令 引用地址:ARM汇编ADR,LDR等伪指令

上一篇:ARM菜鸟成长记--之二
下一篇:ARM菜鸟成长记——之一

推荐阅读最新更新时间:2024-03-16 14:43

解密ARM A17处理器
  移动设备的更新迭代速度已经达到了目不暇接的程度,刚拿到的一款产品还没几天,下一代就出来了。细心的人不难发现,即便产品在快速迭代,其内部的处理器更新速度却远远慢于产品的速度。   ARM的A7,A9处理器已经推出了很长时间,其优秀的性能受到市场的普遍认可,其市场占有率也一直居高不下。这几年间,ARM一直在试图推出更新更好的产品来顶替A7和A9。   前有A15,后有A12,采用新技术的处理器却一直没有真正的走向市场。   鉴于A15,A12不温不火的情况,ARM今年推出了最新的中端产品A17。   ARM全球市场营销副总裁Ian Ferguson在A-17产品发布会上表示,相较于目前引领主流移动市场的A9,A17在处理性能方面显
[电源管理]
ARM2210的智能移动机器人人机界面设计
引言   嵌入式系统以其高性能、低功耗、低成本的优点,已经在很大程度上改变了人们的生活。如,MP3播放器、智能手机、数码相机产品等已经渗入人们生活的各个方面。随着液晶显示技术的不断进步,以及图形用户界面GUI (Graphical User Interface)技术的广泛应用,人机界面也越来越友好。它能为移动机器人的运动控制提供直观的路径图形、数据参数等。本文介绍了一种以嵌入式微处理器LPC2210为基础,应用ZLG/GUI软件包设计移动机器人人机界面的方法。   我们设计开发的智能移动机器人是一个以PC104嵌入式微机为中心处理器, TMS320F2812为运动控制器,超声波传感器作为避障的集合环境感知、动态决策与规划、行为控
[嵌入式]
汇编语言写一个温度传感显示器程序
读ADC和测温度. ;用STC的MCU的IO方式控制74HC595驱动8位数码管。 ;用户可以修改宏来选择时钟频率. ;用户可以在 用户定义宏 中选择共阴或共阳. 推荐尽量使用共阴数码管. ;使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms. ;左边4位数码管显示ADC2接的电压基准TL431的读数, 右边4位数码管显示温度值, 分辨率0.1度. ;NTC使用1%精度的MF52 10K@25度C. ;测温度时, 为了通用, 使用12位的ADC值, 使用对分查找表格来计算, 小数点后一位数是用线性插补来计算的. ;所以, 测温度的ADC3进行4次ADC连续采样,
[单片机]
使用STM32F4XX自带数学库"arm_math.h"
STM32-F4属于Cortex-M4F构架,这与M0、M3的最大不同就是具有FPU(浮点运算单元),支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,除了#include arm_math.h (而非用编译器自带的math.h)以外,(arm_math.h位于LibrariesCMSISInclude文件夹)还需要进行设置。 1、代码设置 如果没有启动FPU而使用数学函数运算时,CPU执行时认为遇到非法指令而跳转到HardFault_Handler()中断函数中死循环。因此,需要在系统初始化时开启FPU。在system_stm32f4xx.c中的Sys
[单片机]
arm开发板的一些常用命令
这写记录是我经常忘记的东西:做个笔记在这里 1、reboot 是重启的意思。 2、source 是使那些修改的文件立即生效,避免了重启之后才能生效的问题,例如我们修改了/etc/profiile,修改之后不能立即生效。这时我们输入 source /etc/profile 就可以生效了 这些以后还会继续更新。 3、chmod -R 777 /home/edu/practice 设置practice文件夹里面的所有的文件权限为777 4、压缩单个文件:gzip -v etc.c 生成的压缩名为:etc.c.gz 5、压缩多个文件:gzip -v * //压缩当前目录下的所有文件 “*” 匹配任何非隐藏文件
[单片机]
ARM的开发步骤总结
1. 做个最小系统板:如果你从没有做过ARM的开发,建议你一开始不要贪大求全,把所有的应用都做好,因为ARM的启动方式和dsp或单片机有所不同,往往会遇到各种问题,所以建议先布一个仅有Flash,SRAM或SDRAM、CPU、JTAG、和复位信号的小系统板,留出扩展接口。使最小系统能够正常运行,你的任务就完成了一半,好在ARM的外围接口基本都是标准接口,如果你已有这些硬件的布线经验,这对你来讲是一件很容易的事情。 2. 写启动代码,根据硬件地址先写一个能够启动的小代码,包括以下部分: 初始化端口,屏蔽中断,把程序拷贝到SRAM中;完成代码的重映射;配置中断句柄,连接到C语言入口。也许你看到给你的一些示例程序当中,bootloa
[单片机]
OpenCV2.0.0移植到ARM9(五)(JZ2440----S3c2440)
Linux系统:Ubuntu9.10 交叉编译器:arm-linux-gcc-4.3.2(已安装) Qt:qt-x11-opensource-src-4.5.3.tar.gz qt-embedded-linux-opensource-src-4.5.3.tar.gz 1、安装Qt Qt下载地址:https://www.qt.io/download-open-source/ 这里下载的安装包为:qt-embedded-linux-opensource-src-4.5.3.tar.gz(大小123MB) 2、安装Qt-x11 将qt-x11-opensource-src-4.5.3.tar.gz包放到U
[单片机]
OpenCV2.0.0移植到<font color='red'>ARM</font>9(五)(JZ2440----S3c2440)
一种基于ARM9的彩色TFT-LCD模块设计及实现
   1 引 言   TFT-LCD因其厚度薄且画面质量优异,可以实现信息的高速度、高亮度及高对比度显示,已广泛应用于图像显示系统中。虽然TFT-LCD具有良好的显示性能,但TFT-LCD的驱动信号非常复杂,同时外围的控制单元需要处理的数据量非常大,以一个分辨率为640×480的彩色TFT-LCD为例,显示一幅彩色图像就需要处理900kbyte的数据量,这对于传统的单片机等处理器显得无能为力。由于图像数据量大,目前图像大都采用压缩后再存储,其中JPEG (Joint PhotographicExperts Group)格式的压缩图像应用最为广泛。   为了解决图像等大容量数据在TFT-LCD显示屏上的应用,本文提出了一种基于A
[单片机]
一种基于<font color='red'>ARM</font>9的彩色TFT-LCD模块设计及实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved