问: MOV中的8位图立即数,是怎么一回事 0xF0000001是怎么来的
答: 是循环右移,就是一个0—255 之间的数左移或右移偶数位的来的,也就是这个数除以4
一直除, 直到在0-255的范围内它是整数就说明是可以的!
8位数(0-255)循环左移或循环右移偶数位得到的,F0000001 既是0x1F循环右移4位,
符合规范,所以是正确的.这样做是因为指令长度的限制,不可能把32位立即数放在32位的指令中.移位偶数也是这个原因.可以看一看ARM体系结构(ADS自带的英文文档)的相关部分.
- AREA my_asm, CODE, READONLY
- CODE32
-
- ENTRY
- MOV R0, #0XFFFFFFFF ;这条没有错,可由 mvn r0,#0这条指令替换
- MOV R1, #0X24000003 ;这条也没有错,因为它符合 4(移位)*2 + 8(基数) 法则
- ;是由11001010这个数循环右移0011(4位)*2=6位而得到
- ;的,移位的规则是右移出去的位数放到32位的高位,即:
- ; 001010 000000000000000000000000 11
- ;这些移位是ALU自己干的。所以由以上分析我们可以看出这个数符合“48法则”
- ;故0x24000003也可以mov
-
- ;MOV R0, #0X1234567
-
- LDR R1, =0X12345678 ;机器指令:0xe59f1004 ->分解指令:0xe59:ldr
- ; f: PC寄存器
- ; 1: R1寄存器
- ; 004:偏移量4
- ;当执行到这条指令的时候PC的值为向下两条处的地址
- ;即:MOV R4, #123 这条指令的地方反汇编得该地址为
- ; 0x0000800c,再加4就是存放数据的地方了,可以在调试中查看该地址值
-
- MOV R3, #01
-
- MOV R4, #123
- END
先看看ARM数据处理指令的指令格式:
Operand 2有12位,其中这12位又分成 4 + 8:
在12位的shifter_operand中:8位存数据,4位存移位的次数。
阅读(1552) | 评论(0) | 转发(0) |