ARM SUB指令操作数

时间:2010-07-15 18:34:50

标签: assembly arm

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

SUB sp, sp, #65, 30

显然它正在为一些局部变量的堆栈指针腾出空间,但我从未见过带有四个操作数的ARM SUB指令。我猜测30会以某种方式修改#65,但我不知道如何,而且我无法在“ARM体系结构参考手册”中找到详细信息。有什么建议吗?

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

3 个答案:

答案 0 :(得分:7)

30是65的旋转右操作

向右旋转30位与向左旋转2位相同,与乘以4相同.65 * 4 = 260

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

答案 1 :(得分:4)

臂设计为立即值分配12位,为值分配8位,并且剩余4位为右旋转(​​表示旋转0 2 4等位置)。由于260不能以8位表示,因此构造为65 * 4.

这会扩展程序员在整个32位范围内可用的直接值,而不是将其限制为0到4095

答案 2 :(得分:1)

ARM反汇编程序有时会以这种格式吐出常量,因为8位常数+ 4位ROR编码允许以不同方式编码某些值。例如1可以编码为1 ROR 0,4 ROR 2,16 ROR 4等

解码为此格式允许明确指定指令编码,并允许重新组装精确指令。构建按位相同的二进制文件可能很重要。