一 先让咱们看一段汇编代码
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
原来如此。