// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que hace la suma de 3 numeros
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-08]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración: [https://asciinema.org/a/ngLIAAO512MdORPS6u4VXizog]
// ****************************************************************************
// ****************************************************************************
// * Codigo equivalente en Java
// *import java.util.Scanner;
// *
// *public class SumaTresNumerosSeguro {
// * public static void main(String[] args) {
// * Scanner scanner = new Scanner(System.in);
// * int suma = 0;
// *
// * String[] mensajes = {
// * "Ingresa el primer número: ",
// * "Ingresa el segundo número: ",
// * "Ingresa el tercer número: "
// * };
// *
// * for (String mensaje : mensajes) {
// * System.out.print(mensaje);
// * while (!scanner.hasNextInt()) {
// * System.out.println("Entrada inválida. Intente nuevamente.");
// * System.out.print(mensaje);
// * scanner.next(); // descartar entrada incorrecta
// * }
// * suma += scanner.nextInt();
// * }
// *
// * System.out.println("La suma es: " + suma);
// * scanner.close();
// * }
// *}
// ****************************************************************************
.section .data
msg1: .ascii "Ingresa el primer número: "
len1 = . - msg1
msg2: .ascii "Ingresa el segundo número: "
len2 = . - msg2
msg3: .ascii "Ingresa el tercer número: "
len3 = . - msg3
msg_result: .ascii "La suma es: "
len_result = . - msg_result
newline: .ascii "\n"
.section .bss
buffer: .skip 64
num_buffer: .skip 16
.section .text
.global _start
_start:
// ---------- Primer número ----------
ldr x0, =msg1
mov x1, #len1
bl print_msg
bl leer_numero
mov x3, x0 // x3 = primer número
// ---------- Segundo número ----------
ldr x0, =msg2
mov x1, #len2
bl print_msg
bl leer_numero
mov x4, x0 // x4 = segundo número
// ---------- Tercer número ----------
ldr x0, =msg3
mov x1, #len3
bl print_msg
bl leer_numero
mov x5, x0 // x5 = tercer número
// ---------- Suma ----------
add x6, x3, x4
add x6, x6, x5
// ---------- Mostrar resultado ----------
ldr x0, =msg_result
mov x1, #len_result
bl print_msg
mov x0, x6
bl print_int
// ---------- Salir ----------
mov x8, #93
mov x0, #0
svc #0
// ---------------- FUNCIONES ---------------------
leer_numero:
mov x0, #0 // STDIN
ldr x1, =buffer
mov x2, #64
mov x8, #63 // syscall read
svc #0
// Convertir string a entero
ldr x1, =buffer
mov x0, #0 // resultado
next_digit:
ldrb w2, [x1], #1
cmp w2, #10 // salto de línea = fin
beq done_input
sub w2, w2, #'0' // convierte ASCII a dígito
mul x0, x0, x7 // ✅ corregido
add x0, x0, x2
b next_digit
done_input:
ret
print_msg:
mov x2, x1
mov x1, x0
mov x0, #1
mov x8, #64
svc #0
ret
print_int:
ldr x1, =num_buffer
add x1, x1, #15
mov x2, #10
mov x3, x0
mov x4, x1
convert:
udiv x5, x3, x2
msub x6, x5, x2, x3
add x6, x6, #'0'
sub x1, x1, #1
strb w6, [x1]
mov x3, x5
cbz x3, mostrar
b convert
mostrar:
sub x2, x4, x1
mov x0, #1
mov x8, #64
mov x1, x1
svc #0
// Salto de línea
ldr x1, =newline
mov x2, #1
mov x8, #64
svc #0
ret