// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que calcula el area de un cuadrado
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-10]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración: [https://asciinema.org/a/GkRjk6B3XL8yd08r7Zhp4TIwK]
// ****************************************************************************
// ****************************************************************************
// * Codigo equivalente en Python
// *def calcular_area_cuadrado():
// * try:
// * print("// *Calculadora de Área de Cuadrado")
// * lado = float(input("// *Ingrese la longitud del lado: "))
// *
// * if lado <= 0:
// * print("// *Error: El lado debe ser positivo")
// * else:
// * area = lado ** 2
// * print(f"// *El área del cuadrado es: {area:.2f}")
// *
// * except ValueError:
// * print("// *Error: Ingrese un valor numérico válido")
// *
// *if __name__ == "__main__":
// * calcular_area_cuadrado()
// ****************************************************************************
.section .bss
input_buffer: .skip 16
.section .data
msg_ingreso: .ascii "Ingrese el lado del cuadrado: "
len_ingreso = . - msg_ingreso
msg_resultado: .ascii "Area del cuadrado: "
len_resultado = . - msg_resultado
newline: .ascii "\n"
len_nl = . - newline
.section .text
.global _start
_start:
// Mostrar mensaje
ldr x0, =msg_ingreso
mov x1, #len_ingreso
bl print_msg
// Leer entrada
mov x0, #0
ldr x1, =input_buffer
mov x2, #16
mov x8, #63
svc #0
// Convertir ASCII a entero (resultado en x2)
ldr x1, =input_buffer
mov x2, #0
read_loop:
ldrb w3, [x1], #1
cmp w3, #'0'
blt done_read
cmp w3, #'9'
bgt done_read
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
done_read:
// Guardar lado en x5
mov x5, x2
// Calcular área: A = lado * lado
mul x6, x5, x5
// Mostrar mensaje
ldr x0, =msg_resultado
mov x1, #len_resultado
bl print_msg
// Mostrar área
mov x0, x6
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, #15
mov w3, #0
convert_loop_num:
mov x4, #10
udiv x5, x1, x4
msub x6, x5, x4, x1
add x6, x6, #'0'
strb w6, [x2], #-1
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