ARM 汇编中的MOV 的有效操作数取值
1.以:mov r0, #0x53000000为例
它的作用就是,把0x53000000移动到r0中去。
作用与:ldr r0, =0x53000000一致。
它们之间的区别在于:ldr伪指令不需要知道操作数是否有效,编译的时候会自己判断,如果错误不会编译通过。
而MOV必须知道操作数是有效的,编译不会提醒。那么MOV的操作数到底是多少的时候是有效的?
2.ldr r0, =0x53000000对应的真正的汇编代码如下:
33d00068: e3a00453 mov r0, #1392508928 ; 0x53000000
e3a00453 = 1110 0011 1010 0000 0000 0100 0101 0011 b;
mov指令0xe3a00453的位域含义解析:
| 31-28 | 27-26 | 25 | 24-21 | 20 | 19-16 | 15-12 | 11-0 | |
| Condition Field | 00 | I(Immediate Operand) | OpCode(Operation Code) | S(Set Condition Code) | Rn(1st Operand Register) | Rd(Destination Register) | Operand 2(1 = operand 2 is animmediate value) | |
| 11-8Rotate | 7-0Imm | |||||||
| 1110 | 00 | 1 | 1101 | 0 | 0000 | 0000 | 0100 | 0101 0011 |
| 表明是立即数 | 1101对应的是MOV指令 | MOV指令做的事情是:Rd:= Op2,和Rn无关,所以忽略这个Rn | 表示0000号寄存器,即r0 | 0100=4,含义参见注释1 |
0x53 |
|||
注释1:
上述datasheet中写到:
“5.4.3 Immediate operand rotates ( http://netwinder.osuosl.org/pub/netwinder/docs/arm/ARM7500FEvB_3.pdf )
The immediate operand rotate field is a 4 bit unsigned integer which specifies a shift operation on the 8 bit immediate value. This value is zero extended to 32 bits, and then subject to a rotate right by twice the value in the rotate field. This enables many common constants to be generated, for example all powers of 2.”
意思是,对于bit[11:8]的值,是个4位,无符号的整型,其指定了bit[7:0]的8bit立即数值的位移操作。具体如何指定呢,那就是将bit[7:0]的值,循环右移2x bit[11:8]位。
对于我们的例子,就是,将bit[7:0]的值0x53,循环右移 2xbit[11:8]= 2 x 4 = 8位,而0x53循环右移8位,就得到了0x53000000,就是我们要mov值,mov到目的寄存器rd,此处为r0中。
而上面英文最后一句说的是,通过将bit[7:0]的值,循环右移 2xbit[11:8]的方式,就可以产生出很多个数值了,即mov的操作数中,其中符合可以通过0x00-0xFF循环右移偶数位而产生的数值,都是合法的mov的操作数,而这样的数,其实是很多的。
所以,mov指令的操作数的真正的取指范围,即不是0-0xFF(0-255),也不是只有2的倍数,而是: 只要该数,可以通过0x00-0xFF中某个数,循环右移偶数位而产生,就是合法的mov的操作数,否则就是非法的mov的操作数。
原文:http://bbs.chinaunix.net/thread-2304253-1-1.html

浙公网安备 33010602011771号