关闭

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

1758人阅读 评论(1) 收藏 举报

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14764次
    • 积分:231
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:8条
    文章分类
    文章存档
    最新评论
    博客友链