ARM立即数判断

时间:2022-10-23 05:35:17

      (转)怎么快速判断一个数是否是立即数,对于简单的数字我们可以直接判断,比如小于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