GNU/Linux xterm-256color bash 183 views

/*
Autor: Victor Manuel Madrid Lugo
Fecha: 09/04/2025
Descripción: Contador de 0 a 9 usando un bucle
Demostración: [https://asciinema.org/a/5j0TYAnvYiHFMHSACGMc5foP7]

Equivalente en Python:
for i in range(10):
    print(i)
*/

// Contador de 0 a 9 en ensamblador ARM64
// Archivo: contador.s

// Contador cíclico de 0 a 9 en ensamblador ARM64
// Archivo: contador_ciclico.s


.global _start       // Punto de entrada global

.data
msg:    .ascii "Contador: "
digit:  .ascii "0\n"    // Dígito a mostrar, seguido de salto de línea
len = . - msg       // Longitud del mensaje completo

.text
_start:
    // Inicializar contador en x19
    mov x19, #0     // x19 = 0 (nuestro contador)

loop:
    // Imprime "Contador: X"
    mov x0, #1              // fd = 1 (stdout)
    adr x1, msg             // buffer = dirección del mensaje
    mov x2, #len            // longitud = len
    mov x8, #64             // syscall = write (64)
    svc #0                  // llamada al sistema

    // Convierte el dígito actual a ASCII
    add x20, x19, #48       // Convierte el dígito a ASCII (0 = 48 en ASCII)
    
    // Actualiza el dígito en memoria
    adr x21, digit          // Carga la dirección de 'digit'
    strb w20, [x21]         // Almacena el byte del dígito ASCII en la dirección

    // Imprime el dígito con salto de línea
    mov x0, #1              // fd = 1 (stdout)
    adr x1, digit           // buffer = dirección del dígito
    mov x2, #2              // longitud = 2 (dígito + salto de línea)
    mov x8, #64             // syscall = write (64)
    svc #0                  // llamada al sistema

    // Incrementa el contador
    add x19, x19, #1        // x19 = x19 + 1

    // Si el contador llega a 10, reiniciarlo a 0
    cmp x19, #10            // Compara x19 con 10
    b.ne skip_reset         // Si no es igual a 10, salta la reinicialización
    mov x19, #0             // Si es 10, reinicia a 0

skip_reset:
    // Pequeña pausa (con valor más pequeño)
    mov x0, #0xFFFFF        // Valor para un bucle de retardo (más pequeño)
delay:
    subs x0, x0, #1         // Decrementa el contador de retardo
    b.ne delay              // Continúa mientras no sea cero

    // Siempre vuelve al inicio del bucle (bucle infinito)
    b loop                  // Salto incondicional a 'loop'

    // Este código nunca se ejecutará debido al bucle infinito
    mov x0, #0              // código de salida = 0 (éxito)
    mov x8, #93             // syscall = exit (93)
    svc #0                  // llamada al sistema