⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 n_time.asm

📁 汇编程序
💻 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 + -