GNU 汇编中的 1b 和 1f

Posted

技术标签:

【中文标题】GNU 汇编中的 1b 和 1f【英文标题】:1b and 1f in GNU assembly 【发布时间】:2015-02-05 19:39:57 【问题描述】:

我正在分析一个 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”等的含义。

【问题讨论】:

【参考方案1】:

这些是相对分支(相对于当前位置向前或向后有很多字节),因此它们真的没有标签。但是,在可视化代码时,实际上更容易对其去向进行某种可视化 - 因此 1 的“非标签”以及前后跳转。

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

【讨论】:

不,他们没有,我也没说他们是。这里的数字是一个伪标签。这些字节是汇编指令的一部分(例如,向前分支 27 个字节)。如果没有 1 或 2 的伪标签,则必须先计算每条指令的大小,包括操作数,然后才能确定要去哪里。【参考方案2】:

标签“xb”和“xf”,其中“x”是一个数字,是对 GNU 程序集的智能扩展。它分支到第一个找到的标签“x”,搜索“f”的“forward”或“b”的“backward”。

这意味着在您使用“1b”作为目标的第一个列表中,将在使用它的指令之前搜索“1”。在第二个清单中,“2f”将在使用它的指令之后搜索“2”,然后该清单末尾的“2b”将分支到相同的“2”,因为它是指令之前。

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

见这里 - https://sourceware.org/binutils/docs-2.24/as/Symbol-Names.html#Symbol-Names - “本地标签”一章。

【讨论】:

以上是关于GNU 汇编中的 1b 和 1f的主要内容,如果未能解决你的问题,请参考以下文章

GNU 汇编器 x86 指令后缀(如“mov.s”中的“.s”)如何工作?

GNU 汇编器中的本地标签; gdb 打印回溯,就好像标签是函数一样

设置一个ARM汇编使用(GNU)使用c中的函数实现两数组对应位相乘后进行累加,回答详细可随意加分,如下程序:

ARM汇编伪指令

如何在 gnu pascal 中编写内联汇编?

在GNU汇编程序中声明一个固定长度的填充字符串