ARM嵌入式:判断一个数是不是有效立即数


这几天复习ARM嵌入式,遇到一个问题:判断一个立即数是不是有效立即数,或者说是不是合法立即数。

下面给出两条判断依据,判断一个立即数是否合法  :

(1) 首先把这个数用二进制表示出来,然后看这个数中“1”的最大间隔是多少,要看两次,一次是顺序看,一次是循环看,循环看是把16位或32寄存器的首尾连起来,越过首尾来看,两次中如果最大间隔都大于8(包含首尾的两个1),那这个数肯定是非法的。如果有一次小于等于8则有可能是合法的,可以进行下一步继续判断:

(2)此时又分为两种情况

  • A. 如果顺序看时1的最大间隔等于8,此时可以看看,这个数最高位1的前面或者最低位1的后面是否有偶数个0,只要一种情况下有,这个数就是合法的。
  • B. 如果循环看时1的最大间隔小于等于8,此时可以看看,循环看时,两端得到的间隔个数是否有一个为偶数,如果有一个是偶数,这个数就是合法的。

举例:

0xFF=0000 0000 0000 0000 0000 0000 1111 1111B,首尾的两个1间隔不大于8,符合(2)A的情况,是有效立即数。

0x104=0000 0000 0000 0000 0000 0001 0000 0100B,也符合(2)A的情况,是有效立即数。

0xFF0、0xFF00、0xFF000、0xFF000000、0xF000000F都是有效立即数。

反例:

0x101=0000 0000 0000 0000 0000 0001 0000 0001,首尾两个1间隔大于8(也就是说,包含这两个1的所有位数加起来是9个数,无法放到一个8位地址中),由条件(1)判断,是无效立即数。

0x102=0000 0000 0000 0000 0000 0001 0000 0010,这个例子特殊,但是可以看出,由条件(2)A判断,是无效立即数。

0xFF1、0xFF04、0xFF003、0xFFFFFFFF、0xF000000F都是无效立即数。

还有一个要说的就是:只要该数,可以通过0x00-0xFF中某个数,循环右移偶数位而产生,就是合法的mov的操作数,否则就是非法的mov的操作数。

1 Response Comment (1) Trackback (0)
  1. 李昀祥 :

    请问0xFFFFFFFF是怎么判断不行的呢 它不是复合2B吗

发表评论