ARM SUB指令操作数

Zek*_*eke 4 assembly arm

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

SUB sp, sp, #65, 30
Run Code Online (Sandbox Code Playgroud)

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

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

jco*_*der 8

30是65的右旋操作

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

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


小智 5

手臂设计为立即数分配12位,为该值分配8位,其余的4位为右旋转(​​复位旋转0 2 4等位)。由于260无法以8位表示,因此其构造为65 * 4。

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