?? fib.asm
字號:
DATA SEGMENT
;用于存放結果,5個菲波那切契數
RESULT DW 5 DUP(?)
STR DB 'greater than 10000 and smaller than 65535 !',0DH,0AH,0DH,0AH,'$';字符串STR1,用于輸出提示信息
STR2 DB 0DH,0AH,'The five fib-numbers ',0AH,'$'
STR3 DB 0DH,0AH,'Please input a legal decimal number !',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;subfuction INPUT
;輸入子程序,輸入一個不大于60000的數,以10進制形式輸入,16進制形式存放在BX中
INPUT PROC FAR
MOV BX,0
;循環計數
MOV CX,05H
;輸入一個位
INPUTANUMBER:
MOV AH,01H
INT 21H
;判斷是否小于0
SUB AL,30H
JL REINPUT
CMP AL,09H
;判斷是否大于9
JG REINPUT
CBW
;把原來的數乘10再加上新輸入的數
XCHG AX,BX
PUSH CX
MOV CX,10D
MUL CX
POP CX
XCHG AX,BX
ADD BX,AX
;計數器-1
DEC CX
;循環輸入從高到低的5個位數
JNZ INPUTANUMBER
JMP EXIT
;輸出提示符并等待重新輸入
REINPUT:
LEA DX,STR3
MOV AH,09H
INT 21H
MOV CX,05H
JMP INPUTANUMBER
EXIT:
RET
INPUT ENDP
;subfuction GETFIB
;獲取不超過輸入數的最大菲波那契數,存于DX
GETFIB PROC FAR
MOV AX,1
MOV DX,1
PUSH AX
GETFIBLOOP:
POP AX
;通過相加交換循環不斷獲取更大的菲波那契數
ADD AX,DX
XCHG AX,DX
PUSH AX
MOV CL,AH
SUB AX,AX
MOV AL,DH
CMP CX,AX
;若相加后變小說明溢出,退出計算
JG ENDGETFIB
;按先高8位,后低8位的順序判斷是否結果超過了輸入的數;
POP AX
PUSH AX
SUB CX,CX
SUB AX,AX
MOV CL,DH
MOV AL,BH
CMP CX,AX
;高8位小于,繼續獲得更大菲波那契數
JL GETFIBLOOP
CMP CX,AX
;高8位大于,已經超出,
JG ENDGETFIB
;高8位相等,繼續判斷低8位
MOV CL,DL
MOV AL,BL
CMP CX,AX
;小于,繼續獲得更大菲波那契數
JL GETFIBLOOP
ENDGETFIB:
POP AX
RET
GETFIB ENDP
;subfuction CRLF
;打印回車換行子程序
CRLF PROC FAR
PUSH DX
PUSH AX
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
INT 21H
POP AX
POP DX
RET
CRLF ENDP
;subfuction GERONERESULT
;獲取一個菲波那契數子程序
GETONERESULT PROC FAR
PUSH DX
PUSH AX
PUSH CX
;把RESULT地址放在BX中
LEA BX,RESULT
;把一個菲波那契數轉換位10進制準備輸出
GETRESULTLOOP:
MOV DX,0
MOV CX,10D
;除以10得余數,即低位
DIV CX
;地址+1
MOV [BX],DX
INC BX
CMP AX,0
JNZ GETRESULTLOOP
;輸出一個菲波那契數
CALL FAR PTR OUTPUTONE
;CX,AX,DX依次出棧
POP CX
POP AX
POP DX
RET
GETONERESULT ENDP
;subfuction GETRESULTS
;獲取結果子程序
GETRESULTS PROC FAR
;先得到最第一個菲波那契數
CALL FAR PTR GETONERESULT
;得到余下4個菲波那契數
MOV CX,04H
GETRESULTSROOP:
SUB DX,AX
XCHG DX,AX
CALL FAR PTR CRLF
CALL FAR PTR GETONERESULT
DEC CX
JNZ GETRESULTSROOP
RET
GETRESULTS ENDP
;subfuction OUTPUTON
;輸出一個菲波那契數的子程序
OUTPUTONE PROC FAR
MOV CX,5
;循環輸出一個數的5個位
;RESULT地址放在BX中
LEA BX,RESULT
ADD BX,4
;從高位開始輸出
OUTPUTONELOOP:
MOV DX,[BX]
ADD DX,30H
MOV AH,02H
INT 21H
DEC BX
;地址-1
DEC CX
JNZ OUTPUTONELOOP
RET
OUTPUTONE ENDP
;main
MAIN:
MOV AX,DATA
MOV DS,AX ;設置數據段
LEA DX, STR ;輸出提示符
MOV AH,09H
INT 21H
CALL FAR PTR INPUT ;調用輸入子程序
CALL FAR PTR CRLF ;調用回車換行子程序
LEA DX,STR2 ;輸出提示符
MOV AH,09H
INT 21H
CALL FAR PTR GETFIB ;計算菲波那契數
CALL FAR PTR GETRESULTS ;獲取菲波那契數
MOV AH,01H ;等待輸入一個字符結束
INT 21H
MOV AH,4CH ;調用DOS功能退出
INT 21H
CODE ENDS ;代碼段結束
END MAIN ;結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -