我正在分析一个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"等等。
答案 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大型机上使用替代方案 - 相信我,这并不好玩!