在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必 须是立即数。ARM立即数的是由一个8位的常数循环右移偶数位得到的,其中循环右移 的位数由一个4位2进制的两倍表示,公式如下:

immediate=immed_8&<(2*rotate_imm4) “<<”表示循环右移 简单的说一个常数如果可以由一个8位的常数循环移位偶数位得到,那么就是立即数。

为什么会有立即数这样的规定呢,这是由于所有的ARM指令是精简指令集,指令长度固定都是32位,对于ARM数据处理指令自然也是一样。数据处理指令大致可包含3类,数据传送指令、数据算术逻辑运算指令和数据比较指令。在一条ARM数据处理指令中,除了要包含处理的数据值外,还要标识ARM命令名称,控制位,寄存器等其他信息。这样在一条ARM数据处理指令中,能用于表示要处理的数据值的位数只能小于32位。

ARM在指令格式中设定,只能用指令机器码32位中的低12位来表示要操作的常数。ARM处理器是按32位来处理数据的,ARM处理器处理的数据是32位,如果简单的用这12位来表示,显然范围太小了,为了扩展到32位,因此使用了构造的方法,在12位中用8位表示基本数据值,用4位表示位移值,通过用8位基本数据值往右循环移动4位位移值*2次,来表示要操作的常数。这里要强调终的循环次数是4位位移值乘以2得到的,所以得到的终循环次数肯定是一个偶数,为什么要乘以2呢,实质还是因为范围不够,4位表示位移次数,大才15次,加上8位数据还是不够32位,这样只能通过ALU的内部结构设计将4位位移次数乘以2,这样就能用12位表示32位常数了。

通过循环偶数位得的到操作数,扩大了操作数的范围,但也带来了问题,并不是每个数据都能通过8位基本数据循环移动偶数为得到,如果你在ARM数据处理指令中使用的操作数,不是立即数,比如MOV R1,#0x12345678,编译器就会报错,所以我们在使用前必须进行判断,这也是很多ARM相关求职笔试中常考的一道题目。

那怎样怎么快速判断一个数是否是立即数,对于简单的数字我们可以直接判断,比如小于255的数字肯定是立即数。对相对复杂的数字进行判断就需要先把它转换为2进制形式,然后根据定义进行判断了。我这里总结了个比较快速的方法:

1、把数据转换成二进制形式,从低位到高位写成4位1组的形式,高位一组不够四位的,在高位前面补0。

2、数1的个数,如果大于8个肯定不是立即数,如果小于等于8进行下面步骤。

3、如果数据中间有连续的大于等于24个0,循环左移4的倍数,使高位全为0。

4、找到高位的1,去掉前面大偶数个0。

5、找到低位的1,去掉后面大偶数个0。

6、数剩下的位数,如果小于等于8位,那么这个数就是立即数,反之就不是立即数。

针对可能现的情况,我举5个典型例子:

(1)0x4FF (2)0x122 (3)0x234 (4)0xF000000F (5)0x8000007F

例1: 0x4FF

第一步:0100 1111 1111

第二步:其中1的个数是9个,大于8个,判定不是立即数

例2: 0x122

第一步: 0001 0010 0010

第二步: 其中1的个数4个,小于8,继续

第三步: 其中没有连续大于等于24个0,继续

第四部: xx01 0010 0010 (高位前面有3个0,大偶数2,去掉2个0)

第五步: xx10 0011 0010 (低位后面只有1个0,大偶数0)

第六部: 剩下10 0011 0010 共10位,大于8,判定0x122不是立即数

例3: 0x234

第一步: 0010 0011 0100

第二步: 其中1的个数4个,小于8,继续

第三步: 其中没有连续大于等于24个0,继续

第四部: xx10 0011 0100

第五步: xx10 0011 01xx

第六部: 剩下10 0011 01 共8位,等于8,判定0x234是立即数

例4: 0xF000000F

第一步: 1111 0000 0000 0000 0000 0000 0000 1111

第二步: 其中1的个数8个,没有大于8,继续

第三步: 其中有连续24个0,循环左移4位,使高位全为0

0000 0000 0000 0000 0000 0000 0000 1111 1111

第四部: xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1111 1111

第五步: xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1111 1111

第六部: 剩下1111 1111共8位,等于8,判定0xF000000F是立即数

例5: 0x8000007F

第一步: 1000 0000 0000 0000 0000 0000 0111 1111

第二步: 其中1的个数8个,没有大于8,继续

第三步: 其中有连续24个0,循环左移4位,使高位全为0

0000 0000 0000 0000 0000 0000 0111 1111 1000

第四部: xxxx xxxx xxxx xxxx xxxx xxxx 0111 1111 10xx

第五步: xxxx xxxx xxxx xxxx xxxx xxxx 0111 1111 10xx

第六部: 剩下0111 1111 10共10位,等于8,判定0x7000008F是立即数

