代码之家  ›  专栏  ›  技术社区  ›  Zeke

ARM子指令操作数

  •  3
  • Zeke  · 技术社区  · 16 年前

    我正在使用llvm-clang编译器,将简单的C函数编译到armv7-a处理器上的汇编。我正试图弄明白这个指令的作用。

    SUB sp, sp, #65, 30
    

    显然,它在堆栈指针上为一些局部变量腾出了空间,但我从未见过带有四个操作数的ARM子指令。我猜30是以某种方式修改了65,但我不知道如何修改,而且我还没有在ARM架构参考手册中找到细节。有什么建议吗?

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

    3 回复  |  直到 15 年前
        1
  •  7
  •   jcoder    16 年前

    30是65上的右旋转操作

    向右旋转30位与向左旋转2位相同,其值与乘以4的值相同。65×4=260

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

        2
  •  4
  •   Martin    16 年前

    ARM设计为立即值分配12位,值分配8位,其余4位为向右旋转(重新设置旋转0 2 4个位置等)。因为260不能用8位表示,所以它的构造是65*4。

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

        3
  •  1
  •   David Thomas    15 年前

    ARM反汇编器有时会以这种格式输出常量,因为8位常量+4位ROR编码允许以不同的方式对某些值进行编码。例如,1可以编码为1 ror 0、4 ror 2、16 ror 4等。

    对这种格式的解码允许明确地指定指令编码,并允许重新汇编准确的指令。构建一个位相同的二进制文件可能很重要。