section .data
msg db "Resultado: "
len_msg equ $ - msg
newline db 10
section .bss
buffer resb 32 ; Espacio para convertir el número a texto
section .text
global _start
_start:
; 1. Calcular Fibonacci de 40
mov rdi, 40
call fib
; 2. Guardar el resultado para convertirlo
mov rdi, rax ; El número a convertir va a RDI
mov rsi, buffer + 31 ; Empezamos a escribir desde el final del buffer
mov byte [rsi], 0 ; Fin de cadena
mov rbx, 10 ; Divisor para obtener dígitos decimales
mov rcx, 0 ; Contador de dígitos
.convert_loop:
xor rdx, rdx ; Limpiar RDX para la división
div rbx
; RAX
/ 10 -> Cociente en RAX
, Resto en RDX
add dl, '0' ; Convertir el resto (0-9) a ASCII ('0'-'9')
dec rsi ; Retroceder en el buffer
mov [rsi], dl ; Guardar el carácter
inc rcx ; Incrementar largo
test rax, rax ; ¿Queda algo por dividir?
jnz .convert_loop
; 3. Imprimir etiqueta "Resultado: "
push rsi ; Guardar posición del número
push rcx ; Guardar largo del número
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, msg
mov rdx, len_msg
syscall
; 4. Imprimir el número convertido
pop rdx ; Recuperar largo
pop rsi ; Recuperar posición
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
syscall
; 5. Imprimir salto de línea
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; 6. Salir
mov rax, 60 ; sys_exit
xor rdi, rdi
syscall
fib:
cmp rdi, 1
jle .base
push rbx
push r12
mov rbx, rdi
dec rdi
call fib
mov r12, rax
mov rdi, rbx
sub rdi, 2
call fib
add rax, r12
pop r12
pop rbx
ret
.base:
mov rax, rdi
ret
c2VjdGlvbiAuZGF0YQogICAgbXNnIGRiICJSZXN1bHRhZG86ICIKICAgIGxlbl9tc2cgZXF1ICQgLSBtc2cKICAgIG5ld2xpbmUgZGIgMTAKCnNlY3Rpb24gLmJzcwogICAgYnVmZmVyIHJlc2IgMzIgICAgICA7IEVzcGFjaW8gcGFyYSBjb252ZXJ0aXIgZWwgbsO6bWVybyBhIHRleHRvCgpzZWN0aW9uIC50ZXh0CiAgICBnbG9iYWwgX3N0YXJ0Cgpfc3RhcnQ6CiAgICA7IDEuIENhbGN1bGFyIEZpYm9uYWNjaSBkZSA0MAogICAgbW92IHJkaSwgNDAKICAgIGNhbGwgZmliCgogICAgOyAyLiBHdWFyZGFyIGVsIHJlc3VsdGFkbyBwYXJhIGNvbnZlcnRpcmxvCiAgICBtb3YgcmRpLCByYXggICAgICAgIDsgRWwgbsO6bWVybyBhIGNvbnZlcnRpciB2YSBhIFJESQogICAgbW92IHJzaSwgYnVmZmVyICsgMzEgOyBFbXBlemFtb3MgYSBlc2NyaWJpciBkZXNkZSBlbCBmaW5hbCBkZWwgYnVmZmVyCiAgICBtb3YgYnl0ZSBbcnNpXSwgMCAgIDsgRmluIGRlIGNhZGVuYQogICAgbW92IHJieCwgMTAgICAgICAgICA7IERpdmlzb3IgcGFyYSBvYnRlbmVyIGTDrWdpdG9zIGRlY2ltYWxlcwogICAgbW92IHJjeCwgMCAgICAgICAgICA7IENvbnRhZG9yIGRlIGTDrWdpdG9zCgouY29udmVydF9sb29wOgogICAgeG9yIHJkeCwgcmR4ICAgICAgICA7IExpbXBpYXIgUkRYIHBhcmEgbGEgZGl2aXNpw7NuCiAgICBkaXYgcmJ4ICAgICAgICAgICAgIDsgUkFYIC8gMTAgLT4gQ29jaWVudGUgZW4gUkFYLCBSZXN0byBlbiBSRFgKICAgIGFkZCBkbCwgJzAnICAgICAgICAgOyBDb252ZXJ0aXIgZWwgcmVzdG8gKDAtOSkgYSBBU0NJSSAoJzAnLSc5JykKICAgIGRlYyByc2kgICAgICAgICAgICAgOyBSZXRyb2NlZGVyIGVuIGVsIGJ1ZmZlcgogICAgbW92IFtyc2ldLCBkbCAgICAgICA7IEd1YXJkYXIgZWwgY2Fyw6FjdGVyCiAgICBpbmMgcmN4ICAgICAgICAgICAgIDsgSW5jcmVtZW50YXIgbGFyZ28KICAgIHRlc3QgcmF4LCByYXggICAgICAgOyDCv1F1ZWRhIGFsZ28gcG9yIGRpdmlkaXI/CiAgICBqbnogLmNvbnZlcnRfbG9vcAoKICAgIDsgMy4gSW1wcmltaXIgZXRpcXVldGEgIlJlc3VsdGFkbzogIgogICAgcHVzaCByc2kgICAgICAgICAgICA7IEd1YXJkYXIgcG9zaWNpw7NuIGRlbCBuw7ptZXJvCiAgICBwdXNoIHJjeCAgICAgICAgICAgIDsgR3VhcmRhciBsYXJnbyBkZWwgbsO6bWVybwogICAgbW92IHJheCwgMSAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IHJkaSwgMSAgICAgICAgICA7IHN0ZG91dAogICAgbW92IHJzaSwgbXNnCiAgICBtb3YgcmR4LCBsZW5fbXNnCiAgICBzeXNjYWxsCgogICAgOyA0LiBJbXByaW1pciBlbCBuw7ptZXJvIGNvbnZlcnRpZG8KICAgIHBvcCByZHggICAgICAgICAgICAgOyBSZWN1cGVyYXIgbGFyZ28KICAgIHBvcCByc2kgICAgICAgICAgICAgOyBSZWN1cGVyYXIgcG9zaWNpw7NuCiAgICBtb3YgcmF4LCAxICAgICAgICAgIDsgc3lzX3dyaXRlCiAgICBtb3YgcmRpLCAxICAgICAgICAgIDsgc3Rkb3V0CiAgICBzeXNjYWxsCgogICAgOyA1LiBJbXByaW1pciBzYWx0byBkZSBsw61uZWEKICAgIG1vdiByYXgsIDEKICAgIG1vdiByZGksIDEKICAgIG1vdiByc2ksIG5ld2xpbmUKICAgIG1vdiByZHgsIDEKICAgIHN5c2NhbGwKCiAgICA7IDYuIFNhbGlyCiAgICBtb3YgcmF4LCA2MCAgICAgICAgIDsgc3lzX2V4aXQKICAgIHhvciByZGksIHJkaQogICAgc3lzY2FsbAoKZmliOgogICAgY21wIHJkaSwgMQogICAgamxlIC5iYXNlCiAgICBwdXNoIHJieAogICAgcHVzaCByMTIKICAgIG1vdiByYngsIHJkaQogICAgZGVjIHJkaQogICAgY2FsbCBmaWIKICAgIG1vdiByMTIsIHJheAogICAgbW92IHJkaSwgcmJ4CiAgICBzdWIgcmRpLCAyCiAgICBjYWxsIGZpYgogICAgYWRkIHJheCwgcjEyCiAgICBwb3AgcjEyCiAgICBwb3AgcmJ4CiAgICByZXQKLmJhc2U6CiAgICBtb3YgcmF4LCByZGkKICAgIHJldAo=