在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必

须是立即数。ARM立即数的是由一个8位的常数循环右移偶数位得到的,其中循环右移

的位数由一个4位2进制的两倍表示,公式如下:

immediate=immed_8&

简单的说一个常数如果可以由一个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,也不会报错。有效数判定:原数是立即数或者原数反码是立即数。

ir指令、立即数的作用_立即数的判断方法一相关推荐

  1. ir指令、立即数的作用_我们一起学RISC-V——08-RV32I 指令应用实战

    本期内容如下: RV32I 指令应用注意事项 指令立即数取值范围 RISC-V汇编伪指令 图1 一.RV32I 指令应用注意事项 RISC-V为了追求硬件设计上的简化,很多功能并没有单独实现,而是通过 ...

  2. 2.1立即数的判断方法一

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

  3. 斯特林数 java实现_斯特林数学习笔记

    定义 第一类斯特林数\(s(n,m)\)表示把\(n\)个不同元素放到\(m\)个相同圆排列里的方案数. 有转移方程: \[s(n,m)=s(n-1,m-1)+(n-1)\times s(n-1,m) ...

  4. 对称数java算法_对称数的简单实现

    在百度面试题中看到这样一个题,可能比较老套了,这里为了学习,自己写了改写了个简单算法. 我们把一个数字倒着读和原数字相同的数字称之为对称数, (例如1,121,88,8998),不考虑性能,请找出1- ...

  5. 斯特林数 java实现_斯特林数 - BILL666 - 博客园

    第一类斯特林数 定义 \(\left[\begin{matrix}n\\m\end{matrix}\right]\) 表示将\(n\)个带标号的元素放入\(m\)个不带标号的环的方案数 递推式 \[\ ...

  6. 完数什么意思_完美数是什么?

    完美数 ●稀少而有趣的完美数 已知自然数a和b,如果b能够整除a,就说b是a的一个因数,也称为约数.显然,任何自然数a,总有因数1和a.我们把小于a的因数叫做a的真因数. 例如6,12,14这三个数的 ...

  7. 做Java去华数好吗_华数面试题(JAVA部分)

    一.基础知识 1.下面为java关键字的选项是:c a) goto b) malloc c) extends d) false 2.以下代码哪种执行结果是正确的,并说明原因: public class ...

  8. 华数机器人编程语言_华数机器人:以自主创新为引领,深耕细分领域

    原标题:华数机器人:以自主创新为引领,深耕细分领域 [文/虞超]在市场需求爆发的情况下,机器人市场也趋于理性,越来越多的客户通过严谨的技术比较,结合自身的需求选择最合适的产品.也正因为如此,国产品牌得 ...

  9. 华数机器人编程语言_华数II型机器人控制系统.PDF

    华数II型机器人控制系统 华数II型机器人控制系统 产品简介 IPC-102控制器 主要特点: 华数II型机器人控制 1.基于工业IPC ,搭载实时 Linux操作系统 系统是华中数控为工业机 2.支 ...

最新文章

  1. 全链路监控细节和难点剖析!
  2. 用于自动驾驶的实时车道线检测和智能告警
  3. SpringBoot-04:SpringBoot在idea中的俩种创建方式
  4. 助力航天元器件管理“高可靠降成本”,赛思库获数千万元Pre-A轮融资
  5. skimage函数记录之measure.label和measure.regionprops
  6. android 自己定义水平和圆形progressbar 仅仅定义一些style就能够
  7. 3、从尾到头打印链表------------剑指offer系列
  8. 谈“发表(撰写)学术论文的注意事项”
  9. 后台系统可扩展性学习笔记(三)DNS机制原理
  10. PartitionStateMachine分析
  11. 条款4:确定对象被使用前已被初始化(Make sure that objects are initialized before they're used)...
  12. 房产估值模型训练及预测结果
  13. 加州大学圣克鲁兹分校计算机科学专业,加州大学圣克鲁兹分校排名
  14. word文档文字怎么竖排放在中间?
  15. 数字IC/FPGA设计之——学习路径
  16. 嵌入式linux并行通信,嵌入式Linux
  17. 如何在HTML做个按钮
  18. win7访问共享文件出现登录失败:禁用当前用户
  19. 涉密计算机及涉密网络使用自查,网络安全自查报告(2)
  20. java制作仿win7计算器之一计算器的图形界面的设计

热门文章

  1. HTML5入门之样板和兼容IE浏览器篇
  2. 用神经网络分类一维矩阵
  3. 3.6 BatchNorm 为什么起作用-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  4. 1.3 用神经网络进行监督学习-深度学习-Stanford吴恩达教授
  5. 嵌入式研发人员的核心竞争力浅谈 .
  6. 用3个IO口控制6个LED灯,怎么做到的?查理复用!
  7. 拆解19元的儿童电话手表,要是能二次开发就好了
  8. 树莓派的九周年: 9 件事你可能不知道
  9. 【进程通信】Signal信号
  10. 进程间通信-共享内存实例