Fedora-ARM
全部博文(241)
分类: LINUX
2007-08-07 17:13:25
在ARM处理器的汇编语言中,对指令语法格式中的
31-28 | 27-25 | 24-21 | 20 | 19-16 | 15-12 | 11-0 (12位) |
cond | 001 | opcode | S | Rn | Rd | shifter_operand |
当第2 个操作数的形式为:#immed_8r常数表达式时“该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的。”
其意思是这样:#immed_8r在芯片处理时表示一个32位数,但是它是由一个8位数(比如:01011010,即0x5A)通过循环移位偶数位得到(1000 0000 0000 0000 0000 0000 0001 0110,就是0x5A通过循环右移2位(偶数位)的到的)。
而1010 0000 0000 0000 0000 0000 0001 0110,就不符合这样的规定,编译时一定出错。因为你可能通过将1011 0101循环右移位得到它,但是不可能通过循环移位偶数位得到。
1011 0000 0000 0000 0000 0000 0001 0110,也不符合这样的规定,很明显:1 0110 1011 有9位。
为什么要有这样的规定?
本人的理解是:
要从指令编码格式来解释(这就是我为什么一开始讲的是指令编码格式),仔细看表格中的shifter_operand所占的位数:12位。要用一个12位的编码来表示任意的32位数是绝对不可能的(12位数有2^12种可能,而32位数有2^32种)。
但是又要用12位的编码来表示32位数,怎么办?
只有在表示数的数量上做限制。通过编码来实现用12位的编码来表示32位数。
在12位的shifter_operand中:8位存数据,4位存移位的次数。
8位存数据:解释了“该常数必须对应8位位图”。
4位存移位的次数:解释了为什么只能移偶数位。4位只有16种可能值,而32位数可以循环移位32次(32种可能),那就只好限制:只能移偶数位(两位两位地移,好像一个16位数在移位,16种移位可能)。这样就解决了能表示的情况是实际情况一半的矛盾。
所以对#immed_8r常数表达式的限制是解决指令编码的第二个操作数位数不足以表示32位操作数的无奈之举,但在我看来:这个可以说是聪明的做法。因为如果直接用12位数来表示32位操作数,只能表示0 到(2^12-1)。大于(2^12-1)的数就没办法表示了。而且细细想来“8位存数据,4位存移位的次数”,应该是最好的组合了(我并未想过所有的组合,只是顺便试了几个)。
以上是本人对ARM处理器中“8位位图”的个人理解,如有异议,欢迎批评指正!!!!!!
lixw_chinaunix2012-02-28 00:12:48
chinaunix网友2010-05-31 21:21:58
这是一个关于立即数合法的问题 #0x几几这样表示的是立即数 一条arm指令是32位 一个立即数占12位 8位是有效数 4位是位移(即最多右移30位) 列如0x2040就是0x81(10000001)循环右移28位所得 而0x1020就不是一个合法立即数 所以在uboot里初始mmu的代码中 我们看到的是 bic r0,#0x2300 bic r0,#0x85 而不是 bic r0,#2385