ARM的合法立即数与非法立即数,立即数

ARM指令的立即数,要求立即数以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”。合法的立即数与非法的立即数(教材P158)在Arm处理器中,立即数必须是对应8位位图格式,即立即数是由一个8bit的常数在16位或32位的寄存器中循环移动(向左或向右都行)偶数位得到的。合法的立即数必须能够找到得到它的那个常数,否则这个立即数就是非法的。例如:0x3F8是合法的,把它写成二进制形式为:001111111000b, 因为:它是用一个8bit的常数0xFE(11111110b)在16位的寄存器中循环向左移动2位就可以得到0x3F8 ,见下图的:
 
 判断一个立即数是否合法的办法:(1)首先把这个数用二进制表示出来,然后看这个数中“1”的最大间隔是多少,要看两次,一次是顺序看,一次是循环看,循环看是把16位或32寄存器的首尾连起来,越过首尾来看,两次中如果最大间隔都大于8(包含首尾的两个1),那这个数肯定是非法的。如果有一次小于等于8则有可能是合法的,可以进行下一步继续判断:(2)此时又分为两种情况,(A)如果顺序看时1的最大间隔等于8,此时可以看看,这个数最高位1的前面或者最低位1的后面是否有偶数个0,只要一种情况下有,这个数就是合法的。(B)如果循环看时1的最大间隔小于等于8,此时可以看看,循环看时,两端得到的间隔个数是否有一个为偶数,如果有一个是偶数,这个数就是合法的。

相关推荐

相关文章