arm 常数必须对应8 位位图,即常数是由一个8 位的常数循环移位偶数位得到

在ARM指令集汇编码码中,32位有效立即数是通过 偶数位而间接得到的

在12位的shifter_operand中:8位存数据,4位存移位的次数。8位存数据:解释了“该常数必须对应8位位图”。

4位存移位的次数:解释了为什么只能移偶数位。4位只有16种可能值,而32位数可以循环移位32次(32种可能),那就只好限制:只能移偶数位(两位两位地移,好像一个16位数在移位,16种移位可能)。这样就解决了能表示的情况是实际情况一半的矛盾

举个例子吧.
0x3FC(0000 0000 0000 0000 0000 0011 1111 1100) 是由 0xff 循环右移 2 位得到的;
200(0000 0000 0000 0000 0000 0000 1100 1000) 是由 0xc8 循环右移 2 位得到的, 它们都是合法的.
而 0x1FE(0000 0000 0000 0000 0000 0001 1111 1110) 和
511(0000 0000 0000 0000 0000 0001 1111 1111) 无法看成是8位的常数循环右移偶数位而得到的, 因此是非法的.
指令操作数立即数时候,每个立即数由一个8位的常数循环右移偶数位得到。

猜你喜欢

转载自my.oschina.net/u/920274/blog/2962319