GNU/Linux xterm bash 93 views

📌 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