如何判断立即数的合法性?(详解详析)

《ARM体系结构与编程》一书中对立即数有这样的描述:每个立即数由一个8位的常数循环右移偶数位得到。

一个32位的常数,只有能够通过上面构造方法得到的才是合法的立即数。

那好,我们便从8位偶数位这两个角度入手,来去判断立即数的合法性。

(这里,8位数其实可以理解为一种基准,判断立即数合法性这一过程,其实都是建立在对8位数的分析之上。)

书上给的合法立即数的例子:0x104,0xff0,0xff00
我们来分析一下0x104:

(这里我们使用一个小技巧:在刚学习立即数的判断时,非常建议把需要判断的数补全至32位,方便观察与理解)

0x104:0001 0000 0100
补全至32位变成:
0000 0000 0000 0000 0000 0001 0000 0100
这个32位的数我们将之称为 “目标

现在我们只需要找到一个8位数作为基准,将其补全至32位,如果这个32位数循环右移偶数位之后能够与“目标”相等,那么说明“目标”是一个合法的立即数。

①补全32位的过程中我们发现 ,补全一个数,其实补的全部都是“0”,而32位数里面的“1”,其实都是原先的数自带的,因此我们在找一个8位数作为基准的时候,这个8位数里面一定要包含32位数中所有的“1”,这样我们在对8位数进行循环右移操作的时候才能得到目标
比如 :0010 永远不可能通过循环右移得到 1100 ,而却能够通过循环右移得到0100 ,因为跟前者的“1”的数目不对应,跟后者的“1”的数目相同

②了解了这一点后,我们现在来找0x104中的含全部“1”的最短序列 ,显然是1 0000 01。这才只有7位,而我们需要8位,因此可以在前后任选一处补一个“0”让它变为8位

(1)1 0000 01前面补一个0得:01 0000 01
补全至32位得:
0000 0000 0000 0000 0000 0000 0100 0001
目标数为:
0000 0000 0000 0000 0000 0001 0000 0100
观察发现8位数补全后的数循环右移30位即可得到目标数,30是偶数,因此成立。故该立即数合法

(2)1 0000 01后面补一个0得:1 0000 010
补全32位得:
0000 0000 0000 0000 0000 0000 1000 0010
目标数为:
0000 0000 0000 0000 0000 0001 0000 0100
观察发现8位数补全后的数循环右移31位即可得到目标数,31不是偶数,所以1 0000 010没法得到目标数。

③因为两种补0方法的其中一种成立了,我们终归还是找到了一个8位数,它循环右移偶数位能够得到目标数,所以综上:目标数是个合法的立即数

举了上面一个合法立即数的例子,相信你已经大致掌握了判断立即数合法性的方法,其中②补“0”这步,熟练了之后其实是很快的(基本上一眼就行)。有时候比较小的数,需要补的“0”也不止一个,上下对比一下,只要保证循环右移偶数位能得到目标数就行。

来看几个不合法立即数的例子:
0x1010,0x00102,0xFF1000

①0x1010:0001 0000 0001 0000
先找8位数,因为要包含全部“1”,所以最短就是1 0000 0001
这直接就已经9位,溢出了,所以直接pass,不符合8位数的要求

②0x00102:0000 0000 0001 0000 0010
先找8位数,最短是1 0000 001 正好8位,符合条件
把8位数补全至32位 :
0000 0000 0000 0000 0000 0000 1000 0001
目标数(补全到32位)是:
0000 0000 0000 0000 0000 0001 0000 0010
发现8位数补全后的数循环右移31位能得到目标数,因为31不是偶数,而且只有这一种情况,所以也pass了,该立即数不合法。

③0xFF1000
包含所有“1”的最短数都已经12位了,远超8位,直接pass

OK,以上就是所有判断立即数合法性的内容了,讲的较为详细,适合初学者。主要是因为今天在网络上搜索相关内容,感觉都不够通俗易懂,亦或是总结的不够到位,有的甚至还充斥着错误,于是就自己总结一下。如有错误之处还请批评指正,感谢!

