**
Nombre: circulo.s
Autor: Karla Itzel Vázquez Cruz
Fecha: 08-04-2025
Descripción: Calcula el área de un círculo con radio fijo.
Plataforma: Raspberry Pi OS 64-bit
Asciinema: circulo.s
**
Versión en ARM64 RaspbianOS Linux:
.global _start
.section .rodata
msg: .asciz "Área del círculo: "
nl: .asciz "\n"
pi: .float 3.14159265
radio: .float 9.0
.section .bss
.lcomm buffer, 32 // Buffer para el número convertido a string
.section .text
_start:
// Cargar radio
ldr x0, =radio
ldr s0, [x0]
// Calcular radio * radio → s1
fmul s1, s0, s0
// Cargar pi → s2
ldr x1, =pi
ldr s2, [x1]
// Calcular área = pi * r² → s3
fmul s3, s1, s2
// Convertir float a entero (ej: 254.469620 → 254)
fcvtzs w4, s3 // s3 → entero en w4
// Convertir entero a string
ldr x5, =buffer // Puntero al buffer
mov x6, x5 // Puntero en movimiento
mov w7, w4 // Copia del número
// Convertir w7 a caracteres (mínimo una vez)
conv_loop:
mov w9, #10
udiv w8, w7, w9 // w8 = w7 / 10
msub w10, w8, w9, w7 // w10 = w7 - (w8 * 10) → residuo
add w10, w10, #'0' // convertir a ASCII
strb w10, [x6], #1 // guardar y avanzar buffer
mov w7, w8 // preparar siguiente dígito
cbnz w7, conv_loop
// Ahora invertir el string (está al revés)
sub x6, x6, #1 // x6 apunta al último char válido
ldr x5, =buffer
rev_loop:
cmp x5, x6
bge print_msg
ldrb w7, [x5]
ldrb w8, [x6]
strb w8, [x5]
strb w7, [x6]
add x5, x5, #1
sub x6, x6, #1
b rev_loop
// --------------------
// Imprimir mensaje
print_msg:
ldr x0, =1 // stdout
ldr x1, =msg
mov x2, #18 // longitud del mensaje
mov x8, #64 // syscall write
svc #0
// Imprimir número
ldr x1, =buffer
bl strlen
mov x2, x0 // longitud
mov x0, #1
mov x8, #64
svc #0
// Imprimir salto de línea
ldr x1, =nl
mov x2, #1
mov x0, #1
mov x8, #64
svc #0
// Salir
mov x8, #93
mov x0, #0
svc #0
// --------------------
// strlen: calcula longitud de string null-terminated
// Entrada: x1 = dirección del string
// Salida: x0 = longitud
strlen:
mov x0, #0
.strlen_loop:
ldrb w2, [x1, x0]
cbz w2, .done
add x0, x0, #1
b .strlen_loop
.done:
ret