您的位置 首页 元件

LDR 和MOV 指令差异

ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只能使用…

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指令的格局:

LDR{条件} 意图寄存器 <存储器地址>

效果:将 存储器地址 所指地址处接连的4个字节(1个字)的数据传送到意图寄存器中。

LDR指令的寻址方法比较灵敏,实例如下:

LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。

LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。

LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。

LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2的值存入R1。

LDR R0,[R1],#8 ;将存储器地址为R1的字数据读入寄存器R0,并将R1+8的值存入R1。

LDR R0,[R1,R2]! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将R1+R2的值存入R1。

LDR R0,[R1,LSL #3] ;将存储器地址为R1*8的字数据读入寄存器R0。

LDR R0,[R1,R2,LSL #2] ;将存储器地址为R1+R2*4的字数据读入寄存器R0。

LDR R0,[R1,,R2,LSL #2]! ;将存储器地址为R1+R2*4的字数据读入寄存器R0,并将R1+R2*4的值存入R1。

LDR R0,[R1],R2,LSL #2 ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2*4的值存入R1。

LDR R0,Label ;Label为程序标号,Label有必要是当时指令的-4~4KB范围内。

要注意的是

LDR Rd,[Rn],#0x04 ;这儿Rd不允许是R15。

别的LDRB 的指令格局与LDR类似,只不过它是将存储器地址中的8位(1个字节)读到意图寄存器中。

LDRH的指令格局也与LDR类似,它是将内存中的16位(半字)读到意图寄存器中。

LDR R0,=0xff

这儿的LDR不是arm指令,而是伪指令。这个时分与MOVE很类似,只不过MOV指令后的当即数是有约束的。这个当即数有必要是0X00-OXFF范围内的数通过偶数次右移得到的数,所以MOV用起来比较费事,由于有些数不那么简单看出来是否合法。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/264046.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部