31-28 | 27-25 | 24-21 | 20 | 19-16 | 15-12 | 11-0 (12位) |
cond | 001 | opcode | S | Rn | Rd | shifter_operand |
为什么要有这样的规定?
本人的理解是:
要从指令编码格式来解释(这就是我为什么一开始讲的是指令编码格式),仔细看表格中的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位位图”的个人理解,如有异议,欢迎批评指正!!!!!!邮箱:tekkamanninja@163.com
;------------------------------------------------------------------------------------------------------------------
还是有一点点不理解,比方说12bit是怎么表示0xFFFFFFFF这个数的呢?谢谢!Blog作者的回复: 比如 mov r2, 0x0007f000 她的机器代码是 E3 A0 2A 7F 而 0x0007f000 对应 0x0A7F (12bit) 这样你就可以看出0x0A7F中7F代表的是8位位图,A代表偶次位移的次数(注意:是偶次位移,实际的位移要*2)。 所以你可以这样理解: 将0x7F循环右移20位(A*2)得到0x0007f000 对于0xFFFFFFFF,其实不是直接表示的,而是编译器自动用0x00000000取反得到的,你可以看看机器码。 比如 mov r1, #0xffffffff 其机器码为 E3 E0 10 00 #0xffffffff对应0x000 但是你发现没:mov的机器指令由E3 A0变成了E3 E0 也就是由1110|001|1101|0 变成了 1110|001|1111|0 (数据处理指令机器代码前面一部分的格式:XXXX(4bit)|001|xxxx(操作码)|S) 关键就在这操作码由1101(传送值)变成了1111(传送取非)!! |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |