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