ARM程序集本地标签

qwe*_*rtz 7 assembly gcc arm

我目前正在阅读关于Raspberry Pi OS开发的教程,并且想知道本代码标签在这个代码片段(GCC ARM Assembly)中的使用方式:

    ...
    b       2f
1:
    stmia   r4!, {r5-r8}
2:
    cmp     r4, r9
    blo     1b
    ...
Run Code Online (Sandbox Code Playgroud)

如果1:用作标签,则必须在跳转指令之前fb之后指定,以使汇编器知道跳转的目标方向.据我所知你也可以使用这个:

    ...
    b       .2
.1:
    stmia   r4!, {r5-r8}
.2:
    cmp     r4, r9
    blo     .1
    ...
Run Code Online (Sandbox Code Playgroud)

我认为这个选项不那么令人困惑(本地标签在x86程序集中也标有一个点),因为标签引用后没有其他字母.我测试了生成的机器代码,它是一样的.所以我的问题:

  • 为什么要使用另一种变体?

  • 为什么有必要用f或指定跳跃的方向b

Jes*_*ter 9

重要的区别在于编号的本地标签可以毫无顾虑地重复使用,这也是您需要指定方向的原因.您可以跳到前一个或后一个,但不能跳到它们之外.

1: foo
...
1: bar
...
jmp 1b # jumps to bar
...
jmp 1f # jumps to baz
...
1: baz
...
1: qux
...
jmp 1b # jumps to qux
Run Code Online (Sandbox Code Playgroud)

只要您只在一个块中使用它们,您就可以确定它们将按预期工作,而不会与其他任何内容冲突.