一、什么是立即数
要想判断立即数,首先要了解什么是立即数。
- 我们通常把在立即寻址方式指令中给出的数称为立即数。
- 立即数可以是8位、16位或32位,该数值紧跟在操作码之后。
- 如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。
二、什么是立即寻址
立即寻址方式的目的就是将操作数紧跟在操作码后面,与操作码一起放在指令代码段中,在程序运行时,程序直接调用该操作数,而不需要到其他地址单元中去取相应的操作数,上述的写在指令中的操作数也称作立即数。
例如:
MOV R0,#50H
MOV为操作码,R0为第一操作数,50H为立即数
三、如何判断立即数
①、立即数方式:每个立即数由一个8位的常数循环右移偶数位得到。其中循环右移的位数由一个4位二进制的两倍表示。如果立即数记作 immediate ,8位常数记作immed_8,4位的循环右移值记作rotate_imm,则有:
immediate =immed_8循环右移(2*rotate_imm)
由于这种立即数的构造方法中包含循环移位操作,而循环移位操作会影响CPSR的条件标志位C。因此,同一个合法的立即数由于采用了不同的编码方式,将使得某些指令的执行产生不同的结果,这是不能允许的。ARM汇编编译器按照下面的规则生成立即数的编码。
- 当立即数数值在0和0xFF范围时,immmed_8= immediate ,rotate_imm=0.、
- 其他情况下,汇编编译器选择使rotate_imm数值最小的编码方式。
②、 首先把这个数用二进制表示出来,然后看这个数中“1”的最大间隔是多少,要看两次,一次是顺序看,一次是循环看,循环看是把16位或32寄存器的首尾连起来,越过首尾来看,两次中如果最大间隔都大于8(包含首尾的两个1),那这个数肯定是非法的。如果有一次小于等于8则有可能是合法的,可以进行下一步继续判断:
此时又分为两种情况
A. 如果顺序看时1的最大间隔等于8,此时可以看看,这个数最高位1的前面或者最低位1的后面是否有偶数个0,只要一种情况下有,这个数就是合法的。
B. 如果循环看时1的最大间隔小于等于8,此时可以看看,循环看时,两端得到的间隔个数是否有一个为偶数,如果有一个是偶数,这个数就是合法的。
③、1. 把数据转换成二进制形式,从低位到高位写成4位1组的形式,高位一组不够四位的,在高位前面补0。
2. 数1的个数,如果大于8个肯定不是立即数,如果小于等于8进行下面步骤。
3.如果数据中间有连续的大于等于24个0,循环左移4的倍数,使高位全为0。
4.找到高位的1,去掉前面大偶数个0。
5.找到低位的1,去掉后面大偶数个0。
6. 数剩下的位数,如果小于等于8位,那么这个数就是立即数,反之就不是立即数。
总结:看到一串数,先把它化成二进制,然后去八位数,看左右移动偶数位是否能还原。