21,458
社区成员
发帖
与我相关
我的任务
分享
fact proc
push dx
mov dx,ax
cmp ax,0
jz done
dec ax
call fact
mul dx
pop dx
ret
done: mov ax,1
pop dx
ret
fact endp
.MODEL SMALL
.STACK 1024H
CR=0DH
LF=0AH
.DATA
INMES DB 'INPUT N : ','$'
CHRERR DB CR,LF,'0..9 EXPECTED.',CR,LF,'$'
RNGERR DB CR,LF,'RANGE CHECK ERROR .','$'
OUTMES DB CR,LF,'FACT= ','$'
HLTMES DB CR,LF,'PRESS ANY KEY TO HALT .','$'
BUFSIZE=6
BUF DB BUFSIZE
DB 0
DB BUFSIZE DUP(0)
N DW 0
Y DW 0
BASE DW 10
.CODE
_MAIN PROC NEAR
START:NOP
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
CALL READ
MOV CX,N
CALL FACT
MOV Y,AX
CALL WRITE
MOV AX,4C00H
INT 21H
_MAIN ENDP
READ PROC NEAR
RE1:LEA DX,INMES
CALL DISPMES
LEA DX,BUF
MOV AH,0AH
INT 21H
CALL ATOD
JC RE1
MOV N,AX
RET
READ ENDP
FACT PROC NEAR
PUSH CX
TEST CX,CX
JZ F1
DEC CX
TEST CX,CX
JZ F1
CALL FACT
POP CX
MUL CX
TEST DX,DX
JZ F2
LEA DX,RNGERR
CALL DISPMES
CALL HALT
JMP SHORT F2
F1:POP CX
MOV AX,1
F2:RET
FACT ENDP
WRITE PROC NEAR
LEA DX,OUTMES
CALL DISPMES
MOV AX,Y
CALL DTOA
LEA DX,BUF[2]
CALL DISPMES
RET
WRITE ENDP
ATOD PROC NEAR
PUSH SI
XOR AX,AX
XOR DX,DX
XOR BX,BX
XOR CH,CH
MOV CL,BUF[1]
LEA SI,BUF[2]
AT1:MUL BASE
TEST DX,DX
JZ AT2
LEA DX,RNGERR
CALL DISPMES
JMP SHORT AT9
AT2:MOV BL,[SI]
CMP BL,'0'
JB AT3
CMP BL,'9'
JA AT3
JMP SHORT AT4
AT3:LEA DX,CHRERR
CALL DISPMES
JMP SHORT AT9
AT4:SUB BL,'0'
ADD AX,BX
JNO AT5
LEA DX,RNGERR
CALL DISPMES
JMP SHORT AT9
AT5:INC SI
LOOP AT1
CLC
JMP SHORT AT8
AT9:STC
AT8:POP SI
RET
ATOD ENDP
DTOA PROC NEAR
PUSH SI
PUSH DI
XOR CX,CX
LEA DI,BUF[2+BUFSIZE-1]
MOV WORD PTR [DI],'$'
DEC DI
DT1:XOR DX,DX
DIV BASE
ADD DL,'0'
MOV [DI],DL
DEC DI
INC CX
TEST AX,AX
JNZ DT1
MOV SI,DI
INC SI
LEA DI,BUF[2]
CLD
REP MOVSB
MOV BYTE PTR [DI],'$'
POP DI
POP SI
RET
DTOA ENDP
DISPMES PROC NEAR
PUSH AX
MOV AH,9
INT 21H
POP AX
RET
DISPMES ENDP
HALT PROC NEAR
LEA DX,HLTMES
CALL DISPMES
MOV AH,1
INT 21H
MOV AX,4C00H
INT 21H
HALT ENDP
END START