翔箭中国

jink2005学习专栏——我,一直努力着!【http://www.aiseminar.cn, http://jink2005.adyouth.com, http://jink2005.blog.so...

[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

阅读更多
文章标签: input 语言 汇编
想对作者说点什么? 我来说一句

Masm for Windows 集成实验环境V2015

2015年03月06日 15.51MB 下载

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