GNU/Linux xterm-256color zsh 159 views

.global _start

.section .bss
input:  .skip 20         // Buffer para leer el número
rev:    .skip 20         // Buffer para el número invertido

.section .text
_start:
    // --- Leer número desde teclado ---
    mov x0, #0           // STDIN
    ldr x1, =input       // Buffer de entrada
    mov x2, #20          // Longitud máxima
    mov x8, #63          // syscall read
    svc 0                // Ejecutar syscall

    // x0 contiene longitud real (incluyendo '\n')
    mov x3, x0           // Guardar longitud en x3
    ldr x1, =input       // Puntero a input
    ldr x2, =rev         // Puntero a buffer invertido

    // --- Quitar '\n' si existe ---
    sub x3, x3, #1       // x3 = longitud - 1
    ldrb w4, [x1, x3]    // w4 = último byte
    cmp w4, #10
    bne set_len
    sub x3, x3, #1       // Si es '\n', restar 1 más
set_len:
    mov x5, x3           // x5 = última posición válida (índice fin)
    mov x4, #0           // x4 = índice destino en rev (comienza en 0)

reverse_loop:
    cmp x5, #-1
    blt done_reverse

    ldrb w6, [x1, x5]    // Leer carácter desde el final
    strb w6, [x2, x4]    // Guardar en buffer de salida
    add x4, x4, #1       // avanzar posición de escritura
    sub x5, x5, #1       // retroceder origen
    b reverse_loop

done_reverse:
    // Agregar '\n'
    mov w7, #'\n'
    strb w7, [x2, x4]
    add x4, x4, #1       // x4 = longitud final

    // Imprimir número invertido
    mov x0, #1           // STDOUT
    ldr x1, =rev         // buffer a imprimir
    mov x2, x4           // longitud
    mov x8, #64          // syscall write
    svc 0

    // Salida limpia
    mov x0, #0
    mov x8, #93
    svc 0