GNU/Linux β€’ xterm β€’ bash 144 views

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:

  1. Guarda registros para no perder informaciΓ³n.
  2. Usa divisiΓ³n entera por 10 (udiv) y obtiene el residuo (msub) para cada dΓ­gito.
  3. Convierte cada dΓ­gito a ASCII sumando '0' y lo almacena en el buffer.
  4. Si el nΓΊmero es 0, se imprime directamente '0'.
  5. 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.