我正在分析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”等的含义。
最佳答案
标签“xb”和“xf”(其中“x”是数字)是GNU程序集的智能扩展。它分支到第一个找到的标签“x”,在“forward”中搜索“f”,在“backward”中搜索“b”。
这意味着在使用“1b”作为目标的第一个 list 中,将在使用它的指令之前搜索“1”。在第二个 list 中,“2f”将在使用它的指令之后搜索“2”,该 list 末尾的“2b”将跳转到相同的“2”,因为它在指令之前。
您的代码中可能有多个带有数字的标签。
参见此处-https://sourceware.org/binutils/docs-2.24/as/Symbol-Names.html#Symbol-Names-“本地标签”一章。