📄 jiecheng.asm
字号:
;??,????7??????,????
;version 1.0
DATA SEGMENT
Nin DB 13, 10, 13, 10, 'please input: N(0<n<12)= ', '$'
Nerror DB 13, 10, 13, 10, 'Sorry, Not valuable, please check it.', 13, 10, '$'
Nout DB 13, 10, 13, 10, 'result is : N! = ', '$'
CON DB 13, 10, 13, 10, 13, 10, 'continue?(y or n): ', '$'
ENDPR DB 13, 10, 13, 10, 13, 10, 'thanks, program end normally.', '$'
strn DB 6, 0 , 12 DUP(?)
strout DB 12 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;main PROC
START: MOV AX, DATA
MOV DS, AX
;input n
LEA DX, Nin
CALL puts
LEA DX, strn
CALL gets
;calc n
LEA SI, strn + 2
CALL atou16
;calc n!
CALL fact
;output
LEA SI, strout
CALL u16toa
LEA DX, Nout
CALL puts
LEA DX, strout
CALL puts
ENDPRG:
LEA DX, CON
CALL puts
;LEA DX, strn
MOV AH, 1
INT 21h
CMP AL, 'y'
JE START
CMP AL, 'Y'
JE START
LEA DX, ENDPR
CALL puts
MOV AH, 4ch
INT 21h
;main ENDP
gets PROC
PUSH AX
MOV AH, 10
INT 21h
POP AX
RET
gets ENDP
puts PROC
PUSH AX
MOV AH, 9
INT 21h
POP AX
RET
puts ENDP
atou16 PROC
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV AX, 0
MOV DL, [SI]
CMP DL, '0'
JB ERROR
CMP DL, '9'
JG ERROR
next: MOV DL, [SI]
CMP DL, '0'
JB done
CMP DL, '9'
JG done
SHL AX, 1
MOV BX, AX
MOV CL, 2
SHL AX, CL
ADD AX, BX
AND DX, 0fh
ADD AX, DX
INC SI
JMP next
done: CMP AX, 12
JG ERROR
CMP AX, 0
JB ERROR
JMP RIGHT
ERROR:
LEA DX, Nerror
MOV AH, 9
INT 21H
JMP ENDPRG
RIGHT:
POP SI
POP DX
POP CX
POP BX
RET
atou16 ENDP
fact PROC
CMP AX, 0
JNE iia
MOV AX, 1
MOV DX, 0
RET
iia: PUSH AX
DEC AX
CALL fact
x2: POP CX
;MUL CX
;PUSH DX
PUSH AX
MOV AX,DX
MUL CX
;MOV CX, 65535
;MUL CX
MOV BX,AX
POP AX
;POP CX
;ADD AX,CX
MUL CX
ADD DX,BX
x3: RET
fact ENDP
u16toa PROC
PUSH AX
PUSH BX
PUSH DX
PUSH SI
MOV BX, 10000
DIV BX
PUSH DX
;MOV AH, 9
;INT 21h
MOV CS:Flag, 0
MOV BX, 10000
next2: MOV DL, 0
cont: CMP AX, BX
JB skip
SUB AX, BX
INC DL
JMP cont
skip: CMP CS:Flag, 0
JNE store
CMP DL, 0
JZ jump
MOV CS:Flag, 1
store: OR DL, 30h
MOV [SI], DL
INC SI
jump: XCHG AX, BX
CWD
DIV CS:Radix
XCHG AX, BX
CMP BX, 1
JNE next2
CMP CS:Flag, 0
JNE stlast
CMP AL, 0
JZ o2
MOV CS:Flag, 1
stlast: OR AL, 30h
MOV [SI], AL
INC SI
o2:
POP AX
MOV BX, 1000
next3: MOV DL, 0
cont3: CMP AX, BX
JB skip3
SUB AX, BX
INC DL
JMP cont3
skip3: CMP CS:Flag, 0
JNE store3
CMP DL, 0
JZ jump3
MOV CS:Flag, 1
store3: OR DL, 30h
MOV [SI], DL
INC SI
jump3: XCHG AX, BX
CWD
DIV CS:Radix
XCHG AX, BX
CMP BX, 1
JNE next3
OR AL, 30h
MOV [SI], AL
MOV BYTE PTR 1[SI], '$'
POP SI
POP DX
POP BX
POP AX
RET
Radix DW 10
Flag DB 0
u16toa ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -