// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Programa que suma dos numeros
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 02-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// *Asciinema: https://asciinema.org/a/QwHkIlivZEFm3ZiLPwkyMoinM
// ****************************************************************************
// ****************************************************************************
// Codigo en C#
//
// #include <stdio.h>
//
// int main() {
// int num1, num2, suma;
//
// Pedir al usuario los números
// printf("Ingresa el primer número: ");
// scanf("%d", &num1);
//
// printf("Ingresa el segundo número: ");
// scanf("%d", &num2);
//
// Sumar los números
// suma = num1 + num2;
//
// Mostrar el resultado
// printf("La suma es: %d\n", suma);
//
// return 0;
// }
//
// ****************************************************************************
.section .data
mensaje1: .asciz "Ingresa el primer número: "
mensaje2: .asciz "Ingresa el segundo número: "
resultado: .asciz "La suma es: "
buffer: .skip 20 // 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
// Limpiar buffer antes de convertir número a string
ldr x1, =buffer
mov x2, #10 // Tamaño del buffer
mov w3, #0
clear_buffer_loop:
strb w3, [x1], #1 // Escribir 0 en cada byte
subs x2, x2, #1
bne clear_buffer_loop
// 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