奇怪的GAS ARM语法

时间:2013-04-25 06:29:05

标签: assembly arm gas

当我拆开我的手臂精灵.so文件时,我看到了以下代码:

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

我只知道它是一个ARM"添加"指令。 但是从ARM参考手册"添加"语法如下:

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手册?
  3. 提前致谢。

1 个答案:

答案 0 :(得分:3)

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

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

mov ip, pc

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

这些数字永远不会说谎。

e28fc600

<强>半字节

  1. e总是
  2. 28立即添加,没有设置条件代码。
  3. f Rb pcR15
  4. c Rd ipR12
  5. 600是移位操作或零旋转 6 * 2
  6. 由于指令相当 bizzare ,反汇编输出可能异常;通常只是常量显示#0xef00 ,因为没有人关心它是如何编码的。此外,由于这是共享库,因此可以在运行时通过重定位来修复指令。