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

use*_*643 9 gnu gnu-assembler

我正在分析一个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
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我可以看到"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:
Run Code Online (Sandbox Code Playgroud)

我找不到"2f"和"1f"标签.

所以,我想知道"1b","1f","2f"等的含义.

Fre*_*pin 21

标签"xb"和"xf",其中"x"是数字是GNU程序集的智能扩展.它分支到第一个找到的标签"x",搜索"向前"代表"f"或"向后"搜索"b".

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

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

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