¿Cuál es la diferencia entre .fun: y fun: en lenguaje ensamblador?
.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
Mi código ensamblador se ejecuta en Raspberry Pi 4B, ¿por qué cuando lo reemplazo .loop:
con loop:
y .endloop:
con endloop:
, todavía se ejecuta normalmente? ¿Cuáles son las diferencias entre .loop:
y loop:
? Gracias.
No hay diferencia, son solo nombres de etiquetas. .
es un carácter válido en símbolos asm, incluido el primer carácter.
Pero por convención, .
las etiquetas son "locales" para la función. En la sintaxis NASM (un ensamblador x86), en realidad tienen ese alcance, por lo que puedes tener .loop
dentro múltiples funciones diferentes.
En GNU Assembler (GAS) como aquí, .loop
no es nada especial; sería un error (redefinición de símbolo) tener foo:
; .loop:
anterior o posterior en el archivo.
.Lxyz
Las etiquetas que comienzan con un punto y una L mayúscula son especiales (no aparecen en la tabla de símbolos ni .o
siquiera para la depuración), pero aún tienen alcance de archivo. https://sourceware.org/binutils/docs/as/Symbol-Names.html Es por eso que GCC usa nombres de etiquetas como .L0
para objetivos de rama dentro de funciones (if/else/loops/etc) y nombres como .LC0
para constantes en .rodata
, e incluso cosas como .Lanchor0
ubicaciones que quiere marcar para hacer referencia a otras cosas relativas.
Para etiquetas locales reales en GAS que puede definir más de una vez, use números simples como 1:
y consúltelos con 1b
para retroceder al más cercano 1
en esa dirección, 1f
para el más cercano 1:
en la dirección de avance. Me gusta 1: bhi 1b
es un bucle infinito o no dependiendo de las banderas de acarreo y cero.