gnu作为支持以$结尾的“额外本地符号”。这些符号未定义,每个非本地符号都已定义。但是以下代码给出了一个错误,指出正在重新定义符号.L1 $。我同时使用L1 $和.L1 $进行了测试,因为一些文档表明以L开头的符号是局部的。
这里在gnu中对一个文档的引用为:http://tigcc.ticalc.org/doc/gnuasm.html#SEC46
我在常规手册中找不到它,也许这是问题的一部分。我以为我看到了这是我的错误吗?不再受支持吗?
.global f
f:
.L1$:
mov r0, #1
bne .L1$
bx lr
.global g
g:
.L1$:
mov r0, #1
bne .L1$
bx lr
您声称存在的GNU汇编器不支持“额外的本地符号”功能。您可能对记录在案的Dollar Local Labels功能感到困惑,但是该功能无法按照您所描述的那样工作。
Dollar Local Labels是Local Symbol Names功能的变体,其中可以仅定义由数字组成的标签。美元本地标签功能还允许对仅包含数字和后跟单个美元符号($)的标签进行乘法定义。通过在标签后缀f
或b
来引用这些符号,以便汇编程序知道向前或向后查找标签。两者之间的区别在于,在定义了任何后续的非本地标签之后,Dollar Local Labels将变得未定义。
还请注意,以.L
开头的标签不是本地的,与前面段落中描述的符号的使用方式不同。以.L
开头的标签只能定义一次,并且可以在汇编源文件中的任何位置引用。从这个意义上讲,它们与任何普通符号没有什么不同。它们与普通符号的不同之处在于它们不包含在生成的目标文件的符号表中。
最后,请注意,除了不执行所需的操作外,Dollar Local Label功能也未在ARM目标上实现。它也没有在x86目标上实现。这并不是真正必要的,因为“本地符号名称”功能也可以正常工作。
[在任何平台上,GNU汇编器均不支持以非数字字符开头和以美元符号结尾的符号对待符号的功能。
谢谢@fuz,可惜此功能不在ARM上。这是没有道理的。每个汇编器都应仅在两个非本地符号之间定义本地符号。这种功能已经存在了40年。我在intel上尝试过,但也无法正常工作。