// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que aproxima el calculo del area de un circulo
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-07]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración: [https://asciinema.org/a/rh0tSHpFDB9TAqFS8lsFXA8VT]
// ****************************************************************************
// ****************************************************************************
// * Codigo equivalente en python
// * import math
// * def main():
// * print("Ingrese el radio: ", end='')
// * try:
// * radio = int(input())
// * except ValueError:
// * print("Error: Debe ingresar un número entero válido")
// * return
// * area = (314 * radio * radio) // 100
// * print(f"Area del circulo: {area}")
// * if __name__ == "__main__":
// * main()
// ****************************************************************************
.section .bss
input_buffer: .skip 16
.section .data
msg_ingreso: .ascii "Ingrese el radio: "
len_ingreso = . - msg_ingreso
msg_resultado: .ascii "Area del circulo: "
len_resultado = . - msg_resultado
newline: .ascii "\n"
len_nl = . - newline
.section .text
.global _start
_start:
// Mostrar mensaje: "Ingrese el radio: "
ldr x0, =msg_ingreso
mov x1, #len_ingreso
bl print_msg
// Leer entrada del usuario
mov x0, #0 // stdin
ldr x1, =input_buffer
mov x2, #16
mov x8, #63 // syscall read
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 *= 10
add x2, x2, x4, lsl #1 // x2 = x2*10
add x2, x2, x3
b read_loop
done_read:
// Guardar radio en x5
mov x5, x2
// Calcular área: A = (314 * r * r) / 100
mul x6, x5, x5 // x6 = r^2
mov x7, #314
mul x6, x6, x7 // x6 = r^2 * 314
mov x7, #100
udiv x6, x6, x7 // x6 = area
// Mostrar mensaje: "Area del circulo: "
ldr x0, =msg_resultado
mov x1, #len_resultado
bl print_msg
// Mostrar área (x6)
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 // length
mov x1, x0 // pointer
mov x0, #1 // stdout
mov x8, #64 // syscall write
svc #0
ret
// Imprime número entero en x0
print_number:
// Convierte número en x0 a ASCII (almacena en buffer)
mov x1, x0
ldr x2, =input_buffer
add x2, x2, #15 // posiciona 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 (resto)
add x6, x6, #'0' // convierte a ASCII
strb w6, [x2], #-1 // almacena byte y retrocede
mov x1, x5
add w3, w3, #1
cbnz x1, convert_loop_num
// imprimir desde x2+1, w3 bytes
add x2, x2, #1
mov x1, x2
mov w2, w3 // <-- CORREGIDO
mov x0, #1
mov x8, #64
svc #0
ret