【问题标题】:Weird GAS ARM syntax奇怪的 GAS ARM 语法
【发布时间】:2013-04-25 06:29:04
【问题描述】:

当我反汇编我的 arm elf .so 文件时,我看到了以下代码:

 170c:  e28fc600    add ip, pc, #0, 12

我只知道这是一条 ARM 的“添加”指令。 但从 ARM 参考手册中,“add”的语法如下:

op{S}{cond} {Rd}, Rn, Operand2

op{cond} {Rd}, Rn, #imm12               ; Thumb-2 ADD and SUB only

而 Operand2 是:

  #constant
  Rm {, shift}

这行asm应该归结为语法:

  op Rd, Rn, #constant

所以,代码应该意味着, "将 pc 和 #0 添加到 ip"

那么问题是:

  1. 代码的最后一部分“, 12”呢?
  2. 您在哪里找到这些信息,GAS 手册或 ARM 手册?

提前致谢。

【问题讨论】:

    标签: assembly arm gnu-assembler


    【解决方案1】:

    这可能是代码的一部分,将在链接时更改。

    编码中的 12 表示立即数将右移 12 位。显然,目前对于#0 来说没有意义。此外,整个操作码目前不过是花哨的

    mov ip, pc
    

    在运行时看一下代码,可能#0 变成了更有意义的东西。

    数字永远不会说谎。

               e28fc600

    小食

    1. e 总是
    2. 28 立即添加不设置条件代码。
    3. f RbpcR15
    4. c RdipR12
    5. 600 是移位器操作或零旋转 6*2

    由于指令比较诡异,反汇编后的输出可能异常;通常只显示常量#0xef00,因为没有人关心它是如何编码的。此外,由于这是一个共享库,指令可能会在运行时通过重定位来修复。

    【讨论】:

    • 感谢您的评论。但是你从哪里得到这些语法信息呢?
    • 来自 arm 架构参考手册 (ARM ARM)。根据您最初的问题,您已经有一个。如果您查看 ARM(不是 thumb 或 thumb2)的 ADD 指令,您会找到编码。 #imm12 在低 12 位中编码,最终结果为 result = RotateRight(bits[7:0], [12:8]*2)。
    • 我知道#imm12的意思。我只是想知道为什么“添加 ip, pc, #0, 12” 意味着将 #0 向右旋转 12。为什么不“添加 ip, pc, #0 ROR 12 ?
    • 那么这就是您应该在原始帖子中提出的问题。 @Masta79 给了你你想要的。也许你应该重新提出问题并再次提问。
    • @artless noise 感谢您的加入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多