Assembly 编译器添加的分支和进位

Assembly 编译器添加的分支和进位,assembly,arm,carryflag,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 0000000

我正在查看我刚刚构建的可执行文件的反汇编,我不明白这行代码可能意味着什么:

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
00000000:
0:e1a0100d mov r1,sp
4:e59fd090 ldr sp,[pc,#144]
8:e92d4002推送{r1,lr}
c:eafffffe b c 指令不是“bc”,而是“b 0xc”。(带有第一个十六进制数字“E”的ARM指令是无条件指令)

”是一些说明地址0xc(跳转目标)是函数func\u foo启动后的0xc字节的信息。这在具有多个功能的程序中是有意义的,因为在这些程序中不太容易看到。如果进位设置为分支,则会看到bcs或bcc;如果进位清除为分支,则会看到b 0xC,这是当前地址

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


这看起来像是您根据0x00000地址和self分支反汇编了一个对象,即未链接的代码。当您链接到其他内容时,地址应该更改,而“自我”分支将更改为您在源代码中指定的任何函数的分支。

进位设置?你怎么看?你能为你的函数显示C源代码吗?正如您所建议的,该指令显然是一个无限循环。您是否正在分解一个动态链接的可执行文件,并因此查看尚未解析的库函数调用的占位符?@unixsmurf可能是正确的,尽管它不需要动态链接。如果在
func\u foo
的末尾有一个来自不同翻译单元的函数尾部调用,编译器可能会发出您看到的结果。你能告诉我来源吗?@CarlNorum:嗯,MarkP说的是“可执行文件”而不是“目标文件”:)如果这是一个错误的陈述,你的建议当然也是一个可能的解释。因为
func\u foo
位于
0
,它几乎肯定不是可执行文件。抱歉。您在这里看到的输出是一个objdump。