如何快速判断立即数

一、什么是立即数

 要想判断立即数,首先要了解什么是立即数。
在这里插入图片描述

  • 我们通常把在立即寻址方式指令中给出的数称为立即数。
  • 立即数可以是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位,那么这个数就是立即数,反之就不是立即数。

在这里插入图片描述
总结:看到一串数,先把它化成二进制,然后去八位数,看左右移动偶数位是否能还原。

四、为什么循环移位是偶数位

在这里插入图片描述

  • 40
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TomLazy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值