在ARM处理器中,如何确定班次是右移还是左移?

时间:2014-04-23 15:40:33

标签: c arm

我正在C中开发基于软件的ARM处理器实现。 给出ARM数据处理指令:

instruction = 0xE3A01808;               1110 0 0 1 1101 0 0000 0001 1000 00001000

转换为:MOV r0,#8;移位了8位。 如何检查8位移位是右移还是左移?

2 个答案:

答案 0 :(得分:2)

对于ARM 12位修改的立即常量,在任何方向上都没有 shift - 它是旋转,具体而言,< 7:0>向右旋转2 *< 11:8>。因此,编码0x808代表8 ROR(2 * 8),意味着0xE3A01808反汇编为mov, r1, #0x80000

(请注意,修改后的立即常量的规范编码是旋转最小的,因此mov, r1, #0x80000汇编0xE3A01702,即2 ROR 14,而不是比8 ROR 16 1 )。

至于在C中实现按位旋转,以解决编译器内在函数或标准的shift-part-in-each方向习语x>>n | x<<(32-n)


[1]为了获得特定的编码,UAL程序集允许使用单独指定的常量和旋转的立即语法,即mov r1, #8, 16。有关详细信息,请参阅the ARM ARM(我在此处的v7问题中的A5.2.4节) - 基本上,编码的选择允许在某些情况下使用标记进行有趣的业务。

答案 1 :(得分:0)

我不确定这是否是您所指的,但这里有一些看似相关的文档:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0040d/ch05s05s01.html

&#39; WITHDRAWN&#39;粘贴在文档上并不能激发人们的信心。

似乎建议向右旋转。这与我如何记住手臂上的桶形移位器更常见(例如,有一个ROR操作,见http://www.davespace.co.uk/arm/introduction-to-arm/barrel-shifter.html