📄 n!.asm
字号:
stack segment para stack 'stack'
top db 150 dup(?)
stack ends
data segment
buff db 100 dup(?)
order dw 10000,1000,100,10,1
data ends
code segment
assume cs:code,ds:data
inputc proc near
;入口参数:无
;功能:从键盘读入一个字母
;出口参数:DL中为键盘输入字的ASCII码值
push ax
mov ah,01h
int 21h
mov dx,0
mov dl,al
pop ax
ret
inputc endp
input proc near
;入口参数:无
;功能:从键盘读入数字n
;出口参数:BX中为读入的数字n
push ax
push cx
mov ax,0
loop1: call inputc
cmp dl,30h
jb exit2
cmp dl,39h
ja exit2
sub dl,30h
mov bx,0
mov bl,dl
mov cl,10
mul cl
add ax,bx
jmp loop1
exit2: mov bx,ax
pop cx
pop ax
ret
input endp
bin2dec proc far
;入口参数:DX存放要输出的数字
;功能:输出5位十进制数
;出口参数:无
push cx
push bx
mov cx,5
mov bx,0
lea si,order
loop3: sub dx,[si]
jb loop4
inc bl;存放某位数字
jmp loop3
loop4: add dx,[si]
cmp bl,0
je loop7
loop5: push dx
mov dl,bl
or dl,30h
mov ah,2
int 21h
pop dx
mov bh,1;标志是否已经有数字输出
jmp loop8
loop7: cmp bh,1
je loop5
loop8: add si,2
mov bl,0
loop loop3
cmp bh,0
jne loop9;为0时输出0
mov dl,'0'
mov ah,2
int 21h
loop9: pop bx
pop cx
ret
bin2dec endp
lfcr proc near
;入口参数:无
;功能:另起一行,从头输出
;出口参数:无
push ax
push dx
mov ah,02h
mov dl,0ah
int 21h
mov dl,0dh
int 21h
pop dx
pop ax
ret
lfcr endp
fact proc near
;入口参数:BX中存着n
;功能:实现阶乘
;出口参数:BX中存放结果
push ax
push cx
mov ax,1
mov cx,bx
l1: mul cx
loop l1
mov bx,ax
pop cx
pop ax
ret
fact endp
main proc near
;入口参数:无
;功能:做n阶乘(最大做到8)
;出口参数:无
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
call input
call lfcr
call fact
mov dx,bx
call bin2dec
mov ah,4ch
int 21h
main endp
code ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -