【问题标题】:ARM SUB Instruction OperandsARM SUB 指令操作数
【发布时间】:2011-03-16 13:57:14
【问题描述】:

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

SUB sp, sp, #65, 30

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

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

【问题讨论】:

    标签: assembly arm


    【解决方案1】:

    30 是对 65 的向右旋转操作

    右移 30 位与左移 2 位相同,与乘以 4 相同。65 * 4 = 260

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

    【讨论】:

    • 感谢您的快速回复。知道为什么会有一个移位的立即数而不仅仅是数字 260(ARM 指令指定立即数为 12 位宽,对于常数 260 来说显然足够了)?
    • @Zeke:Martin 的回复说明了原因
    【解决方案2】:

    arm 设计为立即数分配 12 位,为值分配 8 位,剩余的 4 位是右循环(表示循环 0 2 4 等位)。由于 260 不能用 8 位表示,因此它构造为 65*4。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我不知道这是一种可用的格式,但在尝试设计可以以可预测方式修补的代码时会很有帮助。例如,如果对时间敏感的例程需要添加一个数字 0-65535,则可以在其中一个上使用左移 8(右移 24)的两条加法立即指令。这比在添加之前必须从内存中加载 16 位值要快得多。
      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 2014-09-11
      • 2014-04-15
      • 2011-07-03
      相关资源
      最近更新 更多