| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
1.题目:求Fibonacci数FIB 
2.要求: 
a)程序接收由用户键入的范围在0~100(不包括0和100)之间的n值 
b)根据给定的n值,计算Fibonacci数,其定义如下 
FIB(1) = 1 
FIB(2) = 1 
FIB(n) = FIB(n-2) +FIB(n-1)                (n>2) 
c)程序输出FIB(n)的值 
3.提示:程序可由三部分组成 
a)输入部分:程序接收用户键入的十进制n值,转换为2进制后存入num单元中 
b)用递归子程序fibp求出FIB(n)的值,结果存放在result单元中。 
c)输出部分:把result的值转换为十进制后打印输出 
 
 
自己不会写这个代码,在网上看到的一个,分析到一半到add65536就看不懂了,有木有大佬能给看一下这是啥意思不    ,或者有哪位哥哥能写出来自己的也可以   
 
 
datas segment 
    str1 db 'please input a number(1-100):n=','$' 
    str2 db 13,10,'fib(n)=','$' 
    wrongstr db 13,10,13,10,'a number between 1 and 100 please!',13,10,13,10,'$' 
    inputbuffer db 3,?,3 dup(?) 
    n dw ? 
    result1h dw 0 
    result1l dw 0 
    result2h dw 0 
    result2l dw 0 
    c10 dw 10 
    outputbuffer db 11 dup('0') 
datas ends;--------------------定义好要输出的提示语以及出错提示,开辟好四个result单元 
 
codes segment 
    assume cs:codes,ds:datas 
    start: 
    mov ax,datas 
    mov ds,ax 
    call input;------------------------------------------跳转到输入函数 
    call fib;--------------------------------------------跳转到求值函数 
    call output;-----------------------------------------跳转到输出函数 
    jmp quit;--------------------------------------------跳转到结束函数 
    input proc 
        jmp t1;------------------------------------------t1为将数据段预存数据输出 
        wrong: 
            lea dx,wrongstr 
        mov ah,9 
        int 21h 
        t1: 
            lea dx,str1 
            mov ah,9 
            int 21h 
            lea dx,inputbuffer 
            mov ah,10 
            int 21h 
            mov ax,0 
            mov cl,inputbuffer+1 
            mov ch,0 
            lea bx,inputbuffer+2 
        t2: 
            mul c10;-------------------------------------将第一个读入的数乘以10 
            mov dl,[bx] 
            cmp dl,'0';----------------------------------将输入的数和0比较,如果小于零,错误 
            jb wrong 
            cmp dl,'9';----------------------------------将输入的数和9比较,如果目标数字只是一位数,前面的乘以10就会错误 
            ja wrong 
            and dl,0fh;----------------------------------取dl的后四位 
            add al,dl 
            adc ah,0 
            inc bx 
            loop t2 
            cmp ax,0032h;--------------------------------这里以50为界限,超过50的数其实已经到了32位数的极限了 
            ja wrong 
            cmp ax,1 
            jb wrong 
            mov n,ax;------------------------------------将输入的数存到n中 
            ret 
    input endp 
    fib proc 
        cmp n,1;-----------------------------------------首先检查n是否等于1,等于1直接跳转到l1 
        jz l1 
        cmp n,2;-----------------------------------------其次检查n是否等于2,等于2直接跳转到l2 
        jz l2 
        dec n;-------------------------------------------n减一,准备开始启动递归调用 
        call fib;----------------------------------------递归调用fib函数 
        mov ax,result2l 
        mov dx,result2h 
        mov cx,result1l 
        add result2l,cx 
        mov cx,result1h 
        adc result2h,cx 
        mov result1l,ax 
        mov result1h,dx;---------------------------------循环置换加数 
        jmp exit 
        l1: 
            mov result1l,1 
            mov result2l,1 
            jmp exit 
        l2: 
            mov result2l,1 
            dec n 
            call fib;------------------------------------减一再回到该函数 
            exit:ret 
    fib endp 
    output proc 
        mov ax,result2l 
        lea si,outputbuffer 
        mov cx,5 
        r1: 
            mov dx,0 
            div c10 
            inc si 
            add [si],dl 
            loop r1;-------------------------------------循环5次,将输出缓冲区的数存到内存中 
        mov ax,result2h 
        lea si,outputbuffer 
        mov cx,5 
        r2: 
            mov dx,0 
            div c10 
            inc si 
            push cx 
            cmp dx,0 
            je noadd;------------------------------------如果余数为0,说明这个数能被10整除,不是个位数 
            mov cx,dx;-----------------------------------将分离出来的个位数存入cx,进行call add65536函数的循环 
            addn: 
                call add65536 
                loop addn 
            noadd: 
                pop cx 
            loop r2 
            lea dx,str2 
            mov ah,9 
            int 21h 
            lea si,outputbuffer 
            mov bx,10 
        r3: 
            cmp byte ptr [si+bx],'0' 
            ja print;------------------------------------如果大于0就将该数输出 
            dec bx 
            jmp r3 
        print: 
            mov dl,[si+bx] 
            mov ah,2 
            int 21h 
            dec bx 
            cmp bx,1 
            jae print;-----------------------------------bx大于等于1就将[si+di]后的位置的数字输出,否则返回 
            ret 
    output endp 
    add65536 proc 
        add byte ptr [si],6 
        mov dl,0 
        cmp byte ptr [si],3ah 
        jb a1 
        sub byte ptr [si],10 
        mov dl,1 
        a1: 
            add byte ptr [si+1],3 
            add byte ptr [si+1],dl 
            mov dl,0 
            cmp byte ptr [si+1],3ah 
            jb a2 
            sub byte ptr [si+1],10 
            mov dl,1 
        a2: 
            add byte ptr [si+2],5 
            add byte ptr [si+2],dl 
            mov dl,0 
            cmp byte ptr [si+2],3ah 
            jb a3 
            sub byte ptr [si+2],10 
            mov dl,1 
        a3: 
            add byte ptr [si+3],5 
            add byte ptr [si+3],dl 
            mov dl,0 
            cmp byte ptr [si+3],3ah 
            jb a4 
            sub byte ptr [si+3],10 
            mov dl,1 
        a4: 
            add byte ptr [si+4],6 
            add byte ptr [si+4],dl 
            mov dl,0 
            cmp byte ptr [si+4],3ah 
            jb a0 
            sub byte ptr [si+4],10 
            mov dl,1 
        a5: 
            add byte ptr [si+5],dl 
            mov dl,0 
            cmp byte ptr [si+5],3ah 
            jb a0 
            sub byte ptr [si+5],10 
            mov dl,1 
        a6: 
            add byte ptr [si+6],dl 
            mov dl,0 
            cmp byte ptr [si+6],3ah 
            jb a0 
            sub byte ptr [si+6],10 
            mov dl,1 
        a7: 
            add byte ptr [si+7],dl 
            mov dl,0 
            cmp byte ptr [si+7],3ah 
            jb a0 
            sub byte ptr [si+7],10 
            mov dl,1 
        a8: 
            add byte ptr [si+8],dl 
            mov dl,0 
            cmp byte ptr [si+8],3ah 
            jb a0 
            sub byte ptr [si+8],10 
            mov dl,1 
        a9: 
            add byte ptr [si+9],dl 
        a0: 
            ret 
    add65536 endp 
    quit: 
        mov ah,4ch 
        int 21h 
codes ends 
end start |   
 
 
 
 |