.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