汇编-递归求n!

参考https://blog.csdn.net/baidu_33836580/article/details/50578877

递归计算8!(40320<2^16)
;汇编程序中main是用户自定义标识符,可有可无
;start是程序起始入口点,start 和end start相对应,控制程序开始结束
;自定义符号
DOS EQU 21H
IN EQU 1H
OUTW EQU 2H
OUTS EQU 9H

DATA SEGMENT
	INPUT DB "Input a number (0~8):$ "
	OUTPUT DB " result is : $"
DATA ENDS

STACK SEGMENT 
	DB 256 DUP(?)
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK

START:
 	MOV AX,DATA
	MOV DS,AX
	LEA DX,INPUT
	MOV AH,OUTS
	INT DOS
	MOV AH,IN
	INT DOS
	CMP AL,'0'
	JB EXIT
	CMP AL,'8'
	JA EXIT

	SUB AL,'0'
	MOV AH,0
	CMP AX,1
	JA SHOW	;是0,1输出1
	
	MOV DX,31H
	MOV AH,OUTS
	INT DOS
	JMP EXIT

SHOW:
	MOV CX,AX
	MOV AX,1
	CALL FAC
	;十进制输出结果(最大40230>2^8)
	
	MOV CX,0
	MOV BX,10
INSTACK:
	MOV DX,0
	DIV BX
	PUSH DX
	INC CX
	CMP AX,0
	JNE INSTACK
	
OUTSTACK:
	
	POP DX
	ADD DL,30H
	MOV AH,OUTW
	INT DOS		;??这样输出字符会不会原位置覆盖??
	DEC CX
LOOP OUTSTACK

EXIT:
	MOV AH,4CH
	INT DOS

	
FAC PROC NEAR
	DEC CX	;CX中存每次递归乘数
	CMP CX,1
	JE FAC_EXIT
	PUSH CX
	CALL FAC		;递归部分
	POP CX
	MUL CX		;结果存在AX中
FAC_EXIT:
	RET
FAC ENDP

CODE ENDS
END START

猜你喜欢

转载自blog.csdn.net/qq_43199109/article/details/84330663
今日推荐