Este cΓ³digo en ARM64 imprime los primeros 10 nΓΊmeros de la serie de Fibonacci, uno por lΓnea, en la consola. Vamos parte por parte para entender cΓ³mo funciona todo:
π’ ΒΏQuΓ© es la serie de Fibonacci?
Una secuencia donde:
f(0) = 0
f(1) = 1
f(n) = f(n-1) + f(n-2) para n > 1
Resultado para los primeros 10:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34
π Secciones del cΓ³digo
.data y .bss
newline: .asciz "\n" ; Cadena con salto de lΓnea
buffer: .skip 12 ; Buffer para guardar nΓΊmero convertido (12 bytes aprox)
π Punto de entrada: _start
mov x19, #10 ; x19 = contador (cuΓ‘ntos nΓΊmeros queremos)
mov x20, #0 ; f(0)
mov x21, #1 ; f(1)
Estos registros (x20, x21) se usan para mantener el valor actual y el siguiente en la secuencia.
π Loop principal: fibonacci_loop
cmp x19, #0
beq end_fibonacci
Verificamos si terminamos (cuando el contador llega a 0).
mov x0, x20
bl print_number
bl print_newline
Imprimimos el nΓΊmero actual f(n) y un salto de lΓnea.
add x22, x20, x21 ; x22 = f(n+1)
mov x20, x21 ; x20 = f(n)
mov x21, x22 ; x21 = f(n+1)
Actualizamos los valores de Fibonacci para el prΓ³ximo ciclo.
sub x19, x19, #1
b fibonacci_loop
π¨οΈ FunciΓ³n print_number
Esta funciΓ³n convierte un nΓΊmero en decimal y lo imprime como string usando syscall write.
Proceso:
-
Guarda registros para no perder informaciΓ³n.
-
Usa divisiΓ³n entera por 10 (
udiv) y obtiene el residuo (msub) para cada dΓgito.
-
Convierte cada dΓgito a ASCII sumando
'0' y lo almacena en el buffer.
-
Si el nΓΊmero es 0, se imprime directamente
'0'.
-
Finalmente, escribe el buffer a
stdout.
Esto es similar a una versiΓ³n bΓ‘sica de itoa + write.
π print_newline
Es una pequeΓ±a funciΓ³n que imprime un \n usando una syscall de write.
β
Salida esperada
0
1
1
2
3
5
8
13
21
34
π§ Cosas que hace bien este cΓ³digo:
-
No depende de
libc (sin printf, scanf).
-
Convierte nΓΊmeros manualmente a strings.
-
Usa instrucciones ARM64 bΓ‘sicas como
udiv, msub, cmp, b, etc.
-
Buen uso de registros preservados (
x19βx21) y stack (stp/ldp) para mantener estado.