📌 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