您的位置:首页 > 移动开发 > 微信开发

判断arm立即数是否合法的小程序

2011-03-31 22:05 141 查看
今天老师布置了课后习题,有一题是判断立即数的,大家都知道,arm里的立即数并非都是合法的。



描述:如立即数记作 <immediate> ,8位常数记作immed_8,4位的循环右移值记作rotate_imm,有效的立即数是由一个8位的立即数循环左移偶数位得到,则有效立即数immediate可表示成:
<immediate> = immed_8循环右移( 2 * rotate_imm )

例:有效立即数 0x0000F200,0x00110000, 0x00012800
无效立即数 0x1010, 0x00102, 0xFF1000
显然,对于8位立即数都是有效的。



其实从定义上判断一个数是不是立即数也很简单的:



1.看所有的bit位为1的是否在一个字节中

2.若1条件满足,则看是否可以经过偶数位左移得到



满足这两个条件的就是合法的立即数了,不过还是写了一个小程序来判断,看来我还是这么的懒,嘻嘻。



#include <stdio.h>

/************************************************************ 
描述:循环左移函数 
输入: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;
}




----------------------------------------------------------------------------------

转载我博客文章郑重声明:技术性网站著名原创作者即可转载,商业性网站必须经过我的同意才能转载,否则追究责任——
pang123hui的博客:
博客园http://www.cnblogs.com/pang123hui/
CSDNhttp://blog.csdn.net/pang123hui/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: