首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

寻个判ARM的立即数是否有效的算法,该怎么处理

2012-02-08 
寻个判ARM的立即数是否有效的算法描述:如立即数记作 immediate ,8位常数记作immed_8,4位的循环右移值记

寻个判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;
}

热点排行