您的位置:首页 > 其它

ARM体系结构学习中的难点(不断更新中)

2013-03-11 21:49 615 查看
一. ARM指令中合法立即数

  在Arm处理器中,立即数必须是对应8位位图格式,即立即数是由一个8bit的常数在16位或32位的寄存器中循环移动(向左或向右都行)偶数位得到的。

即:shifter_operand = immed_8 Rotate_Right (rotate_imm * 2)。合法的立即数必须能够找到得到它的那个常数,否则这个立即数就是非法的。 例如: 0x3F8是合法的,把它写成二进制形式为:001111111000b, 因为:它是用一个8bit的常数0xFE(11111110b)在16位的寄存器中循环向左移动2位就可以得到0x3F8 ,见下图的:



  判断一个立即数是否合法的方法:

  首先把这个数用二进制表示出来,然后看这个数中“1”的最大间隔是多少,要看两次,一次是顺序看,一次是循环看,循环看是把16位或32寄存器的首尾连起来,越过首尾来看,两次中如果最大间隔都大于8(包含首尾的两个1),那这个数肯定是非法的。如果有一次小于等于8则有可能是合法的,可以进行下一步继续判断:

  此时又分为两种情况,

  如果顺序看时1的最大间隔等于8,此时可以看看,这个数最高位1的前面或者最低位1的后面是否有偶数个0,只要一种情况下有,这个数就是合法的;如果循环看时1的最大间隔小于等于8,此时可以看看,循环看时,两端得到的间隔个数是否有一个为偶数,如果有一个是偶数,这个数就是合法的。

  例如,0x1010 是非合法的 (两次看这个数中“1”的最大间隔大于8);0x1FA 是非合法的(顺序看这个数中“1”的最大间隔等于8,这个数最高位1的前面或者最低位1的后面没有偶数个0,)

0x7000000E 是合法的(因为循环看时,两端得到的间隔个数有一个为偶数)。

  首先将这个数转换为32bit16进制形式,例如218=0xDA=0x000000DA;除零外,仅有一位数为合法立即数;除零外,仅有二位数,并且相邻(包括首尾,如0x1000000A)的为合法立即数;除零外,仅有三位数,并且相邻(包括中间有0相间,例如0x10800000,包括首尾相邻,如:0x14000003),这三位数中,最高位取值仅能为1、2、3,最低位取值仅能为4、8、C,中间位0x0~0xF。这种组合的为合法立即数;除了以上三种,其他基本是非法立即数。

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: