如何判断一个立即数是否合法

判断一个立即数是否合法,首先要知道什么是立即数

立即数通常是指在立即寻址方式指令中给出的数。可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。

以ARM汇编编译器为例:

立即数方式:每个立即数由一个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,然后循环右移偶数位,能够得到基数,满足其一就合法

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值