程序接收由用户键入的数N,根据给定的N值,计算Fibonacci数。
Fibonacci数的定义如下:
FIB(1)=1
FIB(2)=1
FIB(N)=FIB(N-2)+FIB(N-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