[ZLG-ARM] ARM指令第二操作数#immed_8r详解

[复制链接]
5431|3
 楼主| armqt 发表于 2009-7-9 13:35 | 显示全部楼层 |阅读模式
wh_cxh曾经对这个问题的解释如下<br /><br />ARM指令第二操作数#immed_8r详解<br />大多数ARM通用数据处理指令有一个灵活的第2操作数(flexible&nbsp;second&nbsp;operand),<br />这里这解释一下其中的一种格式,<br />#immed_8r<br />常量的表达式。常量必须对应于8位位图(pattern)。该位图在32位字中,被循环移位偶数位(0,2,4,...28,30)<br />合法常量0xff,0xff000,0xf000000f。非法常量:0x101,0xff04<br /><br />ARM&nbsp;在32位模式下,一条指令长度为32位,在上述数据处理指令中,操作数2为12位。<br /><br />所以像0x7f02这样的数,要两条指令才能完成。<br />MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R3,&nbsp;#0x7F00&nbsp;&nbsp;&nbsp;&nbsp;;E3&nbsp;A0&nbsp;3C&nbsp;7F&nbsp;该指令自己完成0x7f移位<br />ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;R3,&nbsp;#2<br /><br />所以直接是找不到0x7f02的<br />#immed_8r那个看明白了<br /><br /><br /><br /><br /><br /><br />但是请问图片里的那个8~11位的循环移位数,&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;0000是不移位;&nbsp;0001是移动2位;0010是移动4位;0011是移动6位&nbsp;&nbsp;&nbsp;这样子吗?<br /><br />那么&nbsp;0x7F00&nbsp;&nbsp;是&nbsp;&nbsp;7F&nbsp;左移8位&nbsp;&nbsp;&nbsp;指令中变成&nbsp;&nbsp;4&nbsp;7F&nbsp;&nbsp;<br />请问为什么老大你给出的是&nbsp;&nbsp;&nbsp;C&nbsp;7F&nbsp;呢?<br />ARM的指令格式对数据处理处理是按照上述图片的进行的,[8]~[11]位显示了循环移位的位数,<br />0000是不移位;&nbsp;0001移动2位;0010移动4位;0011移动6位.......1100(十六进制为C,十进制为:12)移动24位,<br />为什么移动的仅仅是偶数位,这个可以看看ARM的汇编指令格式,指令规定这个操作数是移动偶数位的,因此使用四位就<br />可以实现移动32位。<br /><br />问题出在下面的这句话:<br />那么&nbsp;0x7F00&nbsp;&nbsp;是&nbsp;&nbsp;7F&nbsp;左移8位&nbsp;&nbsp;&nbsp;指令中变成&nbsp;&nbsp;4&nbsp;7F&nbsp;&nbsp;<br /><br />ARM的汇编指令规定,第二操作数#immed_8r是&nbsp;循环右移&nbsp;偶数位的,因此7F右移24位之后位00007F00<br />之后与0x02&nbsp;进行ORR操作,可以得到0x7F02这个数值。<br /><br /><br /> &nbsp;&nbsp;<br />
lpc2410 发表于 2009-7-9 14:08 | 显示全部楼层

怎么没有国产呢

  
tmake 发表于 2009-7-11 14:08 | 显示全部楼层

没有图,有些看不懂呢

  
 楼主| armqt 发表于 2009-7-24 18:02 | 显示全部楼层

学习了

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

150

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部