参考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