[masm]实验六:计算N!的实验

;实验六:计算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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值