GNU/Linux xterm-256color bash 148 views

.section .data
buffer:     .skip 20
msg_par:    .asciz "PAR\n"
msg_impar:  .asciz "IMPAR\n"

.section .text
.global _start

_start:
    // Leer número desde stdin
    mov x0, #0              // STDIN
    ldr x1, =buffer         // buffer destino
    mov x2, #20             // máximo a leer
    mov x8, #63             // syscall read
    svc 0

    // Convertir string a entero (atoi)
    ldr x0, =buffer         // pasar puntero a string
    bl atoi                // devuelve el número en x0

    // Verificar si es par o impar
    and x1, x0, #1          // x1 = x0 & 1
    cmp x1, #0
    b.eq es_par

es_impar:
    ldr x1, =msg_impar
    b imprimir

es_par:
    ldr x1, =msg_par

imprimir:
    mov x0, #1              // STDOUT
    bl strlen               // calcular longitud en x0
    mov x2, x0              // x2 = longitud
    mov x0, #1              // STDOUT
    mov x8, #64             // syscall write
    svc 0

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

// ------------------ atoi: string -> entero ------------------
atoi:
    // Entrada: x0 = ptr al string
    // Salida: x0 = número convertido
    mov x1, #0              // acumulador
.next_digit:
    ldrb w2, [x0], #1
    cmp w2, #'0'
    blt .done
    cmp w2, #'9'
    bgt .done
    sub w2, w2, #'0'        // de ASCII a decimal
    mov x4, #10
    mul x1, x1, x4          // x1 *= 10
    add x1, x1, x2          // x1 += dígito
    b .next_digit
.done:
    mov x0, x1
    ret

// ------------------ strlen: longitud de string ------------------
strlen:
    // Entrada: x1 = puntero a string
    // Salida: x0 = longitud
    mov x2, x1
.loop:
    ldrb w3, [x2], #1
    cmp w3, #0
    b.ne .loop
    sub x0, x2, x1
    ret