首页 > 代码库 > ARM立即数判断
ARM立即数判断
(转)怎么快速判断一个数是否是立即数,对于简单的数字我们可以直接判断,比如小于255的数字肯定是立即数。对相对复杂的数字进行判断就需要先把它转换为2进制形式,然后根据定义进行判断了。我这里总结了个比较快速的方法:
1、把数据转换成二进制形式,从低位到高位写成4位1组的形式,最高位一组不够四位的,在最高位前面补0。
2、数1的个数,如果大于8个肯定不是立即数,如果小于等于8进行下面步骤。
3、如果数据中间有连续的大于等于24个0,循环左移4的倍数,使高位全为0。
4、找到最高位的1,去掉前面最大偶数个0。
5、找到最低位的1,去掉后面最大偶数个0。
6、数剩下的位数,如果小于等于8位,那么这个数就是立即数,反之就不是立即数。
(1)0x4FF (2)0x122 (3)0x234 (4)0xF000000F (5)0x8000007F
(1) 1> 0x 0100 1111 1111
2> 1的个数大于8,不是立即数
(2) 1> 0x 0001 0010 0010
2>1的个数小于8
3>满足
4>1前面3个0,去掉最高偶数位,还有1个0 0x 01 0010 0010
5>最低位1后面1个0,故不变 0x 01 0010 0010
6>还剩10位,不满足,不是立即数
(3) 1> 0x 0010 0011 0100
2> 1的个数小于8
3>满足
4> 0x 10 0011 0100
5> 0x 10 0011 01
6>还剩8位,满足,是立即数
(4)1>0x 1111 0000 0000 0000 0000 0000 0000 1111
2>满足
3>循环左移4位 0x 0000 0000 0000 0000 0000 0000 1111 1111
4> 0x1111 1111
5>不变
6>还剩8位,满足,是立即数
(5) 1>0x1000 0000 0000 0000 0000 0000 0111 1111
2>满足
3>24个0, 则变为 0x 0000 0000 0000 0000 0000 0111 1111 1000
4> 0x 0111 1111 1000
5> 0x 0111 1111 10
6> 0x 0111 1111 10 大于8位,不是立即数
当然,最简单的写法就是: ldr r1, =xxx
ARM立即数判断