在ARM立即数寻址中,指令中的立即数是有一个8位的常数和移动的4 位偶数位得到的,所以每一条指令都包含一个常数X和移位值Y,得到的立即数=X循环右移(2*Y)
给定一个立即数,判断其是否合法可以分三步:首先将给定的立即数写成32位二进制的形式;然后看能不能用一个8位的二进制数包括所有含1的部分,如不能则非法;最后看这个8位二进制数能不能循环右移偶数位得到给定的立即数,不能数则非法。
#include <stdio.h>
#include <stdlib.h>
unsigned int rightmove(unsigned int num, int bit);//数字num循环右移bit位
int judge(unsigned int num);//判断是否为立即数
int main()
{
unsigned int num;
scanf("%d",&num);
int t;
t=judge(num);
t==1?printf("可以当做一个arm立即数\n"):printf("不可以当做一个arm的立即数\n");
return 0;
}
unsigned int rightmove(unsigned int num,int bit)
{
return num=(num<<(32-bit))|(num>>bit);
}
int judge(unsigned int num)
{
unsigned int num_temp;
int i;
for(i=0;i<32;i++)
{
num_temp=rightmove(num,i);
if((num_temp<=0x00ff)&&(i%2==0))
{
return 1;
}
}
return 0;
}
参考博客:http://blog.csdn.net/nicehuai/article/details/48001553