GNU/Linux xterm bash 141 views

📌 Demostración: Suma de dos números en memoria en ARM64 Assembly

💻 Lenguajes de Interfaz en TECNM Campus ITT
👨‍💻 Autor: Alejandro Suarez Sandoval
📅 Fecha: 2025/04/02

🎯 Descripción

Este programa suma dos números guardados en memoria y lo muestra en la terminal.
La implementación se realiza en:

Assembly ARM64 para RaspbianOS en Raspberry Pi

🔧 Compilación en Raspberry Pi (ARM64)

as suma.s -o suma.o  
ld suma.o -o suma  

▶️ Ejecución

./suma

👀 Código fuente

🔗 Código fuente en Gist: [Programa 2 Suma de dos números cargados en memoria 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/02                                              | 
| • Descripción: Programa que suma dos números en                  | 
|   memoria en Python y Assembly ARM64 para RaspbianOS.            | 
| • Demostración:                                                  |
|   https://asciinema.org/a/zyYj2jvyxD6vyo07ElLE2cJuz              |
| • Compilación (Raspberry Pi ARM64):                              |  
|     as suma.s -o suma.o                                       |  
|     ld suma.o -o suma                                        |  
| • Ejecución: ./suma                                            |  
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄                                        

⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════•°• Demostración Código en lenguaje Python •°•═════════

a = 5
b = 7
suma = a + b
print("La suma es:", suma)
 
════════════════════•°• ☆ •°•══════════════════════════════
/*

/* ⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════════•°• Código en ARM64 Assembly •°•═════════════ */

.section .data
    mensaje: .asciz "La suma es: "
    salto_linea: .asciz "\n"

.section .bss
    .align 4
    resultado: .skip 10    // Espacio para almacenar el resultado como string

.section .text
    .global _start

_start:
    // Cargar los valores en registros
    mov x0, #5         // Primer número
    mov x1, #7         // Segundo número
    add x2, x0, x1     // Sumar x0 y x1, guardar en x2

    // Imprimir mensaje "La suma es: "
    mov x0, #1         // File descriptor: 1 (stdout)
    adrp x1, mensaje   // Cargar dirección base de mensaje
    add x1, x1, :lo12:mensaje
    mov x2, #12        // Longitud del mensaje
    mov x8, #64        // Syscall: write
    svc #0             // Llamar al sistema

    // Convertir número a string y mostrar
    mov x0, x2         // Pasar el número a imprimir
    adrp x1, resultado // Cargar dirección base de resultado
    add x1, x1, :lo12:resultado
    bl int_to_str      // Llamar a la función de conversión

    // Imprimir resultado convertido
    mov x0, #1         // File descriptor: 1 (stdout)
    adrp x1, resultado // Cargar dirección base de resultado
    add x1, x1, :lo12:resultado
    mov x2, #10        // Longitud máxima del número convertido
    mov x8, #64        // Syscall: write
    svc #0             // Llamar al sistema

    // Imprimir salto de línea
    mov x0, #1         // File descriptor: 1 (stdout)
    adrp x1, salto_linea // Cargar dirección base del salto de línea
    add x1, x1, :lo12:salto_linea
    mov x2, #1         // Longitud de "\n"
    mov x8, #64        // Syscall: write
    svc #0             // Llamar al sistema

    // Terminar el programa
    mov x8, #93        // Syscall: exit
    mov x0, #0         // Código de salida 0
    svc #0             // Llamar al sistema

// ------------------------------------------------------
// Función: int_to_str
// Convierte un entero en x0 a una cadena ASCII en x1
// ------------------------------------------------------
int_to_str:
    mov x2, x1         // Copiar la dirección base del buffer
    mov x3, #10        // Divisor (base 10)

1:  udiv x4, x0, x3    // x4 = x0 / 10 (cociente)
    msub x5, x4, x3, x0// x5 = x0 - (x4 * 10) (residuo)
    add x5, x5, #48    // Convertir número a ASCII
    strb w5, [x1], #1  // Almacenar y avanzar en el buffer
    mov x0, x4         // Actualizar x0 con el cociente
    cbnz x0, 1b        // Si x0 no es 0, repetir

    // Invertir la cadena
    sub x1, x1, #1     // Ajustar puntero final
    mov x4, x2         // Copiar la dirección inicial del buffer

2:  cmp x4, x1         // Comparar inicio con final
    bge 3f             // Si se cruzan, salir
    ldrb w5, [x4]      // Cargar inicio
    ldrb w6, [x1]      // Cargar final
    strb w6, [x4], #1  // Intercambiar
    strb w5, [x1], #-1 // Intercambiar
    b 2b               // Repetir
3:  ret