//==================================================
// 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