ARM中的ADR ADRL LDR

发布者:BlissfulHeart最新更新时间:2016-07-13 来源: eefocus关键字:ARM中  ADR  ADRL  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指令从文字池读出常量。

关键字:ARM中  ADR  ADRL  LDR 引用地址:ARM中的ADR ADRL LDR

上一篇:ARM的启动代码(3):异常向量
下一篇:ARM伪指令之地址读取:ADR/ADRL/LDR

推荐阅读最新更新时间:2024-03-16 15:00

平民价格高端体验——arm重塑端智能机图像性能
“目前在移动世界发生了什么变化呢?消费者的使用行为发生了变化,智能手机已成为打通人类通向世界的网关。”arm资深市场营销总监Ian Smythe表示。 arm资深市场营销总监Ian Smythe 对于arm来说,Ian认为最大的使命是实现全人类的连接,所以随着人们对机器学习、3D游戏以及混合现实的需求越来越强烈,这些以往都属于高端智能机的应用必须普及,为此,arm推出了一系列图形处理器产品,以满足主流的处理器对于各种各样的计算任务的胜任。 关于AI,arm准备了更多 “Arm处理器已经成为当今人工智能演进过程中的核心部分了。”Ian表示,根据IDC的市场调查显示,目前市场上90%具有人工智能能力的设备是基于a
[嵌入式]
平民价格高端体验——<font color='red'>arm</font>重塑<font color='red'>中</font>端智能机图像性能
ARM7与FPGA相结合在工业控制和故障检测的应用
  工业控制中往往需要完成多通道故障检测及多通道命令控制(这种多任务设置非常普遍),单独的CPU芯片由于其外部控制接口数量有限而难以直接完成多路检控任务,故利用ARM芯片与FPGA相结合来扩展检控通道是一个非常好的选择。这里介绍用Atmel公司ARM7处理器(AT91FR40162)和ALTERA公司的低成本FPGA芯片(cyclone2)结合使用完成多通道检控任务的一种实现方法。    各部分功能简介   图1为此系统的结构连接框图。如图所示,ARM芯片与FPGA芯片之间通过数据总线、地址总线及读写控制线相连,而与终端PC则通过串口通信;FPGA与目标设备通过命令控制总线和故障检测总线相连。 图1 系统结构框图
[嵌入式]
iOS逆向工程之HopperARM指令
一、Hopper中的ARM指令 ARM处理器就不多说了,ARM处理器因为低功耗等原因,所以大部分移动设备上用的基本上都是ARM架构的处理器。当然作为移动设备的Android手机,iPhone也是用的ARM架构的处理器。如果你想对iOS系统以及你的应用进一步的了解,那么对ARM指令集的了解是必不可少的,ARM指令集应该也算得上是iOS逆向工程的基础了。 当你使用Hopper进行反编译时,里边全是ARM的指令,那是看的一个爽呢。下面就是使用Hopper打开MobileNote.app的一个Hopper的界面。从主窗口中可以看到全是ARM的指令呢,如果你对ARM指令不了解,那么如何进行分析呢,对吧。所以对ARM指令的了解,是iOS逆
[单片机]
iOS逆向工程之Hopper<font color='red'>中</font>的<font color='red'>ARM</font>指令
ARM 必须明白的几个概念
  文章具体介绍了关于ARM的22个常用概念。   1.ARM中一些常见英文缩写解释   MSB:最高有效位;   LSB:最低有效位;   AHB:先进的高性能总线;   VPB:连接片内外设功能的VLSI外设总线;   EMC:外部存储器控制器;   MAM:存储器加速模块;   VIC:向量中断控制器;   SPI:全双工串行接口;   CAN:控制器局域网,一种串行通讯协议;   PWM:脉宽调制器;   ETM:嵌入式跟踪宏;   CPSR:当前程序状态寄存器;   SPSR:程序保护状态寄存器;   2.MAM 使用注意事项:   答:当改变 MAM 定时值时,必须先通过向 MAMCR 写入 0 来关闭 MAM,然
[单片机]
ARM的step内存到SDRAM内存代码复制程序调试之罪魁祸首 ADRLDR
start.S启动的汇编代码 #define S3C2440_MPLL_200MHZ ( (0x5C 12)|(0x01 4)|(0x02) ) #define MEM_CTL_BASE 0x48000000 .text .global _start _start: /*1关看门狗*/ mov r0,#0x53000000 mov r1,#0 str r1, /*2设置时钟*/ ldr r0,=0x4C000014 mov r1,#0x03 str r1, mrc p15,0,r1,c1,c0,0 orr r1,r1,#0xc0000000 mcr p15,0,r1,c1,c0,0 ldr
[单片机]
ARMMMU之地址转换
最近看了看mmu,找了好多资料,看了好多博文终于稍微清楚了一点,现在我把自己理解的内容总结一下: 首先我来说一下MMU的作用,MMU就是负责虚拟地址(virtual address)转化成物理地址(physical address)。 下面我来说一下ARM CPU上的地址转换过程涉及三个概念:虚拟地址(VA)(CPU内核对外发出VA),变换后的虚拟地址(MVA)(VA被转换为MVA供cache和MMU使用,在此将MVA转换为PA),物理地址(PA)(最后使用PA读写实际设备)。 (1)CPU看到的用到的只是VA,CPU不管VA最终是怎样到PA的; (2)而cache、MMU也是看不到VA的,它们使用的是MVA(VA到MVA的转
[单片机]
ARM开发几个常见的寄存器详解
1、介绍 FP:栈顶指针,指向一个栈帧的顶部,当函数发生跳转时,会记录当时的栈的起始位置。 SP:栈指针(也称为栈底指针),指向栈当前的位置, LR:链接寄存器,保存函数返回的地址。 关于gcc就有一个关于stack frame的优化选项,加上该选项则忽略掉FP栈顶指针,(记得高版本默认是不加FP的,gcc4.8以上吧(待确认)) -fomit-frame-pointer Don’t keep the frame pointer in a register for functions that don’t need one. This avoids the instructions to save, set up a
[单片机]
如何修改arm LinuxPrintk的等级
首先,printk有8个loglevel,定义在 linux/kernel.h 中,其中数值范围从0到7,数值越小,优先级越高。 #define KERN_EMERG 0 系统崩溃 #define KERN_ALERT 1 必须紧急处理 #define KERN_CRIT 2 临界条件,严重的硬软件错误 #define KERN_ERR 3 报告错误 #define KERN_WARNING 4 警告 #define KERN_NOTICE 5 普通但还是须注意 #def
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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