主题:请那位大虾帮个忙看看哪里出了问题,我是汇编初学者,谢谢,急!!!关于fibonacci函数的
;****************************************************
stack SEGMENT
DW 100 DUP(?)
tos LABEL WORD
stack ENDS
;***************************************************
data SEGMENT
temp DW 0
result DW 0
mess1 DB 'input: $'
mess2 DB 'output: $'
data ENDS
;***************************************************
code SEGMENT
;******************************************************
main PROC FAR
ASSUME CS:code,DS:data,SS:stack
MOV AX,stack
MOV SS,AX
MOV SP,OFFSET tos
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,data
MOV DS,AX
repeat:
CALL input
CALL fib
CALL output
CALL crlf
JMP repeat
RET
main ENDP
;*******************************************************
input PROC NEAR
LEA DX,mess1
MOV AH,09
INT 21h
MOV BX,0
newchar:
MOV AH,1
INT 21h
SUB AL,30h
JL exit
CMP AL,9d
JG exit
CBW
XCHG AX,BX
MOV CX,10d
MUL CX
XCHG AX,BX
ADD BX,AX
JMP newchar
exit:RET
input ENDP
;*******************************************************
output PROC NEAR
LEA DX,mess2
MOV AH,09
INT 21h
MOV BX,result
CALL binidec
CALL crlf
RET
output ENDP
;*********************************************************
fib PROC NEAR
CMP BX,1d
JE f10
CMP BX,2d
JE f10
CALL save
DEC BX
CALL fib
CALL save
CALL restor
MOV AX,result
MOV temp,AX
DEC BX
CALL fib
MOV AX,result
ADD temp,AX
CALL restor
MOV AX,temp
MOV result,AX
JMP return
f10: MOV result,1d
return: RET
fib ENDP
;********************************************************
save PROC NEAR
POP BP
PUSH BX
PUSH result
PUSH BP
RET
save ENDP
;*********************************************************
restor PROC NEAR
POP BP
POP result
POP BX
PUSH BP
RET
restor ENDP
;********************************************************
binidec PROC NEAR
PUSH BX
PUSH CX
MOV CX,100d ;divide by 100
CALL dec_div
MOV CX,10d
CALL dec_div
MOV CX,1d
CALL dec_div
POP CX
POP BX
RET
binidec ENDP
;************************************************************
dec_div PROC NEAR
MOV AX,BX
MOV DX,0
DIV CX
MOV BX,DX
MOV DL,AL
ADD DL,30h
MOV AH,02h
INT 21h
RET
dec_div ENDP
;************************************************************
crlf PROC NEAR
MOV DL,0ah
MOV AH,02h
INT 21h
MOV DL,0dh
MOV AH,02h
INT 21h
RET
crlf ENDP
;*****************************************************************
code ENDS
;****************************************************************
END main
stack SEGMENT
DW 100 DUP(?)
tos LABEL WORD
stack ENDS
;***************************************************
data SEGMENT
temp DW 0
result DW 0
mess1 DB 'input: $'
mess2 DB 'output: $'
data ENDS
;***************************************************
code SEGMENT
;******************************************************
main PROC FAR
ASSUME CS:code,DS:data,SS:stack
MOV AX,stack
MOV SS,AX
MOV SP,OFFSET tos
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,data
MOV DS,AX
repeat:
CALL input
CALL fib
CALL output
CALL crlf
JMP repeat
RET
main ENDP
;*******************************************************
input PROC NEAR
LEA DX,mess1
MOV AH,09
INT 21h
MOV BX,0
newchar:
MOV AH,1
INT 21h
SUB AL,30h
JL exit
CMP AL,9d
JG exit
CBW
XCHG AX,BX
MOV CX,10d
MUL CX
XCHG AX,BX
ADD BX,AX
JMP newchar
exit:RET
input ENDP
;*******************************************************
output PROC NEAR
LEA DX,mess2
MOV AH,09
INT 21h
MOV BX,result
CALL binidec
CALL crlf
RET
output ENDP
;*********************************************************
fib PROC NEAR
CMP BX,1d
JE f10
CMP BX,2d
JE f10
CALL save
DEC BX
CALL fib
CALL save
CALL restor
MOV AX,result
MOV temp,AX
DEC BX
CALL fib
MOV AX,result
ADD temp,AX
CALL restor
MOV AX,temp
MOV result,AX
JMP return
f10: MOV result,1d
return: RET
fib ENDP
;********************************************************
save PROC NEAR
POP BP
PUSH BX
PUSH result
PUSH BP
RET
save ENDP
;*********************************************************
restor PROC NEAR
POP BP
POP result
POP BX
PUSH BP
RET
restor ENDP
;********************************************************
binidec PROC NEAR
PUSH BX
PUSH CX
MOV CX,100d ;divide by 100
CALL dec_div
MOV CX,10d
CALL dec_div
MOV CX,1d
CALL dec_div
POP CX
POP BX
RET
binidec ENDP
;************************************************************
dec_div PROC NEAR
MOV AX,BX
MOV DX,0
DIV CX
MOV BX,DX
MOV DL,AL
ADD DL,30h
MOV AH,02h
INT 21h
RET
dec_div ENDP
;************************************************************
crlf PROC NEAR
MOV DL,0ah
MOV AH,02h
INT 21h
MOV DL,0dh
MOV AH,02h
INT 21h
RET
crlf ENDP
;*****************************************************************
code ENDS
;****************************************************************
END main