GNU/Linux xterm-256color bash 173 views

// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Programa que calcula el area de un rectangulo
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 10-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/oGTwHs0lOeH1auUTHttK6ryNL
// ****************************************************************************

// ****************************************************************************
// Version en C#
//
//using System;
//
//class Program
//{
//    static void Main()
//    {
//        // Solicitar la base del rectángulo
//        Console.Write("Ingrese la base del rectángulo: ");
//        double baseRectangulo = Convert.ToDouble(Console.ReadLine());
//
//        // Solicitar la altura del rectángulo
//        Console.Write("Ingrese la altura del rectángulo: ");
//        double alturaRectangulo = Convert.ToDouble(Console.ReadLine());
//
//        // Calcular el área
//        double area = baseRectangulo * alturaRectangulo;
//
//        // Mostrar el resultado
//        Console.WriteLine($"El área del rectángulo es: {area}");
//    }
//}
// ****************************************************************************
.section .bss
input_buffer: .skip 32      // Reservamos 32 bytes para leer ambos lados del rectángulo

.section .data
msg_ingreso: .ascii "Ingrese el lado largo del rectángulo: "  // Mensaje para ingresar el lado largo
len_ingreso = . - msg_ingreso  // Longitud del mensaje de ingreso

msg_resultado: .ascii "Area del rectángulo: "  // Mensaje de resultado
len_resultado = . - msg_resultado  // Longitud del mensaje de resultado

newline: .ascii "\n"  // Nueva línea
len_nl = . - newline  // Longitud de la nueva línea

.section .text
.global _start

_start:
    // Mostrar mensaje para el lado largo
    ldr x0, =msg_ingreso
    mov x1, #len_ingreso
    bl print_msg

    // Leer entrada para el lado largo
    mov x0, #0
    ldr x1, =input_buffer
    mov x2, #16
    mov x8, #63
    svc #0

    // Convertir ASCII a entero para el lado largo
    ldr x1, =input_buffer
    mov x2, #0

read_loop_largo:
    ldrb w3, [x1], #1
    cmp w3, #'0'
    blt done_read_largo
    cmp w3, #'9'
    bgt done_read_largo
    sub w3, w3, #'0'
    mov x4, x2
    lsl x2, x2, #3          // x2 *= 8
    add x2, x2, x4, lsl #1  // x2 = x2 * 10
    add x2, x2, x3
    b read_loop_largo

done_read_largo:
    // Guardar lado largo en x5
    mov x5, x2

    // Mostrar mensaje para el lado corto
    ldr x0, =msg_ingreso
    mov x1, #len_ingreso
    bl print_msg

    // Leer entrada para el lado corto
    mov x0, #0
    ldr x1, =input_buffer
    mov x2, #16
    mov x8, #63
    svc #0

    // Convertir ASCII a entero para el lado corto
    ldr x1, =input_buffer
    mov x2, #0

read_loop_corto:
    ldrb w3, [x1], #1
    cmp w3, #'0'
    blt done_read_corto
    cmp w3, #'9'
    bgt done_read_corto
    sub w3, w3, #'0'
    mov x4, x2
    lsl x2, x2, #3          // x2 *= 8
    add x2, x2, x4, lsl #1  // x2 = x2 * 10
    add x2, x2, x3
    b read_loop_corto

done_read_corto:
    // Guardar lado corto en x6
    mov x6, x2

    // Calcular área: A = lado_largo * lado_corto
    mul x7, x5, x6  // x7 = x5 * x6

    // Mostrar mensaje de resultado
    ldr x0, =msg_resultado
    mov x1, #len_resultado
    bl print_msg

    // Mostrar área
    mov x0, x7
    bl print_number

    // Salto de línea
    ldr x0, =newline
    mov x1, #len_nl
    bl print_msg

    // Salir
    mov x8, #93
    mov x0, #0
    svc #0

// ---------- FUNCIONES ----------

// Imprime mensaje en x0 (puntero) con longitud x1
print_msg:
    mov x2, x1
    mov x1, x0
    mov x0, #1
    mov x8, #64
    svc #0
    ret

// Imprime número entero en x0
print_number:
    mov x1, x0
    ldr x2, =input_buffer
    add x2, x2, #31   // Apuntamos al final del buffer
    mov w3, #0

convert_loop_num:
    mov x4, #10
    udiv x5, x1, x4   // x5 = x1 / 10
    msub x6, x5, x4, x1  // x6 = x1 - (x5 * 10)
    add x6, x6, #'0'  // Convertimos el valor a ASCII
    strb w6, [x2], #-1  // Guardamos el carácter
    mov x1, x5
    add w3, w3, #1
    cbnz x1, convert_loop_num

    add x2, x2, #1
    mov x1, x2
    mov w2, w3
    mov x0, #1
    mov x8, #64
    svc #0
    ret