GNU/Linux xterm-256color zsh 95 views

.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