;实验六:计算N!的实验
;目 的:通过编制一个阶乘计算程序,了解高级语言中
; 数学函数是怎样在汇编语言一级实现的。
;内 容:编写计算N!的程序,数值N由键盘键入,N!的范围
; 为:0 ~ 65535,即刚好被一个16为寄存器容纳。
data segment
mess0 db 0dh, 0ah,'====expriment of compute N!====','$'
mess1 db 0dh, 0ah, 'please input the number N (N:0~9, ex:8): $'
mess2 db 0dh, 0ah, 'the result of N! is: $'
errMess db 0dh, 0ah,'----error input!----$'
data ends
code segment
main proc far
assume ds:data, cs:code
start:
push ds
mov ax, data ;设置数据段
mov ds, ax
xor ax, ax
push ax
;init
mov dx, 0
mov bx, 0 ;用于接收结果
;show message
mov ah, 09h
lea dx, mess0
int 21h
lea dx, mess1
int 21h
;键盘输入n的值
mov ah, 01h
int 21h
;合法性检查
cmp al, '0'
jl error
cmp al, '9'
jg error
sub al, '0'
call fact ;调用函数计算N!
mov bx, dx
mov ah, 09h
lea dx, mess2
int 21h
call show ;吊用函数显示N!
mov ah, 02
mov dl, 'H'
int 21h
jmp exit
error:
mov ah, 09h
lea dx, errMess
int 21h
exit: ret
main endp
;计算N!的子程序
fact proc
cmp al, 0
jnz multN
mov dl, 1
ret
multN: push ax ;利用栈保存上层的N值
dec al
call fact ;递归,计算(N-1)!
pop ax ;将上层N值取出
mul dl ;dl中存放的是相乘的结果
mov dx, ax
ret
fact endp
;以16进制形式显示结果
show proc
mov ch, 04h
mov cl, 04h
mov ah, 02h
showN: rol bx, cl
mov dl, bl
and dl, 0fh
add dl, '0'
cmp dl, '9'
jl print ;是数字则直接显示
add dl, 7h ;是大于9的数时转化为字母
print: int 21h
dec ch
jnz showN
ret
show endp
code ends
end start