GNU/Linux xterm-256color bash 129 views

//==================================================
// Autor: Victor Manuel Madrid Lugo
// Fecha: 07/04/2025
// Descripción: Comparación de dos números enteros 
//              y muestra cuál es mayor en consola.
// SO: Raspberry Pi OS 64-bit
// Demostración: [https://asciinema.org/a/vqg0JPpJAHuGin8ilrSXWei68]
//==================================================
// Equivalente en Java:
// int num1 = 42;
// int num2 = 107;
// if (num1 == num2)
//     System.out.println("Los números son iguales");
// else if (num1 > num2)
//     System.out.println("El primer número es mayor");
// else
//     System.out.println("El segundo número es mayor");
//
//==================================================

.section .data
msg_prompt1: .asciz "Ingrese el primer número: "
msg_prompt2: .asciz "Ingrese el segundo número: "
msg_iguales: .asciz "Los números son iguales\n"
msg_mayor1:  .asciz "El primer número es mayor\n"
msg_mayor2:  .asciz "El segundo número es mayor\n"
newline:     .asciz "\n"
buffer:      .skip 21  // Buffer para entrada (suficiente para 64 bits)

.section .text
.global _start

_start:
    // Solicitar primer número
    mov x0, #1             // stdout
    ldr x1, =msg_prompt1
    mov x2, #26            // longitud de msg_prompt1
    mov x8, #64            // syscall write
    svc #0

    // Leer primer número
    mov x0, #0             // stdin
    ldr x1, =buffer
    mov x2, #21            // tamaño del buffer
    mov x8, #63            // syscall read
    svc #0
    
    // Convertir a entero (primer número)
    ldr x0, =buffer
    bl atoi
    mov x19, x0            // Guardar primer número en x19

    // Solicitar segundo número
    mov x0, #1
    ldr x1, =msg_prompt2
    mov x2, #27            // longitud de msg_prompt2
    mov x8, #64
    svc #0

    // Leer segundo número
    mov x0, #0
    ldr x1, =buffer
    mov x2, #21
    mov x8, #63
    svc #0
    
    // Convertir a entero (segundo número)
    ldr x0, =buffer
    bl atoi
    mov x20, x0            // Guardar segundo número en x20

    // Comparar los números
    cmp x19, x20
    b.gt primer_mayor      // Si x19 > x20
    b.lt segundo_mayor     // Si x19 < x20
    
    // Son iguales
    mov x0, #1
    ldr x1, =msg_iguales
    mov x2, #26            // longitud de msg_iguales
    mov x8, #64
    svc #0
    b exit

primer_mayor:
    mov x0, #1
    ldr x1, =msg_mayor1
    mov x2, #26            // longitud de msg_mayor1
    mov x8, #64
    svc #0
    b exit

segundo_mayor:
    mov x0, #1
    ldr x1, =msg_mayor2
    mov x2, #27            // longitud de msg_mayor2
    mov x8, #64
    svc #0

exit:
    // Salir del programa
    mov x0, #0             // código de retorno
    mov x8, #93            // syscall exit
    svc #0

// Función atoi: Convierte string a entero
atoi:
    mov x1, #0             // Inicializar resultado en 0
    mov x3, #10            // Base 10
    mov x4, #0             // Indicador de negativo

    // Verificar signo negativo
    ldrb w2, [x0], #1
    cmp w2, #'-'
    b.ne atoi_loop
    mov x4, #1             // Marcar como negativo
    ldrb w2, [x0], #1      // Leer siguiente carácter

atoi_loop:
    // Verificar fin de string (newline o null)
    cmp w2, #10            // '\n'
    b.eq atoi_done
    cbz w2, atoi_done      // '\0'
    
    // Verificar que es dígito
    cmp w2, #'0'
    b.lt atoi_error
    cmp w2, #'9'
    b.gt atoi_error
    
    // Convertir a dígito y acumular
    sub w2, w2, #'0'       // ASCII a número
    mul x1, x1, x3         // resultado *= 10
    add x1, x1, x2         // resultado += dígito
    
    // Siguiente carácter
    ldrb w2, [x0], #1
    b atoi_loop

atoi_done:
    // Aplicar signo si es necesario
    cbz x4, atoi_positive
    neg x1, x1             // Negar el resultado

atoi_positive:
    mov x0, x1             // Devolver resultado en x0
    ret

atoi_error:
    // Manejar error (en este caso, devolver 0)
    mov x0, #0
    ret