.section .data
msg1:
.asciz "Hello1: %d\r\n"
msg2:
.asciz "Hello2: %d\r\n"
.section .text
.global main
main:
mov r4, #0
.loop:
cmp r4, #5
bge .endloop
ldr r0, =msg1
mov r1, r4
bl printf
add r4, r4, #1
b .loop
.endloop:
mov r7, #1
mov r0, #0
swi 0
我的汇编代码在Raspberry Pi 4B上运行,为什么当我将
.loop:
替换为loop:
并将.endloop:
替换为endloop:
时,它仍然可以正常执行? .loop:
和 loop:
有什么区别?谢谢你。
没有区别,它们只是标签名称。
.
是 asm 符号中的有效字符,包括作为第一个字符。
但按照惯例,
.
标签对于函数来说是“本地的”。在 NASM 语法(x86 汇编器)中,它们实际上是这样限定作用域的,因此您可以在多个不同的函数中使用 .loop
。
在像这里这样的 GNU 汇编器 (GAS) 中,
.loop
一点也不特殊;拥有 foo:
将会是一个错误(符号重新定义); .loop:
文件中较早或较晚的位置。
以点和大写 L 开头的 .Lxyz
标签是特殊的(即使在调试时也根本不会出现在 .o
的符号表中),但仍然是文件范围的。 https://sourceware.org/binutils/docs/as/Symbol-Names.html 这就是为什么 GCC 使用 .L0
等标签名称作为函数内的分支目标(if/else/loops/etc)以及 等名称.LC0
用于 .rodata
中的常量,甚至像 .Lanchor0
这样的内容用于它想要标记以引用相对于其他内容的位置。
对于 GAS 中可以多次定义的实际本地标签,请使用像
1:
这样的裸数字,并用 1b
引用它以向后到该方向上最近的 1
,1f
代表最近的 1:
向前。像 1: bhi 1b` 是否是无限循环取决于进位和零标志。