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