1. 程式人生 > >彙編-遞迴求n!

彙編-遞迴求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