ARM立即数问题

来源:互联网 发布:淘宝童装店铺名 编辑:程序博客网 时间:2024/05/22 12:00
最近学习汇编,遇到一个问题,我把截图贴在下面

上面可以看出,相信应该有人感到郁闷吧,为啥oxffffffff可以识别,而ox1ff却不行,网上查了好多资料,所以总结一下,
<immediate>=immed_8循环右移(2*rotate_imm)
immediate  :  立即数
immed_8    :  8位的常数
rotate_imm :  4位的循环右移值(用来存放移位的次数)
 简单的说一个立即数可以由一个8位的常数循环移位偶数位得到,ARM的一条指令是32位,其中只能用指令机器码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位常数了。

立即数的判断?
0x1FC(0000 0000 0000 0000 0000 0001 1111 1100) 1的位数小于8,满足要求
而 0x1FF(0000 0000 0000 0000 0000 0001 1111 1111)是非法的

而0xffffffff虽然不满足立即数的条件,但它满足有效数条件。对于有效数,它的反码满足立即数的条件,编译器会自动的把它变换为mvn r1, #0,所以一个数是立即数或者一个数的反码是立即数的都可以满足条件。
当然也可以使用伪指令满足我们的要求,当然了,这样做是有弊端的,
LDR R1, =count
LDR R1, =0X1FF

原创粉丝点击