我目前正在阅读关于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:用作标签,则必须在跳转指令之前f或b之后指定,以使汇编器知道跳转的目标方向.据我所知你也可以使用这个:
...
b .2
.1:
stmia r4!, {r5-r8}
.2:
cmp r4, r9
blo .1
...
Run Code Online (Sandbox Code Playgroud)
我认为这个选项不那么令人困惑(本地标签在x86程序集中也标有一个点),因为标签引用后没有其他字母.我测试了生成的机器代码,它是一样的.所以我的问题:
为什么要使用另一种变体?
为什么有必要用f或指定跳跃的方向b?
重要的区别在于编号的本地标签可以毫无顾虑地重复使用,这也是您需要指定方向的原因.您可以跳到前一个或后一个,但不能跳到它们之外.
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)
只要您只在一个块中使用它们,您就可以确定它们将按预期工作,而不会与其他任何内容冲突.