求Fibonacci数(递归)

程序接收由用户键入的数N,根据给定的N值,计算Fibonacci数。

        Fibonacci数的定义如下:

             FIB1=1

             FIB2=1

             FIBN=FIBN-2+FIBN-1   N>=3   

 

data    segment
mess    db 'Input the N(<100):','$'
mess1   db 'F(','$'
mess2   db ')=','$'
num1    db 3
num2    db ?
num     dw ?
num3    db ?

result1 dw ?
result2 dw ?
f_end    dw 0
constant dw 10000,1000,100,10,1
flag    dw 0
data    ends
;**********************
code   segment
       assume cs:code,ds:data,es:data
start:
       mov ax,data
       mov ds,ax
       mov es,ax

       lea dx,mess
       mov ah,09h
       int 21h
      
       lea dx,num1
       mov ah,0ah
       int 21h
      
       mov dl,0ah   ;huiche
       mov ah,02h
       int 21h
       mov dl,0dh
       mov ah,02h
       int 21h

       xor cx,cx
       mov cx,num
       xchg cl,ch   ;因为从键盘输入的是字符串,保存时高位在低位的前面,所以                                    要交换,才能直接从内存中取出并正确
       mov num,cx
       call DTOH     ;将输入的十进制数转换成十六进制并保存
       mov bx,cx   
       xor dx,dx   ;DX放十进制数的百万位,即十六进制DX:AX
       call FINA
       push dx       ;后面会改变,所以要保护起来     

       lea dx,mess1
       mov ah,09h
       int 21h
      
       mov cx,num
       mov dl,ch
       mov ah,02h
       int 21h
       mov dl,cl
       mov ah,02h
       int 21h

       lea dx,mess2
       mov ah,09h
       int 21h

       mov bx,result2
       pop dx
     
       call HTOD     ;将保存的十六进制数转换成十进制并在屏幕上显示
    
       mov ah,4ch
       int 21h

;*************************
;10--->16
 DTOH PROC NEAR
       sub ch,30h
       sub cl,30h
       mov al,ch
       mov bl,10
       mul bl
       mov ch,0
       add cx,ax
       ret
DTOH   ENDP
      
;****************************
;***********************
;16--->10
HTOD PROC NEAR
      
       push bx
       mov flag,0
       mov cx,5
       lea si,constant
       mov bx,dx
dic_div:
      
       mov ax,bx
loop1:  mov dx,0
       div word ptr[si]      
       mov bx,dx
       mov dl,al

       cmp flag,0
       jnz print1
       cmp dl,0
       je  skip
       mov flag,1     
      
print1: add dl,30h
        mov ah,02h
        int 21h

skip:   add si,2
        loop dic_div
        cmp f_end,0
        jnz quit
        pop ax
        ;mov ax,bx
        mov cx,5
        lea si,constant
        mov flag,0
        mov f_end,1
        jmp loop1
       
quit:      RET
HTOD   ENDP
;****************8
FINA PROC NEAR
      
       cmp bx,1
       jz  L1
       cmp bx,2
       jz  L2
      
L_loop:
       dec bx
       call FINA
       mov ax,result2
      
       mov cx,result1
       add result2,cx
       adc dx,0
       mov result1,ax
      
      
       jmp exit

L1:    mov word ptr result1,1
       jmp exit
L2:
       mov result2,1
       dec bx
       call FINA
      
exit:  ret
FINA   ENDP
;*************************

code  ends
      end start

Fibonacci程序设计 目 录 一.课程设计任务书•••••••••••••••••••••••••••••••••••••••••••••••••••••2 二.正文••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••3 1.设计目的、设计内容、时间安排•••••••••••••••••••••••••••••••••••3 2.设计环境与与工具•••••••••••••••••••••••••••••••••••••••••••••••••3 3.程序设计算法说明、流程图••••••••••••••••••••••••••••••••••••••••3 4.源程序清单••••••••••••••••••••••••••••••••••••••••••••••••••••••••5 5.运行结果记录••••••••••••••••••••••••••••••••••••••••••••••••••••••8 6. 设计结果分析•••••••••••••••••••••••••••••••••••••••••••••••••••••••8 7.参考文献及其他••••••••••••••••••••••••••••••••••••••••••••••••••••8 三.评分表•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••9 四.封底••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值