图1b和1f在GNU程序集中

时间:2014-12-08 07:14:45

标签: gnu gas

我正在分析一个linux异常代码。 顺便说一下,我无法理解gnu汇编语法。

    svc_preempt:
    mov r8, lr
1:  bl  preempt_schedule_irq        @ irq en/disable is done inside
    ldr r0, [tsk, #TI_FLAGS]        @ get new tasks TI_FLAGS
    tst r0, #_TIF_NEED_RESCHED
    moveq   pc, r8              @ go again
    b   1b

在此代码中,我可以看到" b 1b",但我无法找到" 1b"在任何地方标记。

#ifdef CONFIG_NEON
    adr r6, .LCneon_thumb_opcodes
    b   2f
#endif
call_fpe:
#ifdef CONFIG_NEON
    adr r6, .LCneon_arm_opcodes
2:
    ldr r7, [r6], #4            @ mask value
    cmp r7, #0              @ end mask?
    beq 1f
    and r8, r0, r7
    ldr r7, [r6], #4            @ opcode bits matching in mask
    cmp r8, r7              @ NEON instruction?
    bne 2b
    get_thread_info r10
    mov r7, #1
    strb    r7, [r10, #TI_USED_CP + 10] @ mark CP#10 as used
    strb    r7, [r10, #TI_USED_CP + 11] @ mark CP#11 as used
    b   do_vfp              @ let VFP handler handle this
1:

我无法找到" 2f"和" 1f"标签

所以,我想知道" 1b"," 1f"," 2f"等等。

2 个答案:

答案 0 :(得分:20)

标签" xb"和" xf",其中" x"是一个数字是GNU程序集的智能扩展。它分支到第一个找到的标签" x"搜索"转发"为" f"或者"落后"为" b"。

这意味着在您的第一个列表中使用" 1b"作为目标将搜索" 1" BEFORE 使用它的指令。在第二个上市" 2f"将搜索" 2" AFTER 使用它的指令," 2b"在此列表的末尾将分支到相同的" 2",因为它是 BEFORE 指令。

您的代码中可能有多个带数字的标签。

请参阅此处 - https://sourceware.org/binutils/docs-2.24/as/Symbol-Names.html#Symbol-Names - 章节"本地标签"。

答案 1 :(得分:0)

这些是相对分支(相对于当前位置向前或向后的字节数很多),因此他们不会真正拥有标签。但是,在对代码进行可视化时,实际上可以更容易地对其所处的位置进行某种可视化 - 因此" not-label" 1和向后和向前跳跃。

我不得不在IBM370大型机上使用替代方案 - 相信我,这并不好玩!