×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-05-25 发布时间:
|

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

 

      描述:如立即数记作 ,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;  


关键字:arm  立即数 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析