您现在的位置: 主页 > MCU > 单片机技术应用 > 判断arm立即数是否合法的小程序 -
本文所属标签:
为本文创立个标签吧:

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

来源: 网络用户发布,如有版权联系网管删除 2018-09-07 

[导读] 今天老师布置了课后习题,有一题是判断立即数的,大家都知道,arm里的立即数并非都是合法的。 描述:如立即数记作 ,8位常数记作immed_8,4位的循环右移值记作rotate_imm,有效的立即数是由一个8位的立即数循环左移偶

今天老师布置了课后习题,有一题是判断立即数的,大家都知道,arm里的立即数并非都是合法的。

本文引用地址: http://www.21ic.com/app/mcu/201808/783407.htm

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

例:有效立即数 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;

}




              查看评论 回复



嵌入式交流网主页 > MCU > 单片机技术应用 > 判断arm立即数是否合法的小程序 -
 

"判断arm立即数是否合法的小程序 -"的相关文章

网站地图

围观()