文章标题 汇编 计算 Fibonacci 数(20~30)

;计算 Fibonacci 数

;   20 = 6765
;   21 = 10946
;   22 = 17711
;   23 = 28657
;   24 = 46368
;   25 = 75025
;   26 = 121393
;   27 = 196418
;   28 = 317811
;   29 = 514229
;   30 = 832040

.MODEL SMALL

.Data

    mass1 DB 'input the number(20~30):','$'
    mass2 DB 'The result is :','$'
    mass3 DB 0dh, 0ah,'press q/Q to exit',0dh,0ah,'$'
    mass4 DB 0dh, 0ah,'thank you!',0dh,0ah,'$'
    mass5 DB 0dh, 0ah,'input is error,input again',0dh,0ah,'$'

    num DW ?

    result1H DW 0;高位
    result1L DW 0;低位

    result2H DW 0;高位
    result2L DW 0;低位

    ans db 6 dup(' '), 0dh,0ah,'$';保存答案的十进制数

    text DB 'text', 0dh,0ah,'$'

.code
    MAIN PROC FAR
    MOV AX ,@Data
    MOV DS ,AX

    ;--------------------------------
        again:
            mov ax , 0;初始化
            mov bx , 0
            mov dx , 0

            mov result1L,0;初始化
            mov result1H,0
            mov result2L,0
            mov result2H,0

            mov dx , offset mass3;停止输入提示
            mov ah , 9
            int 21h
            mov dx , offset mass1;输入限制提示
            mov ah , 9
            int 21h
            ;-----------

            mov ah , 1
            int 21h
            cmp al , 'q';输入停止
            jz return
            cmp al ,'Q';输入停止
            jz return
            sub al , 30h;减去48
            cbw
            mov bx , ax

            call input;调用输入的子程序

            cmp bx , 20;小于20 , 大于30 都是输入错误
            jl error
            cmp bx , 30
            ja error


            mov num , bx;将输入的值放进num中
            call fibP;调用求fibonacci数的子程序

            mov dx , offset mass2;运算结果提示
            mov ah , 9
            int 21h

            mov ax , result2L;低位放进ax中
            mov dx , result2H;高位放进dx中
            call output;调用输出的子程序

            jmp again

        error:
            lea dx , mass5;输入错误错误提示
            mov ah , 9
            int 21h
            jmp again


    ;-------------------------------

        return:
            mov dx , offset mass4;程序结束提示
            mov ah , 9
            int 21h

    mov ax,4C00H
    int 21h
    Main endp

    ;**********************************************************
    ;输入子程序----------------------------------------------
    ;**********************************************************

    input  proc  near
         ;键盘输入十进制数放在bx中
            ;mov bx , 0
        newchar: 
            mov   ah, 1      ;键盘输入
            int   21h
            sub   al, 30h         
            jl    exit       ; <0退出
            cmp   al, 9
            jg    exit       ; >9退出
            cbw

            xchg  ax, bx
            mov   cx, 10
            mul   cx
            xchg  ax, bx
            add   bx, ax

            jmp newchar
        exit:
             ret
    input  endp


    ;**********************************************************
    ;32位输出子程序--------------------------------------------
    ;**********************************************************

    output proc near
          lea di,ans
          add di,5
    m2:
          mov bx,10000
          div bx    ; 这里是发生溢出之处
          push ax
          push dx
          ; ============
          ; 以下转换10进制的低4位
          pop dx
          mov cx,4
          mov ax,dx
    m3:   mov dx,0
          mov bx,10
          div bx
          add dl,30h
          mov [di],dl;求的余数加30h然后放进字符数组里面
          dec di
          loop m3
          ; ===========
          ; 以下转换10进制的高2位
          pop ax
          mov cx,2

    m4:   mov dx,0
          mov bx,10
          div bx
          add dl,30h
          mov [di],dl
          dec di
          loop m4
          ; ============
          ; 输出10进制串
          lea dx,ans
          mov ah,9
          int 21h

            ret
    output endp


    ;**********************************************************
    ;调试子程序--------------------------------------------------
    ;**********************************************************

    TextP proc near

        mov dx , offset text
        mov ah , 9
        int 21h
        ret
    TextP endp




    ;**********************************************************
    ;fibonacci数的子程序---------------------------------------
    ;**********************************************************

    fibP proc near

        cmp num , 1;等于1 的情况
        jz fibL1

        cmp num , 2;等于2 的情况
        jz fibL2

        dec num
        call fibP
        mov ax , result2L ; 将当前f(num-1) 的高位和地位放进dx,ax
        mov dx , result2H

        mov cx , result1L;然后加上f(num-2),即放在result1L,result1H 的值,计算得到f(num-1)+f(num-2)放进result2中
        add result2L , cx 
        mov cx , result1H
        adc result2H , cx 

        mov result1L , ax ;最后将保存在dx,ax,中的值放进result1中
        mov result1H , dx

        jmp exitFib

    fibL1:  ;num等于1 的时候
        mov result1L , 1
        mov result2L , 1
        jmp exitFib

    fibL2:  ;num等于2 的时候
        mov result2L , 1
        dec num
        call fibP

    exitFib:
        ret

    fibP endp

    ;******************************************************************

end




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值