GNU/Linux xterm-256color bash 115 views

// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Determina si un numero es par o impar
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 07-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/nvW0bOOHjk6vno0ql7Vq1Skzy
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en Swift
// * import Foundation
// * func main() {
// * guard let input = readLine() else {
// *        print("Error al leer entrada")
// *        return
// *    }
// *  guard let numero = Int(input) else {
// *        print("Entrada no válida")
// *        return
// *   }
// *  if numero % 2 == 0 {
// *        print("Es par")
// *    } else {
// *        print("Es impar")
// *    }
// * }
// * main()
// ****************************************************************************

.section .bss
input_buffer: .skip 16      // Espacio para el número ingresado

.section .data
msg_par:   .ascii "Es par\n"
len_par = . - msg_par

msg_impar: .ascii "Es impar\n"
len_impar = . - msg_impar

.section .text
.global _start

_start:
    // Leer entrada desde stdin
    mov x0, #0              // stdin
    ldr x1, =input_buffer   // buffer destino
    mov x2, #16             // cantidad máxima de bytes a leer
    mov x8, #63             // syscall read
    svc #0

    // Convertir ASCII a entero
    ldr x1, =input_buffer   // x1 apunta al buffer
    mov x2, #0              // x2 = resultado (acumulador)

convert_loop:
    ldrb w3, [x1], #1       // cargar siguiente byte y avanzar puntero
    cmp w3, #'0'
    blt check_end
    cmp w3, #'9'
 bgt check_end
    sub w3, w3, #'0'        // convertir ASCII a dígito
    mov x4, x2
    lsl x2, x2, #3          // x2 *= 10
    add x2, x2, x4, lsl #1
    add x2, x2, x3          // x2 = x2 * 10 + dígito
    b convert_loop

check_end:
    // x2 contiene el número entero
    and x3, x2, #1          // x3 = x2 & 1 → 0 si par, 1 si impar

    cmp x3, #0
    beq es_par

es_impar:
    ldr x0, =msg_impar
    mov x1, #len_impar
    b imprimir

es_par:
    ldr x0, =msg_par
    mov x1, #len_par

imprimir:
    mov x2, x1              // longitud
    mov x1, x0              // puntero al mensaje
    mov x0, #1              // stdout
    mov x8, #64             // syscall write
    svc #0

    // Salir del programa
    mov x8, #93             // syscall exit
    mov x0, #0
    svc #0