判断一个立即数是否合法,首先要知道什么是立即数
立即数通常是指在立即寻址方式指令中给出的数。可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。
立即数方式:每个立即数由一个8位的常数循环右移偶数位得到。其中循环右移的位数由一个4位二进制的两倍表示。如果立即数记作,8位常数记作immed_8,4位的循环右移值记作rotate_imm。
建议在学习立即数的判断时,把需要判断的数补全至32位
举例:0x102:0002 0000 0010
补全到32位变成:0000 0000 0000 0000 0000 0001 0000 0010
这个数我们称之为目标数
现在要找到一个8位的数作为基数,基数一定要小于等于8个bit位,然后将其补全到32位,如果这个32位数循环右移偶数位之后能够与“目标数”相等,那么说明“目标数”是一个合法的立即数。
这里我们要找从左往右的第一个1出现的位置开始到最后一个1的位置结束
基数为:1 0000 01
(1)在后边补上一个0为1 0000 010
补全32位:0000 0000 0000 0000 0000 0001 0000 0010
目标数为:0000 0000 0000 0000 0000 0001 0000 0010
补全后的数和目标数一致,那是否这个立即数就合法了呢?当然没这么简单,通过观察发现,补全后的数循环右移31位可以得到目标数,但是31不是偶数,所以 1 0000 0010 不合法
(2)在前边补上一个0为 01 0000 01
补全32位:0000 0000 0000 0000 0000 0000 0100 0001
目标数为:0000 0000 0000 0000 0000 0001 0000 0010
观察发现补全后的数循环右移30位即可得到目标数,30是偶数,因此成立,所以该立即数合法
所以,判断一个立即数是否合法,需要满足两个条件
1)、先找8位数(小于8位数也可以),这8位数中必须包含所有的1,超出就直接放弃
2)、在目标数的左右两边分别补0,然后循环右移偶数位,能够得到基数,满足其一就合法