判断arm立即数是否合法的小程序
扫描二维码
随时随地手机看文章
今天老师布置了课后习题,有一题是判断立即数的,大家都知道,arm里的立即数并非都是合法的。
描述:如立即数记作
例:有效立即数 0x0000F200,0x00110000, 0x00012800
无效立即数 0x1010, 0x00102, 0xFF1000
显然,对于8位立即数都是有效的。
其实从定义上判断一个数是不是立即数也很简单的:
1.看所有的bit位为1的是否在一个字节中
2.若1条件满足,则看是否可以经过偶数位左移得到
满足这两个条件的就是合法的立即数了,不过还是写了一个小程序来判断,看来我还是这么的懒,嘻嘻。
#include
/************************************************************
描述:循环左移函数
输入:val,要判断的立即数
n,要左移的位数(0--15)
返回:循环左移n位后的立即数
************************************************************/
unsigned int left(unsigned int val, int n)
{
if (n <0 || n> 15)
{
return 0xffffffff;
}
unsigned int rtn;
rtn = val << (2 * n);
rtn |= (val & (0xffffffff << (32 - 2 * n))) >> (32 - 2 * n);
return rtn;
}
/************************************************************
描述:判断立即数是否有效
输入:val,要判断的立即数
返回:true,立即数有效
false,立即数无效
************************************************************/
int Judge(unsigned int val)
{
int i = 0;
for (i = 0; i < 16; i++)
{
if(left(val, i) <= 0x000000ff )
return 1;
}
return 0;
}
int main(void)
{
int num = 0;
while(printf("请输入:"), 1 == scanf("%x", &num))
{
if(Judge(num))
{
printf("是合法立即数!/n");
}
else
{
printf("非法立即数!/n");
}
}
return 0;
}