判斷arm立即數(shù)是否合法的小程序
今天老師布置了課后習(xí)題,有一題是判斷立即數(shù)的,大家都知道,arm里的立即數(shù)并非都是合法的。
描述:如立即數(shù)記作
例:有效立即數(shù) 0x0000F200,0x00110000, 0x00012800
無效立即數(shù) 0x1010, 0x00102, 0xFF1000
顯然,對于8位立即數(shù)都是有效的。
其實(shí)從定義上判斷一個(gè)數(shù)是不是立即數(shù)也很簡單的:
1.看所有的bit位為1的是否在一個(gè)字節(jié)中
2.若1條件滿足,則看是否可以經(jīng)過偶數(shù)位左移得到
滿足這兩個(gè)條件的就是合法的立即數(shù)了,不過還是寫了一個(gè)小程序來判斷,看來我還是這么的懶,嘻嘻。
#include
/************************************************************
描述:循環(huán)左移函數(shù)
輸入:val,要判斷的立即數(shù)
n,要左移的位數(shù)(0--15)
返回:循環(huán)左移n位后的立即數(shù)
************************************************************/
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;
}
/************************************************************
描述:判斷立即數(shù)是否有效
輸入:val,要判斷的立即數(shù)
返回:true,立即數(shù)有效
false,立即數(shù)無效
************************************************************/
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("是合法立即數(shù)!/n");
}
else
{
printf("非法立即數(shù)!/n");
}
}
return 0;
}