.global _start
.section .bss
input: .skip 128 // buffer para entrada en texto
nums: .skip 80 // máximo 10 números de 64 bits
buffer: .skip 32 // buffer para impresión del resultado
.section .text
_start:
// Leer entrada desde teclado
mov x0, #0
ldr x1, =input
mov x2, #128
mov x8, #63
svc 0
// --- Parsear y almacenar los números ---
ldr x1, =input
ldr x20, =nums
mov x2, #0 // índice en input
mov x3, #0 // número temporal
mov x4, #0 // contador de elementos
mov x9, #10 // base 10
parse_loop:
ldrb w5, [x1, x2]
cmp w5, #10
beq store_last
cmp w5, #' '
beq store_num
sub w5, w5, #'0'
uxtw x6, w5
mul x3, x3, x9
add x3, x3, x6
add x2, x2, #1
b parse_loop
store_num:
str x3, [x20, x4, lsl #3]
add x4, x4, #1
mov x3, #0
add x2, x2, #1
b parse_loop
store_last:
str x3, [x20, x4, lsl #3]
add x4, x4, #1 // x4 = cantidad de elementos
// ---------------------------------------------------
// Calcular media = suma / cantidad
// ---------------------------------------------------
mov x5, #0 // suma
mov x0, #0 // índice
sum_loop:
cmp x0, x4
bge media_listo
ldr x6, [x20, x0, lsl #3]
add x5, x5, x6
add x0, x0, #1
b sum_loop
media_listo:
udiv x7, x5, x4 // x7 = media entera
// ---------------------------------------------------
// Calcular varianza = sum((xi - media)^2) / n
// ---------------------------------------------------
mov x0, #0
mov x8, #0 // acumulador de cuadrados
var_loop:
cmp x0, x4
bge calc_raiz
ldr x6, [x20, x0, lsl #3]
cmp x6, x7
bge no_neg
sub x6, x7, x6
b abs_ok
no_neg:
sub x6, x6, x7
abs_ok:
mul x6, x6, x6
add x8, x8, x6
add x0, x0, #1
b var_loop
calc_raiz:
udiv x9, x8, x4 // x9 = varianza entera
// ---------------------------------------------------
// Calcular raíz cuadrada entera (x10 = desviación)
// ---------------------------------------------------
mov x10, #0
sqrt_loop:
mul x11, x10, x10
cmp x11, x9
bgt print_result
add x10, x10, #1
b sqrt_loop
print_result:
sub x10, x10, #1 // x10 = sqrt(varianza)
// Convertir x10 a decimal y mostrar
mov x7, x10
ldr x5, =buffer
add x5, x5, #31
mov x2, #0
mov x9, #10
conv_loop:
udiv x6, x7, x9
mul x8, x6, x9
sub x4, x7, x8
add x4, x4, #'0'
strb w4, [x5]
sub x5, x5, #1
add x2, x2, #1
mov x7, x6
cmp x7, #0
bne conv_loop
add x5, x5, #1
mov w3, #'\n'
strb w3, [x5, x2]
add x2, x2, #1
mov x0, #1
mov x1, x5
mov x8, #64
svc 0
// Salir
mov x0, #0
mov x8, #93
svc 0