2

I'm looking at a disassembly of an executable I just built, and I'm confused as to what this line can possibly mean:

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

The branch instruction has a carry bit (c) set, but it just branches to itself. It looks like an infinite loop, but I did not insert this code; it was entirely compiler generated (GCC 4.6.3).

Can anyone shed some insight on this?

4

2 回答 2

2

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

“ < func_foo+0xc > ”是一些信息,表明地址 0xc(跳转目标)是函数 func_foo 开始后的 0xc 个字节。这在具有多种功能的程序中很有意义,因为它不容易看到。

于 2013-09-10T20:50:04.153 回答
1

如果进位设置为分支,则您将看到bcsbcc ,如果进位清除则为分支,您将看到b 0xC这是当前地址。

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

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

于 2013-09-10T21:01:03.097 回答