GNU/Linux xterm-256color zsh 157 views

.global _start

.section .bss
input:  .skip 20         // Buffer para lectura desde teclado
buffer: .skip 20         // Buffer para impresión del resultado

.section .text
_start:
    // --- Leer número como texto desde teclado ---
    mov x0, #0           // STDIN
    ldr x1, =input       // Dirección de buffer
    mov x2, #20          // Tamaño máximo
    mov x8, #63          // syscall read
    svc 0

    // --- Contar cuántos caracteres numéricos hay ---
    ldr x1, =input       // x1 = puntero al buffer
    mov x2, #0           // x2 = índice
    mov x3, #0           // x3 = contador de dígitos

count_loop:
    ldrb w4, [x1, x2]    // Cargar byte input[x2]
    cmp w4, #10          // ¿Es '\n'?
    beq done_count
    cmp w4, #'0'
    blt skip             // si menor que '0', saltar
    cmp w4, #'9'
    bgt skip             // si mayor que '9', saltar

    add x3, x3, #1       // contador++
skip:
    add x2, x2, #1
    b count_loop

done_count:
    // x3 contiene el número de dígitos
    mov x7, x3           // pasamos valor a x7 para convertir

    // --- Convertir x7 a texto decimal ---
    ldr x5, =buffer
    add x5, x5, #19      // apuntar al final del buffer
    mov x2, #0           // longitud de impresión
    mov x9, #10          // constante 10
    mov x10, x7

convert_loop:
    udiv x6, x10, x9
    mul x8, x6, x9
    sub x4, x10, x8
    add x4, x4, #'0'
    strb w4, [x5]
    sub x5, x5, #1
    add x2, x2, #1
    mov x10, x6
    cmp x10, #0
    bne convert_loop

    add x5, x5, #1
    mov w3, #'\n'
    strb w3, [x5, x2]
    add x2, x2, #1

    // --- syscall write(STDOUT, buffer, len) ---
    mov x0, #1
    mov x1, x5
    mov x8, #64
    svc 0

    // --- syscall exit(0) ---
    mov x0, #0
    mov x8, #93
    svc 0