ARM指令中怎么判断合法立即数的方法(转载)

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM指令中怎么判断合法立即数的方法(转载) 的相关文章

随机推荐

  • USB2.0 UTMI接口

    1 UTM Functional Block Diagram 2 UTMI Signal Descriptions 2 1 nbsp System Interface Signals 2 2 Data Interface Signals n
  • USB2.0 ULPI接口介绍

    UTMI Low Pin Interface ULPI nbsp a generic low pin interface LPI between a Link and a PHY 1 general ULPI defines a PHY t
  • 《IT项目管理》(郭宁编著) 课后习题答案

    目录 第一章 it项目管理概述 第二章 组织环境与项目管理过程 第三章 it项目整体管理 第四章 it项目范围管理 第五章 it项目时间管理 第六章 it项目成本管理 第七章 it项目质量管理 第八章 项目人力资源管理 第九章 项目沟通管理
  • FPGA USB device原型验证流程及调试手段

    device mode enable usb ACM usb serial gadget function and connect it to PC host 1 register access check if register acce
  • FPGA USB host原型验证流程及调试手段

    host mode plug in a device for test super speed device usb3 0 usb storage high speed device usb2 0 usb storage full spee
  • USB2.0 UTMI+接口

    1 UTMI The UTMI standard contains progressive levels of technology support because the complexity requirements for devic
  • cadence usb linux配置

    1 kernel config 2 dts
  • USB3.0 host xHCI驱动

    xHCI驱动在usb host中 主要初始化xHCI xHCI作为usb nbsp host部分的驱动 1 nbsp xhci driver与device的匹配 usb host xhci plat c static struct plat
  • windows PCIe 工具: TeleScan

    TeleScan PE for Windows 用户可以通过TeleScan PE来扫描系统中的PCI PCIe设备 xff0c 并提供了读写其配置空间中的寄存器的功能 download Teledyne LeCroy PCI Expres
  • intel 82574 1000M pcie 网卡 kernel driver

    0 kernel config Device Drivers gt Network device support gt Ethernet driver support gt Intel devices lt gt Intel R PRO 1
  • Windows NFS server:Winnfsd

    1 Winnfsd GitHub winnfsd winnfsd Usage WinNFSd exe id lt uid gt lt gid gt log on off pathFile lt file gt addr lt ip gt e
  • windows dhcp server

    1 tool Open DHCP Server Open Source Freeware Windows Linux MultiSubnet MultiDomain DHCP Server supports every Industry S
  • uboot环境变量保存到EMMC

    1 cmd 命令行可以用setenv printenv saveenv uboot u boot 2020 04 cmd nvedit c setenv gt do env set gt do env set gt hsearch r en
  • 安装VScode配置c/c++环境出现问题提示#include errors detected. Please update your includePath......解决办法

    文章目录 1 vscode下载安装以及c c 43 43 插件安装 2 MinGW安装3 配置环境变量4 配置几个json文件 1 vscode下载安装以及c c 43 43 插件安装 VScode下载地址 2 MinGW安装 官网下载地址
  • linux支持ipv6

    1 kernel config Networking support gt Networking options gt lt gt The IPv6 protocol gt 2 test 2 1 proc net if inet6 查看 p
  • 以太网 网线分类

    1 双绞线分类 一类线 xff1a 主要用于传输语音 xff08 一类标准主要用于八十年代初之前的电话线缆 xff09 xff0c 不同于数据传输 二类线 xff1a 传输频率为1MHZ xff0c 用于语音传输和最高传输速率4Mbps的数
  • linux pcie RC 框架

    1 linux pcie rc framework Following is a brief explanation of layers shown in the diagram There are different drivers fo
  • you-get下载bilibili视频

    you get是一个命令行工具 xff0c 可以从网络上下载视频 音频 图片等资源 https codechina csdn net mirrors soimort you get utm source 61 csdn github acc
  • gpg: 无法检查签名:没有公钥

    repo error 34 git 34 failed with exit status 1 cmd 39 git 39 39 tag 39 39 v 39 39 v1 12 16 39 stdout gt gt object 666d53
  • ARM指令中怎么判断合法立即数的方法(转载)

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