Chinaunix首页 | 论坛 | 博客
  • 博客访问: 207420
  • 博文数量: 127
  • 博客积分: 1998
  • 博客等级: 上尉
  • 技术积分: 1432
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-07 16:41
文章分类

全部博文(127)

文章存档

2014年(41)

2013年(1)

2012年(85)

分类: 嵌入式

2012-05-09 13:43:54

问: MOV中的8位图立即数,是怎么一回事 0xF0000001是怎么来的  

答: 是循环右移,就是一个0—255 之间的数左移或右移偶数位的来的,也就是这个数除以4 
一直除, 直到在0-255的范围内它是整数就说明是可以的!  
8位数(0-255)循环左移或循环右移偶数位得到的,F0000001 既是0x1F循环右移4位, 
符合规范,所以是正确的.这样做是因为指令长度的限制,不可能把32位立即数放在32位的指令中.移位偶数也是这个原因.可以看一看ARM体系结构(ADS自带的英文文档)的相关部分. 


点击(此处)折叠或打开

  1. AREA my_asm, CODE, READONLY
  2. CODE32
  3. ENTRY

  4. MOV R0, #0XFFFFFFFF ;这条没有错,可由 mvn r0,#0这条指令替换
  5. MOV R1, #0X24000003 ;这条也没有错,因为它符合 4(移位)*2 + 8(基数) 法则
  6.     ;是由11001010这个数循环右移0011(4位)*2=6位而得到
  7.     ;的,移位的规则是右移出去的位数放到32位的高位,即:
  8.     ; 001010 000000000000000000000000 11
  9.     ;这些移位是ALU自己干的。所以由以上分析我们可以看出这个数符合“48法则”
  10.     ;故0x24000003也可以mov
  11. ;MOV R0, #0X1234567
  12. LDR R1, =0X12345678 ;机器指令:0xe59f1004 ->分解指令:0xe59:ldr
  13.      ; f:  PC寄存器
  14.      ; 1:  R1寄存器
  15.      ; 004:偏移量4
  16. ;当执行到这条指令的时候PC的值为向下两条处的地址
  17. ;即:MOV R4, #123 这条指令的地方反汇编得该地址为
  18. ; 0x0000800c,再加4就是存放数据的地方了,可以在调试中查看该地址值
  19. MOV R3, #01
  20. MOV R4, #123

  21. END


先看看ARM数据处理指令的指令格式

image043.png

Operand 2有12位,其中这12位又分成 4 + 8:

12位shifter_operand中:8位存数据,4位存移位的次数。



阅读(1488) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~