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

📄 n!.asm

📁 用汇编语言写的
💻 ASM
字号:
DATA SEGMENT
N DB 6
  DB ?
  DB 6 DUP(?)
COUNT = $ - N -2		
N_BIN DW ?
MESSAGE DB 10,13,'N!='
RESULT_ASC DB 5 DUP(?)	;存放结果的ASCII码
FLAG DB '$'
INPUT DB 'INPUT N = ','$'
PWTAB DW 10000,1000,100,10,1
RESULT DW ?				;存放结果的二进制值

DATA ENDS
MAIN SEGMENT
	ASSUME DS:DATA,CS:MAIN

BEGIN:
	;寄存器赋初值
	
  	MOV AX,DATA   	
  	MOV DS,AX

	MOV DX,OFFSET INPUT
	MOV AH,09
	INT 21H                   ;键盘中断输入N
	MOV DX,OFFSET N
	MOV AH,10
	INT 21H

	;调用ATOB函数,将A转换成二进制存入N_BIN
	MOV AX,COUNT
	PUSH AX		;参数1
	MOV AX,2+OFFSET N
	PUSH AX		;参数2
	CALL ATOB	;调用ASCII码向二进制转换的子程序,N_BIN为A的二进制值

	CALL FACT	;调用阶乘子程序

	
	CALL BTOA

	MOV DX,OFFSET MESSAGE	;输出结果
	MOV AH,09
	INT 21H

EXIT:	MOV AH,4CH	
	INT 21H		;退出       
MAIN ENDS
;子程序,将输入的ASCII码转换成二进制存入BIN
PROCE SEGMENT
	ASSUME CS:PROCE,DS:DATA
ATOB	PROC FAR
	PUSH AX		;保存现场
	PUSH BX
	PUSH CX
	PUSH BP
	MOV BP,SP
	PUSHF		
	
	MOV AX,DATA
	MOV DS,AX
	MOV SI,[BP+12]	;OFFSET BUF_A,OFFSET BUF_B
	MOV CX,[BP+14]
	XOR AX,AX
AGAIN:	ADD AX,AX
	MOV BX,AX
	ADD AX,AX
	ADD AX,AX
	ADD AX,BX
	MOV BH,0
	MOV BL,[SI]
	SUB BL,30H
	ADD AX,BX
	INC SI
	CMP [SI],0DH	;回车结束
	JLE RETURN
	LOOP AGAIN
RETURN:	MOV N_BIN,AX	;存数
	POPF		;恢复现场
	POP BP
	POP CX
	POP BX
	POP AX
	RET 4
ATOB	ENDP
PROCE 	ENDS
;子程序,计算N的阶乘
PROCE SEGMENT
	ASSUME CS:PROCE,DS:DATA
FACT	PROC FAR
	PUSH AX		;保存现场
	PUSH BX
	PUSH CX
	PUSH BP
	MOV BP,SP
	PUSHF

	MOV AX,DATA
	MOV DS,AX
	MOV CX,N_BIN
	MOV AX,1
	CMP CX,0	;0!
	JE RETURN1
MULT:	MUL CX
	DEC CX
	CMP CX,0B
	JG MULT
RETURN1:MOV RESULT,AX	;存数
	POPF		;恢复现场
	POP BP
	POP CX
	POP BX
	POP AX
	RET
FACT	ENDP
PROCE 	ENDS
;子程序,将二进制转换成十进制的ASCII码
PROCE SEGMENT
	ASSUME CS:PROCE,DS:DATA
BTOA	PROC FAR
	PUSH AX		;保存现场
	PUSH BX
	PUSH CX
	PUSH BP
	MOV BP,SP
	PUSHF		
	
	MOV AX,DATA
	MOV DS,AX
	MOV DI,OFFSET RESULT_ASC
	MOV SI,OFFSET PWTAB
	MOV AX,RESULT
LOP1:	XOR CL,CL
	MOV BX,[SI]
LOP2:	SUB AX,BX
	JB NEXT
	INC CL
	JMP LOP2
NEXT:	ADD AX,BX
	ADD CL,30H
	MOV [DI],CL
	INC SI
	INC SI
	INC DI
	CMP BX,1
	JNZ LOP1

	POPF		;恢复现场
	POP BP
	POP CX
	POP BX
	POP AX
	RET 4

BTOA 	ENDP
PROCE 	ENDS

END BEGIN
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -