分支和携带由编译器添加

时间:2013-09-10 20:39:59

标签: assembly arm carryflag

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

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)。

有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分:2)

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

“&lt; func_foo + 0xc&gt;”是一些信息,表示在函数func_foo启动后地址0xc(跳转目标)为0xc字节。这在具有多种功能的程序中是有意义的,因为它不容易看到。

答案 1 :(得分:1)

如果是分支,如果进行分支,如果进行清除,您会看到 bcs bcc >,您将看到 b 0xC ,这是当前地址。

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

这看起来像你基于0x00000的地址和自己的分支反汇编了一个对象,未链接的代码。当您与其他内容链接时,地址应该更改,并且分支到self将更改为分支到您在源中指定的任何功能。