📄 n_time.asm
字号:
;FILENAME:
;内容:计算N阶乘 N!
CRLF MACRO ;回车,换行
MOV AH, 02H
MOV DL, 0DH
INT 21H
MOV AH, 02H
MOV DL, 0AH
INT 21H
ENDM
DATA SEGMENT
MESS1 DB 'INPUT THE NUMBER ACCORDING TO HEXNUM!',0DH,0AH,'$'
MESS2 DB 'THE RESULT IS: $'
ERROR DB 'INPUT ERROR! INPUT ONCE MORE!',0DH ,0AH,'$'
LEN DW 1
CY DW ?
BUF DW 256 DUP(0)
DATA ENDS
STACK SEGMENT STACK 'STACK'
DW 32 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS: CODE, DS:DATA, ES:DATA, SS:STACK
START: MOV AX, DATA
MOV DS,AX
MOV ES, AX
MOV AH, 09H
MOV DX,OFFSET MESS1
INT 21H ;显示输入提示信息
CALL GETNUM ;读取键入的N值
MOV BP, DX ;N值送BP
CMP BP, 0
JZ EEE
CMP BP, 1
JZ EEE ;N=0或N=1则转EEE
MOV SI, OFFSET BUF ;缓冲区首址
MOV [SI],DX ;缓冲区初始化为值N
XXX: DEC BP ;N值减1
CMP BP,0001H
JZ LLL ;若为1则转LLL
XOR BX,BX ;偏移指针清0
MOV WORD PTR CY,0 ;进位单元清0
MOV CX,LEN ;当前结果长度送CX
TTT: MOV AX, [SI+BX]
MUL BP ;相乘
ADD AX,CY ;加低位进位
JNC JJJ ;结果无进位转JJJ
INC DX ;有进位将高位单元加1
JJJ: MOV [SI+BX],AX ;结果送缓冲区中
MOV CY,DX ;高位单元送进位单元
INC BX
INC BX ;一个字长度
LOOP TTT ;循环
CMP DX, 0000H
JZ BBB ;最后1次的进位为0则转BBB
INC WORD PTR LEN ;长度加1
MOV [SI+BX],DX ;进位送缓冲区中
BBB: JMP XXX
EEE: MOV SI,OFFSET BUF
MOV WORD PTR [SI],1 ;结果为1
LLL: MOV AH, 09H
MOV DX,OFFSET MESS2
INT 21H ;显示表头
MOV CX,LEN
MOV BX,CX ;长度
DEC BX
SHL BX,1 ;1个字为两个字节
CCC: MOV AX, [SI+BX]
CALL DISP
DEC BX
DEC BX ;显示结果
LOOP CCC
MOV AX,4C00H ;结束
INT 21H
DISP1 PROC NEAR ;显示字符(AL)
MOV BL, AL
MOV DL, BL
MOV CL, 04
ROL DL, CL
AND DL, 0FH
CALL DISPL ;显示高位
MOV DL, BL
AND DL, 0FH
CALL DISPL ;显示低位
RET
DISP1 ENDP
DISPL PROC NEAR ;显示一位(DL=0XH)
ADD DL, 30H
CMP DL, 3AH
JB DDD
ADD DL, 27H
DDD: MOV AH, 02H
INT 21H
RET
DISPL ENDP
DISP PROC NEAR ;显示4位数(HEX)
PUSH BX
PUSH CX
PUSH DX
PUSH AX
MOV AL, AH
CALL DISP1
POP AX
CALL DISP1
POP DX
POP CX
POP BX
RET
DISP ENDP
GETNUM PROC NEAR ;字符匹配程序
PUSH CX
REGET: XOR DX, DX
GGG: MOV AH, 01H
INT 21H
CMP AL, 0DH
JZ PPP
CMP AL, 20H
JZ PPP
SUB AL, 30H
JB KKK
CMP AL, 0AH
JB GETS
CMP AL,11H
JB KKK
SUB AL, 07H
CMP AL, 0FH
JBE GETS
CMP AL, 2AH
JB KKK
CMP AL, 2FH
JA KKK
SUB AL, 20H
GETS: MOV CL, 04H
SHL DX,CL
XOR AH, AH
ADD DX ,AX
JMP GGG
KKK: CRLF
MOV AH, 09H
MOV DX,OFFSET ERROR
INT 21H
JMP REGET
PPP: PUSH DX
CRLF
POP DX
POP CX
RET
GETNUM ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -