ARM 汇编合法立即数判断

这篇具有很好参考价值的文章主要介绍了ARM 汇编合法立即数判断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ARM 汇编合法立即数判断

在ARM指令集中,一条汇编指令编码成32bits后,将不同的位数划分成不同的功能区间,比如条件码操作码,还有比特位要留给指令本身和寄存器使用,通常情况下只有12-bits的长度可以用来表示立即数(immediate)。

12bits 可以表示的无符号数范围为:0~4095,有符号数的范围为:-2048 ~ +2047,如果不在这 12bits 的立即数上增加点创作性,而直接硬解码用来表示立即数是远远不够的。

所以在ARM中将这 12bits 分为 8bit 常数(0~255)和 4bit 循环右移位值(0~15)

  • 8bit 常数范围(0~255)

  • 位移的步进值是以2为单位(即实际位移 2 * rotate 位),可以表示循环有以(0~30)偶数位: 0、2、4、6、8、10、12、14、16、18、20、22、24、26、28、30

循环右移

循环右移是一种位操作,指将一个数的二进制表示向右循环移动指定的位数。在循环右移中,移动的位数可以看作是一个循环,即当移动到数的最右侧时,移动的位重新出现在数的最左侧,从而形成一个闭环。

具体来说,循环右移的操作可以描述为将数的所有位向右移动,并将最右侧的位移到最左侧。移动过程中,被移出的位被循环地移动到数的最左侧,从而实现了循环的效果。

举个例子,假设有一个8位的二进制数 10101100,如果对它进行循环右移3位,那么移位后的结果将是 10010101,即原始数向右循环移动了3位,并将移出的位循环地移动到了最左侧。

在ARM指令集中,循环右移常用于对立即数的旋转操作,从而实现对立即数范围的扩展或者改变。通过循环右移,可以将立即数的高位移动到低位,从而实现对立即数值的调整或者变换。

判断合法立即数

立即数范围在 0x00 ~ 0xFF 肯定是合法立即数。

对于大于 0x00 ~ 0xFF 的立即数:

这个立即数的二进制序列的 最高位1至最低位1之间的二进制数序列(此二进制序列不超过8位,不足8位在高位(左边)补0) 右移 rotate(0~15) * 2位后,和立即数本身的二进制数序列相等,则表示这个立即数数为合法立即数。

  • rotate(0~15) * 20、2、4、6、8、10、12、14、16、18、20、22、24、26、28、30
  • 最高位1至最低位1之间的二进制数序列,例如:
    • 0000 0000 0000 0000 0000 0010 0011 0100
    • 最高位1至最低位1之间:1000 1101

先说结论

两个必要条件

  • 最高位1至最低位1之间的二进制数序列的位数不超过8位,不足8位在高位补0(左边)

    • 例如:0000 0000 0000 0000 0000 0011 1111 0100 > 1111 1101
    • 例如:0000 0000 0000 0000 0000 0001 0011 0010 > 1001 1001
  • 立即数的二进制序列的右边为偶数个连续的 0

    • 例如:0000 0000 0000 0000 0000 0011 1111 0100,右边有2个连续的0,即偶数个0
    • 例如:0000 0000 0000 0000 0000 0001 0011 0010,右边有1个连续的0,即奇数个0

FAQ

为什么最高位1至最低位1之间的二进制数序列的位数不能超过8位?

  • 因为在ARM中将这 12bits 分为 8bit 常数(0~255)和 4bit 循环右移位值(0~15),只有8bit常数位,只能存下8位。

为什么立即数的二进制序列的右边必须为偶数个连续的 0

  • 因为在ARM中将这 12bits 分为 8bit 常数(0~255)和 4bit 循环右移位值(0~15),循环右移位值步进是2,如果是奇数个连续的0,在提取其中的最高位1至最低位1之间的二进制数序列后,移动偶数次无法得到右边奇数个连续0的二进制序列,和立即数的二进制序列不相同。

验证

0x234 = 0000 0000 0000 0000 0000 0010 0011 0100

  • 最高位1至最低位1之间的二进制数序列:1000 1101
  • 1000 1101 右移 30 位,可以得到 0000 0000 0000 0000 0000 0010 0011 0100
  • 0x234 本身的二进制相等,因此是合法立即数

0x3f4 = 0000 0000 0000 0000 0000 0011 1111 0100

  • 最高位1至最低位1之间的二进制数序列:1111 1101
  • 1111 1101 右移 22 位,得到 0000 0000 0000 0000 0000 0011 1111 0100
  • 0x3f4 本身的二进制相等,因此是合法立即数

0x132 = 0000 0000 0000 0000 0000 0001 0011 0010

  • 最高位1至最低位1之间的二进制数序列:1001 1001
  • 1000 1101 右移 30 位,得到 0000 0000 0000 1001 1001
  • 1000 1101 右移 28 位,得到 0000 0000 0010 0110 0100
  • 0x132 接近的两次偶数位右移都和 0x132 本身的二进制不相等,因此不是合法立即数

