您的位置 首页 被动

ARM微处理器的指令集概述四——MOV和LDR的差异

一先让我们看一段汇编代码LDRR0,=0x56000010#R0issettoberegisterGPBCONandisusedtoselectpinfunctionf…

一 先让咱们看一段汇编代码

LDR R0,=0x56000010 #R0 is set to be register GPBCON and is used to select pin function for Port B #in,out special function and others MOV R1,#0x00004000 STR R1,[R0] #pin GPB7 is set to be output port

以上三条汇编查办的功用是将数值0x00004000存储到以0x56000010为地址的存储单元中。

其反汇编代码如下

0:   e59f0044        ldr     r0, [pc, #68]   ; 0x4c4:   e3a01901        mov     r1, #16384      ; 0x40008:   e5801000        str     r1, [r0]......4c:   56000010        undefined

可见LDR R0,=0x56000010 被转换成ldr指令来碑文

二 再看

LDR R0,=0x56000000  MOV R1,#0x00004000STR R1,[R0]  

其反汇编代码如下

0:   e3a00456        mov     r0, #1442840576 ; 0x560000004:   e3a01901        mov     r1, #16384      ; 0x40008:   e5801000        str     r1, [r0]

这儿LDR R0,=0x56000000 被转换成mov r0, #1442840576

也就是说LDR伪指令是依据后边的数据值来决议转换为ldr指令或MOV指令碑文。

那么同样是给R0赋值,LDR R0,=0x56000010 能否用mov r0, #0x56000010来替代呢,

三 由此可见MOV和LDR的差异

mov指令后边的当即数是有约束的,这个当即数必须由一个8位的二进制数通过偶数次右移后得到才合法数据

LDR R0,=0x56000000 被转换成mov r0, #0x56000000,其间当即数0x56000000是能够由0x56通过循环右移得到的,而0x56000010无法通过一个8位的二进制数通过偶数次右移后得到,所以无法转换成mov指令来完成。

四 再举例如下:

mov R0,#0x101mov R0,#0xFF1

以上两条指令都不正确,由于当即数不合法。

这样的话用MOV指令是比较费事的,由于有些简略的数据比较简单看出来,有些数据即不简单看出来是否是合法数据。

五 运用ldr伪指令处理这个问题

为了处理这个问题,咱们能够用LDR伪指令来完成,依据后边的当即数来决议转换为ldr指令或MOV指令碑文,契合MOV指令的当即数合法性要求就转换为MOV指令,不契合的话就转换为LDR加载指令来完成。

在Uboot源码中看到这样一条指令 MOV r1,#0xFFFFFFFF

有点隐晦,检查反汇编代码如下

mvn r1,#0

原来如此。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部