问题还没有结束,我们在ARM汇编中如何规避立即数这个问题呢,其实可以使用ARM汇编LDR伪指令,例如直接把MOV指令变为, LDR R1,=0x12345678这样编译器就不会报错了。但这种方法也有弊端会增加开销和影响执行效率。同时ARM汇编中还有有效数的概念,比如 MOV R1,#0xFFFFFFFF 指令中 0xFFFFFFFF 不是立即数,但是是有效数,编译器自动把原指令变换为 MVN R1,#0,也不会报错。有效数判定:原数是立即数或者原数反码是立即数。

2.1立即数的判断方法一相关推荐

  1. ir指令、立即数的作用_立即数的判断方法一

    在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必 须是立即数.ARM立即数的是由一个8位的常数循环右移偶数位得到的,其中循环右移 的位数由一个4位2进制的两倍表示,公式如下 ...

  2. 回文数的判断(三种方法)

    最近做了一点关于回文数的总结. 首先先写一篇关于回文数判断的几种方法. 回文数的概念:即是给定一个数,这个数顺读和逆读都是一样的.例如:121,1221是回文数,123,1231不是回文数. 方法一: ...

  3. 分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view

    分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view ...

  4. python创建数据库字数不限制_textarea字数限制方法一例

    function checkLen(obj) { var maxChars = 30;//最多字符数 if (obj.value.length > maxChars) obj.value = o ...

  5. python爬虫匹配uniport数据库的Pathway字段是否存在(方法一)

    记录一下通过uniprotID获取网页内容并匹配的方法一,这里主要是通过获取的网页内容作为字符串,然后利用python字符串匹配的方法来解决.另外也可以通过获取标签的方法,如果没有这个标签的话,那么就 ...

  6. HTML 转 PDf 方法一 wkhtmltopdf.exe

    工作中涉及到制作PDF报表,找了很多办法,总是不尽人意,有诸多bug,如: 1:中文显示乱码 2:处理字符串分割及换行时要么是字符串被截断无法显示,要么就是无法换行超出显示范围 3:处理分页是内容被截 ...

  7. 魔域服务器修改和宝宝数据,魔域21个修改版本方法一,合BB所需副BB评分如何设定为最高...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 魔域21个修改版本方法一,合BB所需副BB评分如何设定为最高只需19星XO.打开数据表,找到cq_eudemon_rbn_rqr这张表.然后找到 sacr ...

  8. html表单判断字符数,JS判断字符串长度,结合element el-input el-form 表单验证(英文占1个字符,中文汉字占2个字符)...

    首先看看判断字符串长度的几种方法(英文占1个字符,中文汉字占2个字符) 方法一: function strlen(str) { var len = 0; for (var i = 0; i < ...

  9. vmware+redhat9 摄像头驱动安装方法一

    redhat9 下摄像头驱动程序spca5xx和gspca安装 方法一:直接在2.4.20内核上安装spca55xx 方法二:升级2.4.20内核到2.6.18然后编译安装摄像头驱动gspca 两种方 ...

最新文章

  1. 《评人工智能如何走向新阶段》后记(再续27)
  2. linux下添加路由的方法
  3. 把XML文件转换为字符串
  4. 牛逼!Redis 的字符串是这样实现的…
  5. cesium学习之环境搭建
  6. 卸载重新安装Sql Server 2005出现“性能监视器计数器要求”错误解决方法【转】...
  7. LeetCode 27.移除元素 思考分析
  8. 18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?
  9. ICMP (互联网控制消息协议 )是什么
  10. 点读笔客户端_新手妈妈如何选购点读笔
  11. Mac清理软件为苹果系统迅速减压
  12. 关于System.FormatException异常
  13. Android开发中Ant命令编译和APK签名的一些心得
  14. 新辰:传统行业进军互联网 怎样颠覆网络获得新生?
  15. 绝地求生服务器维护6.28,绝地求生6月28号更新完怎么进不去 绝地求生更新维护到几点6.28...
  16. opengl 加载贴图Unknown DIB file format问题
  17. 计算机常用端口号以及对应服务总结
  18. CentOS安装/卸载Anaconda(图文详解)
  19. java 实现短信验证码功能
  20. 人民大学的AI学院,教师团队很凡尔赛

热门文章

  1. 2022-2028年中国珠宝电子商务行业市场需求分析及投资方向研究报告
  2. 2021年12月远程网络教育大学英语B统考题库复习真题(完整版)
  3. Udacity机器人软件工程师课程笔记(十八)-机械臂仿真控制实例(其三)-KR210机械臂反向运动学
  4. 自动控制原理笔记(5)——线性系统的根轨迹法
  5. 解决laravel-admin 树状模型删除失效
  6. 用JS写右下角烦人的弹窗小广告
  7. 在IDEA中使用MCR调用运行matlab代码
  8. SpringMVC - 入门
  9. 如何讲述个人职业生涯
  10. 勒索软件攻击:如何使用加密来保护您的数据