如何判断立即数_华清远见

2023-12-08 20:34:23   文档大全网     [ 字体: ] [ 阅读: ]

#文档大全网# 导语】以下是®文档大全网的小编为您整理的《如何判断立即数_华清远见》,欢迎阅读!
华清,远见,立即,判断,如何
如何判断立即数

本篇文章教大家如何判断立即数,立即数是我们在编程开发中常用到的知识点,所以还不清楚的人建议好好看看本篇文章。如何判断立即数,请往下看。

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

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、把数据转换成二进制形式,从低位到高位写成41组的形式,最高位一组不够四位的,在最高位前面补0

2、数1的个数,如果大于8个肯定不是立即数,如果小于等于8进行下面步骤。 3、如果数据中间有连续的大于等于240,循环左移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,继续 第三步: 其中没有连续大于等于240,继续

第四部: xx01 0010 0010 (最高位前面有30,最大偶数2,去掉20) 第五步: xx10 0011 0010 (最低位后面只有10,最大偶数0) 第六部: 剩下10 0011 0010 10位,大于8,判定0x122不是立即数 3 0x234

第一步: 0010 0011 0100

第二步: 其中1的个数4个,小于8,继续 第三步: 其中没有连续大于等于240,继续 第四部: 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,继续

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


本文来源:https://www.wddqxz.cn/9131ee105bcfa1c7aa00b52acfc789eb172d9ebe.html

相关推荐