0x7f8 = 0000 0000 0000 0000 0000 0111 1111 1000

  • 最高位1至最低位1之间的二进制数序列:1111 1111
  • 1111 1111 右移 22 位,得到 0000 0000 0000 0000 0000 0011 1111 1100
  • 1111 1111 右移 20 位,得到 0000 0000 0000 0000 0000 1111 1111 0000
  • 0x7f8 接近的两次偶数位右移都和 0x7f8 本身的二进制不相等,因此不是合法立即数

0xfab4 = 0000 0000 0000 0000 1111 1010 1011 0100文章来源地址https://www.toymoban.com/news/detail-827628.html

  • 最高位1至最低位1之间的二进制数序列:0011 1110 1010 1101
  • 0011 1110 1010 1101 右移 14 位,得到 0000 0000 0000 0000 1111 1010 1011 0100
  • 虽然和 0xfab4 本身的二进制相等,但是二进制序列超过了8位,因此不是合法立即数

到了这里,关于ARM 汇编合法立即数判断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ARM系列】ARM常用汇编指令

    在调试芯片启动代码或者分析ARM core运行流程的过程中,尝尝需要对照软件代码的反汇编文件进行分析,因此有必要掌握一些常用的arm汇编指令。 指令格式:MOV{条件}{S} 目的寄存器,源操作数 指令含义:将源操作数赋值给目的寄存器。源操作数可以是寄存器,立即数或带移位

    2024年02月04日
    浏览(41)
  • ARM64 常见汇编指令学习 11 -- ARM 汇编宏 .macro 的学习

    下篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 上篇文章:ARM64 常见汇编指令学习 10 – 无符号位域提取指令 BFXIL 在 ARM 汇编中,“ .macro ” 是用来定义一个宏的指令。宏可以看作是一个可以在汇编程序中重用的代码段。当调用宏时,汇编器会将宏的内容插入到调

    2024年02月14日
    浏览(47)
  • 【ARM64 常见汇编指令学习 13 -- ARM 汇编 ORG 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 下篇文章:ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习 在ARM汇编中,\\\" org \\\"是一个汇编器伪指令,用于设置下一条指令的装入地址。\\\" org \\\"后面跟着的是一个表达式,这个表达式的值就是下一条

    2024年02月14日
    浏览(50)
  • 【ARM 常见汇编指令学习 5 -- arm64汇编指令 wzr 和 xzr】

    上篇文章:ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 下篇文章:ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或) ARMv8 在硬件层名引入了一个新的 zero 寄存器 : XZR (64-bits), WZR (32-bits)。比如要将某一变量赋值为0x0, 由于ARM不允许直接操作内存单元上的数据

    2024年02月15日
    浏览(101)
  • 嵌入式:ARM内嵌汇编及C和ARM汇编相互调用

    在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。但是内嵌汇编器并不支持诸如直接修改PC实现跳转的底层功能。 内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直

    2024年02月02日
    浏览(50)
  • 【理解ARM架构】不同方式点灯 | ARM架构简介 | 常见汇编指令 | C与汇编

    🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言: 你只管努力,剩下的交给时间! 在学习C语言的时候,我们会写个 Hello World 程序来入门,当我们写ARM程序,也该有一个简单的程序引领我们入门,这个程序就是点亮LED。 查看原理图,确定控制LED的引脚: 如上图是

    2024年02月05日
    浏览(48)
  • [ARM 汇编]高级部分—性能优化与调试—3.4.2 ARM汇编程序调试技巧

    在ARM汇编程序开发过程中,调试是一个关键环节。适当的调试技巧可以帮助我们更快地定位问题、解决问题,从而提高开发效率。本节将讲解一些ARM汇编程序的调试技巧,并通过实例进行讲解。 使用GDB调试 GDB(GNU调试器)是一个功能强大的调试工具,它支持ARM汇编程序的调

    2024年02月10日
    浏览(49)
  • 【ARM64 常见汇编指令学习 14 -- ARM 汇编 .balign,.balignw,.balign 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 下篇文章:ARM64 常见汇编指令学习 15 – ARM 标志位的学习 .balignl 是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是编译器来实现其功能的。. balignl 是 .balign 的变体。 .balignl 完整

    2024年02月14日
    浏览(47)
  • [ARM 汇编]高级部分—ARM汇编编程实战—3.3.1 嵌入式系统的基本概念

    嵌入式系统是一种特殊的计算机系统,通常用于执行特定的任务。它通常包含一个或多个微处理器、存储器和外围设备。与通用计算机系统相比,嵌入式系统具有体积小、功耗低、成本低和实时性强等特点。在这一部分,我们将介绍嵌入式系统的基本概念,并通过实例来展示

    2024年02月11日
    浏览(49)
  • [ARM 汇编]高级部分—ARM汇编编程实战—3.3.3 嵌入式应用程序设计实例

    在本章节中,我们将学习如何使用ARM汇编编写一个简单的嵌入式应用程序。我们将以STM32F103微控制器为例,编写一个程序,实现按下按钮时点亮LED的功能。 硬件连接 首先,我们需要将STM32F103微控制器的一个GPIO引脚连接到LED(通过一个合适的电阻),另一个GPIO引脚连接到按钮

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包