**
Nombre: sum.s
Autor: Karla Itzel Vazquez Cruz
Descripción: Solicita dos números enteros al usuario, los suma e imprime el resultado correctamente formateado en ARM64 Assembly.
Asciinema: https://asciinema.org/a/712750
Equivalente en C:
#include <stdio.h>
int main() {
int a, b;
printf("introduce numero 1: "); scanf("%d", &a);
printf("introduce numero 2: "); scanf("%d", &b);
int suma = a + b;
printf("resultado: %d\n", suma);
return 0;
}
Versión en ARM64 RaspbianOS Linux:
.section .data
mensaje1: .asciz "Ingresa el primer número: "
mensaje2: .asciz "Ingresa el segundo número: "
resultado: .asciz "La suma es: "
buffer: .skip 10 // Buffer para entrada de números
.section .text
.global _start
_start:
// Mostrar mensaje para el primer número
mov x0, 1 // STDOUT (1)
ldr x1, =mensaje1 // Dirección del mensaje
mov x2, 25 // Tamaño del mensaje
mov x8, 64 // syscall: write
svc 0
// Leer primer número
mov x0, 0 // STDIN (0)
ldr x1, =buffer // Dirección del buffer
mov x2, 10 // Tamaño máximo de entrada
mov x8, 63 // syscall: read
svc 0
// Convertir primer número de ASCII a entero
ldr x0, =buffer // Dirección del buffer
bl str_to_int // Llama a la conversión
mov x9, x0 // Guarda el primer número en x9
// Mostrar mensaje para el segundo número
mov x0, 1
ldr x1, =mensaje2
mov x2, 26
mov x8, 64
svc 0
// Leer segundo número
mov x0, 0
ldr x1, =buffer
mov x2, 10
mov x8, 63
svc 0
// Convertir segundo número de ASCII a entero
ldr x0, =buffer
bl str_to_int
mov x10, x0 // Guarda el segundo número en x10
// Sumar los números
add x0, x9, x10 // x0 = x9 + x10
// Convertir entero a ASCII para imprimir
bl int_to_str
ldr x1, =buffer // Dirección del buffer con el resultado
// Mostrar el resultado
mov x0, 1
ldr x1, =resultado
mov x2, 11
mov x8, 64
svc 0
// Imprimir el número convertido
mov x0, 1
ldr x1, =buffer
mov x2, 10
mov x8, 64
svc 0
// Salir del programa
mov x8, 93
mov x0, 0
svc 0
// ----------------------
// Convertir ASCII a entero
// ----------------------
str_to_int:
mov x1, #0 // Inicializar resultado en 0
mov x2, #10 // Factor de base 10
str_to_int_loop:
ldrb w3, [x0], #1 // Cargar byte y avanzar puntero
cmp w3, #10 // Comprobar si es salto de línea
beq str_to_int_end
sub w3, w3, #48 // Convertir ASCII a número
mul x1, x1, x2 // Multiplicar por 10
add x1, x1, x3 // Sumar nuevo dígito
b str_to_int_loop
str_to_int_end:
mov x0, x1 // Retornar resultado
ret
// ----------------------
// Convertir entero a ASCII
// ----------------------
int_to_str:
mov x2, #10 // Base 10
ldr x1, =buffer // Dirección del buffer
add x1, x1, #9 // Apuntar al final
mov w3, #0xA // Caracter de nueva línea
strb w3, [x1], #-1 // Agregar salto de línea
int_to_str_loop:
udiv x3, x0, x2 // Dividir x0 entre 10
msub x4, x3, x2, x0 // Obtener el residuo
add x4, x4, #48 // Convertir a ASCII
strb w4, [x1], #-1 // Almacenar caracter
mov x0, x3 // Actualizar número
cmp x0, #0
bne int_to_str_loop
ret