【问题标题】:Branch and carry added by compiler编译器添加的分支和进位
【发布时间】:2013-09-10 20:39:59
【问题描述】:

我正在查看我刚刚构建的可执行文件的反汇编,我对这行可能意味着什么感到困惑:

00000000 <func_foo>:
   0:   e1a0100d    mov r1, sp
   4:   e59fd090    ldr sp, [pc, #144]
   8:   e92d4002    push    {r1, lr}
   c:   eafffffe    b   c <func_foo+0xc> ;;; <<----- HERE

分支指令设置了一个进位位 (c),但它只是分支到自身。它看起来像一个无限循环,但我没有插入这段代码;它完全是编译器生成的(GCC 4.6.3)。

任何人都可以对此有所了解吗?

【问题讨论】:

  • 进位设置?你怎么看?你能展示你的函数的 C 源代码吗?正如您所建议的那样,该指令显然是一个无限循环。
  • 您是否正在反汇编动态链接的可执行文件,并因此查看尚未解决的库函数调用的占位符?
  • @unixsmurf 可能在正确的轨道上,尽管它不需要动态链接。如果您在func_foo 的末尾对来自不同翻译单元的函数进行了尾调用,则编译器可能会发出您所看到的内容。可以显示出处吗?
  • @CarlNorum:嗯,MarkP 说的是“可执行文件”而不是“目标文件”:) 如果这是一个不正确的说法,你的建议当然也是一种可能的解释。
  • 由于func_foo 位于0,它几乎肯定不是可执行文件。

标签: assembly arm carryflag


【解决方案1】:

指令不是“bc”,而是“b 0xc”。 (第一个十六进制数字“E”的ARM指令是无条件指令)。

”是一些信息,表示地址 0xc(跳转目标)是函数 func_foo 开始后的 0xc 个字节。这在具有多种功能的程序中是有意义的,而且不容易看到。

【讨论】:

    【解决方案2】:

    你会看到一个 bcsbcc 如果它是一个 branch if carry setbranch if carry clear,您会看到 b 0xC 这是当前地址。

    从技术上讲,它是自我指令的分支,编码不是特定的或硬编码为 0xC,它只是 pc-2 指令的分支,因为 pc 前面有 2 条指令,它是自我的分支。 (分支到指令地址 + 2 - 2 = 分支到指令地址)

    这看起来就像你根据 0x00000 的地址和这个分支到 self.当您与其他内容链接时,地址应该会更改,并且到 self 的分支将更改为分支到您在源代码中指定的任何功能。

    【讨论】:

    • 道歉。您在此处看到的输出是一个 objdump。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2013-04-28
    • 2013-08-13
    • 1970-01-01
    相关资源
    最近更新 更多