📌 Demostración: Comparación de dos números en memoria y mostrar el mayor en ARM64 Assembly
💻 Lenguajes de Interfaz en TECNM Campus ITT
👨💻 Autor: Alejandro Suarez Sandoval
📅 Fecha: 2025/04/07
🎯 Descripción
Este programa hace una comparación de dos números y muestra el mayor en la terminal.
La implementación se realiza en:
✅ Assembly ARM64 para RaspbianOS en Raspberry Pi
🔧 Compilación en Raspberry Pi (ARM64)
as compara_num.s -o compara_num.o
ld compara_num.o -o compara_num
▶️ Ejecución
./compara_num
👀 Código fuente
🔗 Código fuente en Gist: Programa 6 Compara dos números y muestra el mayor Código Assembly ARM64 para RaspbianOS
/*
______ ____ ____ __ __
/\ _ \/\ _`\ /'\_/`\ /'___\/\ \\ \
\ \ \L\ \ \ \L\ \/\ \/\ \__/\ \ \\ \
\ \ __ \ \ , /\ \ \__\ \ \ _``\ \ \\ \_
\ \ \/\ \ \ \\ \\ \ \_/\ \ \ \L\ \ \__ ,__\
\ \_\ \_\ \_\ \_\ \_\\ \_\ \____/\/_/\_\_/
\/_/\/_/\/_/\/ /\/_/ \/_/\/___/ \/_/
♡ ∩_∩
(„• ֊ •„)♡
| ̄U U ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
| • Lenguajes de Interfaz en TECNM Campus ITT |
| • Autor: Alejandro Suarez Sandoval |
| • Fecha: 2025/04/07 |
| • Descripción: Programa que compara dos numeros y muestra |
| el mayor, en lenguaje C y Assembly ARM64 para RaspbianOS. |
| • Demostración: |
| https://asciinema.org/a/712739 |
| • Compilación (Raspberry Pi ARM64): |
| as compara_num.s -o compara_num.o |
| ld compara_num.o -o compara_num |
| • Ejecución: ./compara_num |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════•°• Demostración Código en lenguaje C •°•═══════
#include <stdio.h>
int main() {
// Declaración de variables
int num1 = 42; // Primer número (puedes cambiar este valor)
int num2 = 75; // Segundo número (puedes cambiar este valor)
int mayor;
// Comparación para determinar el número mayor
if (num1 >= num2) {
mayor = num1;
} else {
mayor = num2;
}
// Mostrar el resultado
printf("El número mayor es: %d\n", mayor);
return 0;
}
════════════════════•°• ☆ •°•══════════════════════════════
/*
/* ⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════════•°• Código en ARM64 Assembly •°•═════════════ */
.global _start
.section .data
num1: .quad 42 // Primer número
num2: .quad 75 // Segundo número
msg1: .ascii "El número mayor es: "
msg1_len = . - msg1
buffer: .space 20 // Buffer para convertir número a string
newline: .ascii "\n"
.section .text
_start:
// Cargar los dos números
ldr x0, =num1
ldr x0, [x0]
ldr x1, =num2
ldr x1, [x1]
// Comparar x0 y x1
cmp x0, x1
b.ge x0_is_greater // Salta si x0 >= x1
// Si llegamos aquí, x1 es mayor
mov x0, x1 // Poner el mayor en x0
x0_is_greater:
// x0 ahora contiene el número mayor
// Guardarlo para usarlo más tarde
mov x19, x0
// Imprimir mensaje inicial
mov x0, 1 // fd = 1 (stdout)
ldr x1, =msg1 // buffer
ldr x2, =msg1_len // longitud
mov x8, 64 // syscall número 64 (write)
svc 0 // llamada al sistema
// Convertir el número a string
ldr x1, =buffer
add x1, x1, 19 // Comenzar desde el final del buffer
mov x2, #0
strb w2, [x1] // Terminar con null byte
sub x1, x1, #1
mov x2, #10 // Base 10
convert_loop:
udiv x3, x19, x2 // x3 = x19 / 10
msub x4, x3, x2, x19 // x4 = x19 - (x3 * 10) = x19 % 10
add x4, x4, #48 // Convertir a ASCII
strb w4, [x1] // Almacenar byte
sub x1, x1, #1 // Mover el puntero
mov x19, x3 // Actualizar x19 con el resultado de la división
cbnz x19, convert_loop // Continuar si x19 != 0
add x1, x1, #1 // Ajustar puntero al primer dígito
// Imprimir el número
mov x0, 1 // fd = 1 (stdout)
// x1 ya contiene el puntero al string
ldr x3, =buffer
add x3, x3, #19
sub x2, x3, x1 // Calcular longitud
mov x8, 64 // syscall número 64 (write)
svc 0 // llamada al sistema
// Imprimir nueva línea
mov x0, 1 // fd = 1 (stdout)
ldr x1, =newline // buffer
mov x2, #1 // longitud
mov x8, 64 // syscall número 64 (write)
svc 0 // llamada al sistema
// Salir del programa
mov x0, 0 // código de salida 0
mov x8, 93 // syscall número 93 (exit)
svc 0 // llamada al sistema