寻个判ARM的立即数是否有效的算法
描述:如立即数记作 <immediate> ,8位常数记作immed_8,4位的循环右移值记作rotate_imm,有效的立即数是由一个8位的立即数循环右移偶数位得到,则有效立即数immediate可表示成:
<immediate> = immed_8循环右移( 2 * rotate_imm )
例:有效立即数 0x0000F200,0x00110000, 0x00012800
无效立即数 0x1010, 0x00102, 0xFF1000
显然,对于8位立即数都是有效的.
input:一个立即数
output:该立即数是否有效
[解决办法]
这个其实不难,在Windows下,用c/c++实现如下:
/************************************************************
描述:循环左移函数
输入: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,立即数无效
************************************************************/
bool Judge(unsigned int val)
{
for (int i=0;i <16;i++)
{
if( left(val,i) <= 0x000000ff )
return true;
}
return false;
}