在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必 须是立即数;为什么会有立即数这样的规定呢?

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

一条ARM指令语法格式分为如下几个部分:

<opcode>{<cond>}{S} <Rd>,<Rn>{,<shifter_operand>}

其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。

Opcode   指令助记符,如LDR,STR 等

Cond       执行条件,如EQ,NE 等

       S           是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响

       Rd          目标寄存器

Rn          第一个操作数的寄存器

shifter_operand      第二个操作数(第二操作数有三种形式: 1-- 立即数 add r1,r2,#10 ; 2-- 寄存器 addeqs r1,r2,r3 @ r1=r2+r3 ; 3-- 寄存器移位 add r1,r2,r3,LSL #2 @ r1 = r2 +r3*4)

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

立即数表示方法:立即数(#immed_8r) = X循环右移Y*2; //为何要*2 ? 答:红色。为何要移偶数位? 因为要*2 构造成32位

[31         11] [11   8]  Y:移位值最大 1111b = 15 [7  0] X:8bit常数

所以对#immed_8r常数表达式的限制是解决指令编码的第二个操作数位数不足以表示32位操作数的无奈之举,但总比只有12位所表达的数大。

所以:一个8bit常数循环右移(Y*2 = {0,2,4,6,8, ...,26, 28, 30})就得到一个立即数了;

判断是不是立即数用人脑 真真是太烦了,但是总结了个比较快速的方法:

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

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

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

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

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

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

典型例子:(1)0x4FF (2)0x122 (3)0x234 (4)0xF000000F (5)0x8000007F

例2: 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,也不会报错。有效数判定:原数是立即数或者原数反码是立即数。

例子: mov r1, #0x80000016   @ #0x80000016(1000 0000 0000 0000 0000 0000 0001 0110b) 是一个立即数: 由01011010b 右循环2位得到;

mov r0, #0x101 @不是立即数 报错Error: invalid constant (101) after fixup

深刻认识 -- 立即数相关推荐

  1. 10行代码实现目标检测,请收下这份教程

     翻译 | 林椿眄 编辑 | 阿司匹林 出品 | AI科技大本营(公众号ID:rgznai100) 作为人工智能的一个重要领域,计算机视觉是一门可以识别并理解图像和场景的计算机及软件系统科学.该领 ...

  2. 全球首个安全有效新冠疫苗:陈薇院士团队研制,登上《柳叶刀》

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来源:机器之心 陈薇院士带领的研究团队进行的新冠病毒疫苗临床研究中,一期 108 位志 ...

  3. 10行代码实现目标检测

    2019独角兽企业重金招聘Python工程师标准>>> 作为人工智能的一个重要领域,计算机视觉是一门可以识别并理解图像和场景的计算机及软件系统科学.该领域主要包括图像识别,目标检测, ...

  4. 覆盖你 80 % 网络生活的,竟是这样一家神秘实验室

     覆盖你 80 % 网络生活的,竟是这样一家神秘实验室 这个看似「不务正业」的实验室正在改变每个人的生活. 极客公园作者:我是老红啊 你可能正习惯着 Kindle 和各类音乐供应商给你带来的便捷娱 ...

  5. 2017软件工程实践总结

    一.请回望暑假时的第一次作业,你对于软件工程课程的想象 1)对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方 ...

  6. cpuz检测硬件真假_一手硬件买不起 淘二手硬件的你知道这些重灾区吗

    [PConline 杂谈]游戏帧数低,剪片卡半年,想升级电脑奈何硬件价格已经冲出太阳系.这时二手市场进入了你的视线:几百块的ROG.大雕.GODLIKE超神板,几十块的360水冷,还有各种便宜到不敢相 ...

  7. “龙书”作者斩获图灵奖!谷歌 AI 大神、Swift 之父都受它启蒙

    整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 被誉为"计算机界诺贝尔奖"的图灵奖,昨日火热出炉! 国际计算机协会(ACM)于官网宣布将 2020 图灵奖授予哥伦比 ...

  8. 就这样进入了前端开发

    回顾 立夏,广州.今晚回来的路上,在学校的草坪上发现许多萤火虫,眨着眨着,点缀这个初夏的静夜.上次见到这番画像的时候,已经是一年前的事了.时钟转得飞快,眨眼自己也到了毕业的季节,总想要装一下文艺.无奈 ...

  9. QQ和微信凶猛成长的背后:腾讯网络基础架构的这些年

    为什么80%的码农都做不了架构师?>>>    本文来自腾讯资深架构师杨志华的分享. 1.前言 也许没有多少人记得2004年发生的事情.但对于老腾讯来说,14年前的那个日子,2004 ...

最新文章

  1. 巧用windows快捷键
  2. asp.net 中 SESSION和COOKIE的使用
  3. Android11vivox21刷机包,vivo x21旧版官方固件rom系统刷机包
  4. IndexedDB_Web 离线数据库
  5. 编写可测试的JavaScript代码
  6. 计算机联锁道岔故障处理,TYJL-II型计算机联锁系统的日常维护和故障处理.doc
  7. 一根烟上热搜,先让 AI 看看你的肺
  8. ECMAScript6学习笔记 ——let、const、变量解构赋值
  9. Python 求解斐波那切(三种方法)
  10. SWAT-CUP径流率定过程
  11. 解决SQLserver 数据库恢复挂起
  12. Java实现Base64、DES、AES、RSA加解密以及加密方式之间的区别
  13. 新一代iPad Pro外形泄露:方形后摄瞩目
  14. VVC帧间预测(四)仿射运动补偿预测
  15. 知识分享·NLP中一些有趣的trick
  16. 华为nova7和nova7pro有什么区别(华为nova7系列配置参数及常见问题)
  17. RAID 5数据恢复图解
  18. java商城毕业设计 JavaWeb家具家居购物商城毕业设计(9)购物车
  19. 系统坏了,该怎么办呢?电脑小白必备的装机指南
  20. 日历2019日历备注_如何在Windows 10日历应用中使用Google日历

热门文章

  1. 计算机科学与工程一直火,薪火相传(三)|王采玉:一个渺小如蝼蚁的大学生的成长历程...
  2. 2年5个月13天,从外包到拿下阿里offer,不相信屌丝也能有今天
  3. 【数据压缩】TGA文件格式分析
  4. ubuntu如何开放对外端口_ubuntu开放指定端口
  5. Microsoft Azure Administrator AZ-104 AZ-103笔记/考点总结
  6. 红外通信的应用——PPM调制与解码(C51)
  7. eslint报错解决方案:--fix的使用
  8. mana spark有中文吗_玛娜火花Mana Spark单机版下载-玛娜火花Mana Spark游戏下载-k73游戏之家...
  9. 数据库课程设计《教务信息管理系统》
  10. 纯小白初识函数—主函数调用子函数: