GNU/Linux xterm-256color bash 146 views

// ****************************************************************************
// * 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