标题用汇编语言递归方法计算8以内的阶乘斜体样式
方法一
.MODEL SMALL
.DATA
STRING1 DB 'PLEASE INTPUT THE NMBER(0~8):$'; 请输入n
STRING2 DB 'THE RESULT:$'; 这个结果是
.CODE
main proc far
MOV AX,@DATA; 为数据块加地址
MOV DS,AX
LEA DX,STRING1; 输出第一句话
MOV AH,09H
INT 21H
call decibin; 开始读入n
mov ax,1
call fact; 开始计算n的阶乘
MOV BX,AX
LEA DX,STRING2; 输出第二句话
MOV AH,09H
INT 21H
MOV AX,BX
call output; 输出结果n!
main endp
;------------------------------
; 开始读入一个数(0~8)
decibin proc near
mov bx,0
newchar:
mov ah,1
int 21h
sub al,30h; 小于0
jl exit
cmp al,9; 大于9
jg exit
cbw; al->ax
xchg ax,bx
mov cx,10
mul cx; ax*10
xchg ax,bx
add bx,ax
jmp newchar
exit:
ret
decibin endp
;-------------------
;开始计算阶乘
fact proc near
cmp bx,1
je fact1
push bx
dec bx
call fact
pop bx
mul bx; ax=ax*bx,所以前面初始化ax为1
fact1:
ret
fact endp
;--------------------------
;开始输出结果
output proc near
OUTPUT5:
MOV DX,0
MOV BX,10
DIV BX
ADD DX,30H
PUSH DX ; 依次压结果中的个、十、百、、、、位入栈
INC SI
CWD
CMP AX,0
JZ OUTPUT4
JMP OUTPUT5
OUTPUT4:
POP AX; 依次出结果中的最高位->最低位出栈
DEC SI
MOV DL,AL ; 依次输出结果中的最高位->最低位出栈
MOV AH,02H
INT 21H
CMP SI,0
JNZ OUTPUT4
output endp
ENDING:
MOV AX,4C00H; 终止程序
INT 21H
END
`
方法二
.MODEL SMALL
.DATA
STRING1 DB 'PLEASE INTPUT THE NMBER(0~8):$';
STRING2 DB 'THE RESULT:$';
.CODE
main proc far
MOV AX,@DATA
MOV DS,AX
LEA DX,STRING1
MOV AH,09H
INT 21H
call decibin;
PUSH bx
call fact;
pop ax ; 出栈结果
call output;
main endp
;------------------------------
; 开始读入一个数(0~8)
decibin proc near
mov bx,0
newchar:
mov ah,1
int 21h
sub al,30h
jl exit
cmp al,9
jg exit
cbw
xchg ax,bx
mov cx,10
mul cx
xchg ax,bx
add bx,ax
jmp newchar
exit:
ret
decibin endp
;-------------------
;开始计算阶乘
fact proc near
push ax
push bp
mov bp, sp
mov ax, [bp+6]
cmp ax, 0
jne fact1
inc ax
jmp exit
fact1: dec ax
push ax
call fact
pop ax
mul word ptr[bp+6] ; ax=ax*bp加6位置上的数
exit: mov [bp+6], ax
pop bp
pop ax
ret
fact endp
;--------------------------
;开始输出结果
output proc near
OUTPUT5:
MOV DX,0
MOV BX,10
DIV BX
ADD DX,30H
PUSH DX ;
INC SI
CWD
CMP AX,0
JZ OUTPUT4
JMP OUTPUT5
OUTPUT4:
POP AX
DEC SI
MOV DL,AL
MOV AH,02H
INT 21H
CMP SI,0
JNZ OUTPUT4
output endp
ENDING:
MOV AX,4C00H; 终止程序
INT 21H
END