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