如何判断立即数的合法性?(详解详析)相关推荐

  1. linux中iptables配置文件及命令详解详解

    linux中iptables配置文件及命令详解详解 2018年05月04日 14:23:41 hxpjava1 阅读数 956 linux中iptables配置文件及命令详解详解 iptables配置 ...

  2. php 内存池,内存详解: 详解PHP内存池中的存储层_php

    php的内存管理器是分层(hierarchical)的.这个管理器共有三层:存储层(storage).堆(heap)层和 emalloc/efree 层.存储层通过 malloc().mmap() 等 ...

  3. php carbon详解,详解PHP使用日期时间处理器Carbon人性化显示时间

    详解PHP使用日期时间处理器Carbon人性化显示时间 本文介绍了PHP使用日期时间处理器Carbon人性化显示时间,分享给大家,具体如下: 可以通过 Composer 很方便的来安装 Carbon ...

  4. java 修饰符 详解,详解Java修饰符

    Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: 访问控制修饰符 Java中,可以使用访问控 ...

  5. Maven 安装和使用详解详解(windows 环境)

    目录 1.maven 安装步骤 (1)从 Apache 官网下载 maven 压缩包 (2)解压 maven 压缩包,即可使用 (3)配置 maven 环境变量,方便全局使用 (3)检测是否安装配置成 ...

  6. android dialog 详解,详解android dialog自定义实例

    现在很多应用程序的提示对话框都很有个性的,如果你使用的对话框样子还是传统的对话框,是不是有点LOST了呢?今天爱站技术频道小编就给大家讲讲详解android dialog自定义实例. 第一个需求:简单 ...

  7. android viewpager 详解,详解Android App中ViewPager使用PagerAdapter的方法

    PageAdapter是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即可使用. 要使用PagerAdapter, 首先要继承Pag ...

  8. OceanBase详解(详解OceanBase特性)

    OceanBase是阿里开发的分布式关系型(SQL)数据库,其目标是支持数百TB的数据量以及数十万TPS.数百万QPS的访问量,无论是数据量还是访问量,即使采用非常昂贵的小型机甚至是大型机,单台关系数 ...

  9. 汉诺塔c语言执行步骤详解,详解汉诺塔执行过程

    问题补充: 能否从以下开始详细像上面那样说明一下程序的运行过程吗?本人主要不知道函数的运行过程. 返回B第一次调用 6,向下执行,执行完毕,返回A第一次调用 7,本次函数中p=a,q=b,r=c,m= ...

最新文章

  1. vsftpd 配置:chroot_local_user与chroot_list_enable详解
  2. BZOJ 3668: [Noi2014]起床困难综合症( 贪心 )
  3. hdu 4414 Finding crosses
  4. 用javascript写Android和iOS naitve应用,实在炫酷。
  5. 笔记 - 收藏集 - 掘金
  6. 小程序引入UI 组件库
  7. cmake linux windows,Cmake 64位下载_Cmake Windows Linux下载 3.7.1 官网免费版_当载软件站...
  8. uni-app 上传图片并压缩(uView)
  9. html图片的隐藏与显示,Jquery中使用show()与hide()方法动画显示和隐藏图片
  10. 《A Graduate Course in Applied Cryptography》Chapter 12 Chosen ciphertext secure pkc(4)finish
  11. 如何简单粗暴的干掉2345主页
  12. 使用 JS-SDK 与 FLOW 交互
  13. java neon_Eclipse Neon安装指导
  14. 凤凰刷机 教你S40刷机,原来刷机和破权不一样!!
  15. 【coolshell】开源中最好的Web开发的资源
  16. php printer.dll扩展,php printer.dll下载
  17. 你还不清楚某个系统文件的作用吗?Windows系统文件详解【大全】
  18. PyAutoFEP Tutorial--基于Gromacs
  19. 不同型号的二极管模块并联_常见消防模块的接线方法和实物演示
  20. 合规与竞争压力剧增,Tether自救进行时 |链捕手

热门文章

  1. 20 | 总结(二):分布式架构关键设计10问
  2. 坚持自主创新 线控底盘领军企业英创汇智获数亿元B+轮融资
  3. kubernetes强制删除namespace
  4. 研究War3编辑器(1):了解模块类型
  5. URLEncode HTMLEncode
  6. Server Htmlencode和Server HtmlDecode的用法
  7. 携职教育:中级会计与中级职称的关系是什么?如何获得中级职称?
  8. OSChina 周三乱弹 —— 听说分手以后你到处说我死了
  9. 学习记录:关于通过使用express,设置reffer和host获取qq音乐数据
  10. IDEA检测不到JDK明明有JDK