在ARM处理器的汇编语言中,对指令语法格局中的
其间,<>内的项是有必要的,{}内的项是可选的,如
opcode 指令助记符,如LDR,STR 等
cond 履行条件,如EQ,NE 等
S是否影响CPSR 寄存器的值,书写时影响CPSR,不然不影响
Rd 方针寄存器
Rn 第一个操作数的寄存器
shifter_operand第二个操作数
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位(偶数位)的到的)。
而10100000 0000 0000 0000 0000 00010110,就不契合这样的规则,编译时必定犯错。由于你或许经过将1011 0101循环右移位得到它,可是不或许经过循环移位偶数位得到。
10110000 0000 0000 0000 0000 00010110,也不契合这样的规则,很明显: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位位图”的个人了解,如有贰言,欢迎批评指正!!!!!!