assembly - 递归斐波那契 NASM
问题描述
我正在尝试在汇编中编写一个递归的斐波那契函数,但我不确定我是否知道我在做什么。这就是我到目前为止所拥有的,但我遇到了分段错误。该代码从用户那里获取一个数字,然后计算该数字,因此如果 n=9,则输出为 34。
代码:
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
解决方案
推荐阅读
- pandas - 使用 apply 方法将 Python Pandas 数据框列中的元组列表转换为列表字典
- javascript - 将 data-id 传输到多个模式
- java - 在选择时突出显示细线交叉图案中的相关单元格
- elasticsearch - 如何配置 ElasticSearch 以增加单字字符串之间的模糊性
- java - Spring Boot Starters 中如何指定 maven 版本?
- c# - 触摸屏显示器windows窗体应用程序c#
- java - 如何在java应用程序中连续获取批处理cmd输出
- c# - 取消在 Prism EventAggregator 上排队的其他正在运行的任务
- javascript - 我收到一个错误,“发送后无法设置标头”,并且无论在 node.js 上如何,电子邮件上的错误消息都会不断出现
- ubuntu - 在 Ubuntu 18.04 上安装 Lisk