GNU/Linux xterm-256color bash 192 views

/*
Autor: Victor Manuel Madrid Lugo
Fecha: 09/04/2025
Descripción: Cuenta los números impares del 1 al 10
Demostración: [https://asciinema.org/a/sdymjzCSHnWAYIfnenp5SWHRJ]

Equivalente en Python:
count = 0
for i in range(1, 11):
    if i % 2 != 0:
        count += 1
print(f"Total de impares: {count}")
*/

.section .data
    msg_result: .asciz "Total de impares: "
    newline:    .asciz "\n"
    buffer:     .skip 12       // Buffer para conversión numérica

.section .text
.global _start

_start:
    // Inicializar variables
    mov x19, #1          // Contador (i) inicia en 1
    mov x20, #0          // Acumulador (contador de impares)

check_loop:
    // Verificar si es impar (i % 2 != 0)
    tst x19, #1          // Test bit menos significativo (AND sin guardar)
    beq even_number       // Si es cero, es par

    // Incrementar contador de impares
    add x20, x20, #1

even_number:
    // Incrementar contador principal
    add x19, x19, #1

    // Verificar condición (i <= 10)
    cmp x19, #10
    ble check_loop

    // Convertir resultado a string
    ldr x0, =buffer
    mov x1, x20
    bl int_to_str
    mov x21, x0          // Guardar longitud

    // Imprimir mensaje
    mov x0, #1
    ldr x1, =msg_result
    mov x2, #17          // Longitud de msg_result (ahora es más largo)
    mov x8, #64          // syscall write
    svc #0

    // Imprimir resultado
    mov x0, #1
    ldr x1, =buffer
    mov x2, x21          // Longitud del número
    mov x8, #64
    svc #0

    // Imprimir nueva línea
    mov x0, #1
    ldr x1, =newline
    mov x2, #1
    mov x8, #64
    svc #0

    // Salir
    mov x0, #0
    mov x8, #93
    svc #0

// Función int_to_str (igual que en el original)
int_to_str:
    mov x2, #10
    mov x3, #0           // Contador dígitos
    mov x4, x0           // Guardar dirección buffer

    // Manejar 0
    cbz x1, handle_zero

    // Convertir dígitos
convert_loop:
    udiv x5, x1, x2      // x5 = x1 / 10
    msub x6, x5, x2, x1  // x6 = x1 % 10
    add x6, x6, #'0'
    strb w6, [x4, x3]
    add x3, x3, #1
    mov x1, x5
    cbnz x1, convert_loop

    // Invertir dígitos
    mov x5, #0           // inicio
    sub x6, x3, #1       // fin
reverse_loop:
    cmp x5, x6
    b.ge reverse_done
    ldrb w7, [x4, x5]
    ldrb w8, [x4, x6]
    strb w8, [x4, x5]
    strb w7, [x4, x6]
    add x5, x5, #1
    sub x6, x6, #1
    b reverse_loop

handle_zero:
    mov w5, #'0'
    strb w5, [x4]
    mov x3, #1

reverse_done:
    // Null terminator
    mov w5, #0
    strb w5, [x4, x3]
    mov x0, x3           // Devolver longitud
    ret