arm立即数是否有效

2025-04-09 01:07:19
推荐回答(1个)
回答1:

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