汇编语言中的.fun: 和 fun: 有什么区别?

问题描述 投票:0回答:1
.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:
有什么区别?谢谢你。

assembly raspberry-pi arm gnu-assembler
1个回答
0
投票

没有区别,它们只是标签名称。

.
是 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` 是否是无限循环取决于进位和零标志。

© www.soinside.com 2019 - 2024. All rights reserved.