Assembly 递归Fibonacci-NASM
我试图在汇编中编写一个递归斐波那契函数,但我不确定我是否知道我在做什么。到目前为止,这就是我所拥有的,但我有错。 代码从用户处获取一个数字,然后计算该数字,因此,如果n=9,则输出为34 代码:Assembly 递归Fibonacci-NASM,assembly,x86,x86-64,nasm,Assembly,X86,X86 64,Nasm,我试图在汇编中编写一个递归斐波那契函数,但我不确定我是否知道我在做什么。到目前为止,这就是我所拥有的,但我有错。 代码从用户处获取一个数字,然后计算该数字,因此,如果n=9,则输出为34 代码: mov-eax,n应该是mov-eax,[n]。。您希望加载的是值,而不是地址。PS:学习使用调试器。对fib\n的初始调用是在错误的寄存器中传递参数。哦,是的,使用正确的寄存器也有帮助:D@PeterCordes但是n不是用于接收用户输入吗?这是一个四字,不是一个值为1的四字。@Michael:显然我
mov-eax,n
应该是mov-eax,[n]
。。您希望加载的是值,而不是地址。PS:学习使用调试器。对fib\n
的初始调用是在错误的寄存器中传递参数。哦,是的,使用正确的寄存器也有帮助:D@PeterCordes但是n
不是用于接收用户输入吗?这是一个四字,不是一个值为1的四字。@Michael:显然我还没完全清醒。删除了我以前的评论。
extern printf, scanf
section .data
format db "%s %d",10,0
format2 db '%ld',0
format3 db "%s ",10,0
str1 db "Chose a number: ",0
str2 db "Result is: ",0
section .bss
n: resq 1
section .text
global _start
_start:
call print1 ;choose a number
mov rdi, format2
mov rsi, n
mov rax, 0
call scanf ;getting number
mov eax, n
call fib_n
call print2 ;printing result
exit: mov rax,60
xor rdi, rdi
syscall
fib_n:
push rdi
xor eax, eax
cmp edi, 2
jb end ; fib(1) = 0
mov eax, 1
je end ; fib(2) = 1
dec edi
call fib_n ; -> EAX
push rax ; (1) Preserve intermediate result!
dec edi
call fib_n ; -> EAX
add eax, [rsp] ; fib(n) = fib(n-2) + fib(n-1)
add rsp, 8 ; (1)
end:
pop rdi
ret
print1:
mov rdi, format3
mov rsi,str1
mov rax,0
call printf
ret
print2:
mov rdi,format
mov rsi, str2
mov rdx, [n]
mov rax,0
call printf \
ret