2010-07-15 96 views
3

我正在使用llvm-clang编译器,将简单的C函数编译到ARMv7-A处理器上进行汇编。我想弄清楚这个指令的功能。ARM SUB指令操作数

SUB sp, sp, #65, 30 

显然,这是在做一些局部变量堆栈指针的房间,但我从来没有见过四个操作数的ARM SUB指令。我猜测30以某种方式修改了#65,但我不知道如何,而且我还没有能够在“ARM体系结构参考手册”中找到详细信息。有什么建议么?

对于好奇,这是在一个程序的开始,创建一个8×8的整数矩阵,所以我希望该sp需要为堆栈上至少8 x 8 x 4字节的空间。

回答

7

30是在65

旋转右30比特循环右移操作是相同的旋转左2 bitswhich相同一个乘以4 65 * 4 = 260

所以这从堆栈指针中减去260。

+0

感谢您的快速回复。任何想到为什么会有一个立即移位而不是仅仅是数字260(ARM指令指定立即数为12位宽,对于常数260足够明显)? – Zeke 2010-07-15 20:37:42

+0

@Zeke:马丁的回答明白了为什么 – 2010-07-15 23:21:29

4

手臂设计为立即值分配12位,值为8位,并且剩余4位是向右旋转(表示旋转0 2 4等位置)。由于260不能被表示为8位,其构造为65 * 4。

此展开可用的立即值给程序员在整个32位范围,而不是将其限制为0到4095

1

ARM的分解器有时以这种格式作为8位常数+ 4-吐出常数bit ROR编码允许一些值以不同的方式编码。例如1可以被编码为1 ROR 0,4 ROR 2,16 ROR 4等

解码为这种格式允许指令编码明确指定,并允许重新组合指令编码。建立一个按位相同的二进制可能很重要。

+1

我不知道这是一种可用的格式,但是当试图设计可以以可预测的方式修补的代码时,这会很有帮助。例如,如果时序敏感例程需要添加数字0-65535,则可以在其中一个上使用左移8(右移24)的两个添加立即指令。这比在加载之前必须从内存加载16位值要快得多。 – supercat 2011-02-16 19:23:56