GNU/Linux xterm-256color zsh 159 views

.global _start

.section .data
lista:      .quad 9, 2, 7, 1, 5, 3         // Lista de 6 números
longitud:   .quad 6

.section .bss
buffer:     .skip 32                      // Buffer para imprimir mediana

.section .text
_start:
    // --- Cargar longitud y dirección de la lista ---
    ldr x10, =longitud
    ldr x11, [x10]            // x11 = n
    ldr x12, =lista           // x12 = dirección de la lista

    // --- Ordenamiento burbuja (in-place) ---
    mov x0, #0                // i

outer_loop:
    cmp x0, x11
    bge done_sort
    mov x1, #0                // j

inner_loop:
    sub x2, x11, #1
    cmp x1, x2
    bge end_inner

    ldr x3, [x12, x1, lsl #3]       // x3 = lista[j]
    add x4, x1, #1
    ldr x5, [x12, x4, lsl #3]       // x5 = lista[j+1]
    cmp x3, x5
    ble skip_swap

    // swap
    str x5, [x12, x1, lsl #3]
    str x3, [x12, x4, lsl #3]

skip_swap:
    add x1, x1, #1
    b inner_loop
end_inner:
    add x0, x0, #1
    b outer_loop

done_sort:
    // --- Calcular mediana ---
    // Si n es impar: tomar elemento en n/2
    // Si n es par: promedio de n/2 - 1 y n/2

    and x0, x11, #1           // x0 = n % 2
    cbnz x0, impar

    // --- Caso par ---
    sub x1, x11, #1
    lsr x1, x1, #1            // x1 = (n/2) - 1
    add x2, x1, #1            // x2 = n/2

    ldr x3, [x12, x1, lsl #3]
    ldr x4, [x12, x2, lsl #3]
    add x5, x3, x4
    lsr x6, x5, #1            // mediana = (x3 + x4) / 2
    b imprimir

impar:
    lsr x1, x11, #1
    ldr x6, [x12, x1, lsl #3] // mediana = lista[n/2]

imprimir:
    // x6 contiene la mediana
    // Convertir a decimal
    ldr x5, =buffer
    add x5, x5, #31
    mov x2, #0
    mov x7, x6
    mov x9, #10

conv_loop:
    udiv x3, x7, x9
    mul x4, x3, x9
    sub x8, x7, x4
    add x8, x8, #'0'
    strb w8, [x5]
    sub x5, x5, #1
    add x2, x2, #1
    mov x7, x3
    cmp x7, #0
    bne conv_loop

    add x5, x5, #1
    mov w3, #'\n'
    strb w3, [x5, x2]
    add x2, x2, #1

    // syscall write(STDOUT, buffer, len)
    mov x0, #1
    mov x1, x5
    mov x8, #64
    svc 0

    // salir
    mov x0, #0
    mov x8, #93
    svc 0