利用汇编语言计算斐波那契数列

基于汇编语言的计算斐波那契数程序设计

一、题目要求

程序接收由用户键入的范围在0~100(不包括0和100)之间的n值。根据给定的n值,计算Fibonacci数,其定义如下:
FIB(1) = 1
FIB(2) = 1
FIB(n) = FIB(n-2) +FIB(n-1) (n>2)
程序输出FIB(n)的值

二、代码实现

data segment
    str1 db 'Please input number n: ', 13, 10 ,'$'
    str2 db 'fibonacci(n): ', 13, 10, '$'

    monin label byte
        max db 3
        act db ?
        mon db 3 dup(?)

    ;斐波那契数列第100位有21位数
    n1  dw 22 dup(0)
    n2  dw 22 dup(0)
    len dw 1;储存结果的位数
    add_time dw 1 dup(0)
data ends

code segment
main    proc    far
    assume cs:code, ds:data
start:
    push    ds
    sub     ax, ax
    p
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
汇编语言实现斐波那契数列可以使用递归或循环方式实现。 递归方式实现斐波那契数列: ``` section .data n equ 10 ;计算前10项斐波那契数列 section .text global _start _start: mov ecx, n ;将n存入ecx寄存器 mov eax, 0 ;将第1项斐波那契数列存入eax寄存器 mov ebx, 1 ;将第2项斐波那契数列存入ebx寄存器 call fibonacci ;调用递归函数 mov eax, 1 ;退出程序 xor ebx, ebx int 0x80 fibonacci: push ebp ;保存ebp寄存器 mov ebp, esp ;将当前栈指针存入ebp寄存器 cmp ecx, 0 ;比较n与0 je end_fibonacci ;如果n等于0,跳转到end_fibonacci标签处 cmp ecx, 1 ;比较n与1 je print ;如果n等于1,跳转到print标签处 ;计算下一项斐波那契数列 mov edx, eax ;将前一项斐波那契数列存入edx寄存器 add eax, ebx ;将前两项斐波那契数列相加,结果存入eax寄存器 mov ebx, edx ;将前一项斐波那契数列存入ebx寄存器 dec ecx ;将n减1 call fibonacci ;递归调用fibonacci函数 print: ;打印当前项斐波那契数列 push eax ;将当前项斐波那契数列存入栈中 push dword msg ;将提示信息存入栈中 call printf ;调用printf函数打印提示信息和当前项斐波那契数列 add esp, 8 ;清除栈中的参数 ;跳转到end_fibonacci标签处 jmp end_fibonacci end_fibonacci: pop ebp ;恢复ebp寄存器 ret ;返回到上一级调用函数处 section .data msg db "Fibonacci(%d) = %d", 10, 0 ;提示信息 section .text extern printf ;声明外部函数printf ``` 循环方式实现斐波那契数列: ``` section .data n equ 10 ;计算前10项斐波那契数列 section .text global _start _start: mov ecx, n ;将n存入ecx寄存器 mov eax, 0 ;将第1项斐波那契数列存入eax寄存器 mov ebx, 1 ;将第2项斐波那契数列存入ebx寄存器 call fibonacci ;调用循环函数 mov eax, 1 ;退出程序 xor ebx, ebx int 0x80 fibonacci: push ebp ;保存ebp寄存器 mov ebp, esp ;将当前栈指针存入ebp寄存器 sub esp, 4 ;为i变量分配4字节的空间 mov dword [ebp-4], 2 ;将i变量存入ebp-4的位置 mov edx, eax ;将第1项斐波那契数列存入edx寄存器 add eax, ebx ;将第2项斐波那契数列存入eax寄存器 mov ebx, edx ;将第1项斐波那契数列存入ebx寄存器 cmp ecx, 2 ;比较n与2 jle print ;如果n小于等于2,跳转到print标签处 ;循环计算斐波那契数列 loop: inc dword [ebp-4] ;将i加1 cmp ecx, dword [ebp-4] ;比较i与n jle print ;如果i大于n,跳转到print标签处 mov edx, eax ;将前一项斐波那契数列存入edx寄存器 add eax, ebx ;将前两项斐波那契数列相加,结果存入eax寄存器 mov ebx, edx ;将前一项斐波那契数列存入ebx寄存器 jmp loop ;跳转到loop标签处 print: ;打印当前项斐波那契数列 push eax ;将当前项斐波那契数列存入栈中 push dword msg ;将提示信息存入栈中 call printf ;调用printf函数打印提示信息和当前项斐波那契数列 add esp, 8 ;清除栈中的参数 ;跳转到end_fibonacci标签处 jmp end_fibonacci end_fibonacci: mov esp, ebp ;清除栈空间 pop ebp ;恢复ebp寄存器 ret ;返回到上一级调用函数处 section .data msg db "Fibonacci(%d) = %d", 10, 0 ;提示信息 section .text extern printf ;声明外部函数printf ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fary Tormenta

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值