汇编指令---mov解析

在使用mini2440,cpu如何从跳转到SDRAM 执行时。有句代码如下:

关闭看门狗:

mov r1,     #0x53000000
mov r2,     #0x00
str r2,  	 [r1]	

mov指令等用法又是什么呢?(后面补)。

数据传送指令mov, 寄存器到寄存器,或者立即数到寄存器等 mov将一个寄存器的值赋值给另一个寄存器。
mov r1, r2 /* r1 = r2*/ 
mov r1, #4096 /* r1 = 4096*/ mov 指令限制了立即数的范围只能是12位

那么0x53000000是个32位的,不是超过来立即数范围来么?那立即数是如何进行计算的?

可看 原文

描述如下:

ARM中的MOV指令格式是这样的

        op2是占了12位,其中bit11-bit8是移位数(rotate),bit7-0是一个8位的立即数(imm),MOV Rn, op2,执行之后,Rn=op2 >> (rotate * 2),这里的移位是循环右移(就位中),这定了MOV指令不是所有的立即数都能表示的,以下是几个例子:

 

1、mov    r3, #0x56000000

虽然0x56000000是一个32位的数,但是可以找到这么一个8位立即数,通过右移得到,看下机器码e3a03456,展开成二进制,对照下格式

1110  0011 1010  0000  0011  0100  0101  0110

cond[31:28]=1110

[27:26]=00

L[25]=1,代表op2是一个立即数

OpCode[24:21]=1101

S[20]=0

Rn[19:16]=0000

Rd[15:12]=0011,R3

Op2[11:8]=0100,右移4 * 2位

Op2[7:0]=0101 0110,8位立即数,0x56

 

首先要将0x56扩展成32位的无符号数,0x00000056,然后循环右移8位,就得到了0x56000000

2、mov r3, #0x56000014

0x56000014是无法通过移位来得到的,这时汇编器会报错,C语言编写的程序,编译器会这样来处理:

mov r3, #0x56000000

add r3, r3, #0x14   @ nop 指令

明白了这个,也就可以理解为啥会有下面的写法:
#define INT_CTL_BASE	0x4A000000
#define oINTMSK			0x08
#define oINTSUBMSK		0x1C

	mov	r1, #INT_CTL_BASE
	mov	r2, #0xffffffff
	str	r2, [r1, #oINTMSK]
	ldr	r2, =0x7ff
	str	r2, [r1, #oINTSUBMSK]
因为0x4A000008和0x4A00001C不能通过循环右移偶数个位来得到
另外可以使用ldr伪指令。将32位等地址等传入。

ldr  r1,     =0x53000008



你可能感兴趣的:(嵌入式linux-基础篇)