print macro msg
lea dx,msg
mov ah,09h
int 21h
endm
read macro n,j1,j2
mov cx,0ah
j1:mov ah,01h
int 21h
cmp al,0dh
je j2
sub al,30h
mov bl,al
mov ax,n
mul cx
xor bh,bh
add ax,bx
mov n,ax
jmp j1
j2 :nop
endm
.model small
.stack 100h
.data
msg1 db 10,13,'Enter n: $'
msg2 db 10,13,'Enter r: $'
msg3 db 'C$'
msg4 db ' = $'
err db 10,13,'Math Error. n should not be less than r $'
newline db 10,13,' $'
n dw 0
r dw 0
nfact dw 0
rfact dw 0
nminur dw 0
temp dw 0
.code
main proc
mov ax,@data
mov ds,ax
print msg1
;reading n
read n,jump1,jump2
print msg2
;reading n
read r,jump11,jump21
;find n!
mov ax,n
mov temp,ax
call fact
mov nfact,ax
;find r!
mov ax,r
mov temp,ax
call fact
mov rfact,ax
;find (n-r)!
mov ax,n
sub ax,r
jc error1
mov temp,ax
call fact
mov nminur,ax
;find n!/(r!*(n-r)!)
mov ax,rfact
mov bx,nminur
mul bx
mov bx,ax
mov ax,nfact
div bx
mov temp,ax
print newline
mov ax,n
call printmul
print msg3
mov ax,r
call printmul
print msg4
mov ax,temp
jump3:call printmul
jmp finish
error1:print err
finish:mov ah,4ch
int 21h
main endp
printmul proc
mov bx,000ah
xor cx,cx
;push into stack
l2:xor dx,dx
div bx
push dx
inc cx
cmp ax,0000h
jne l2
;pop from stack
l3:pop dx
add dl,30h
mov ah,02h
int 21h
loop l3
ret
printmul endp
fact proc
mov ax,01
loop1:cmp temp,00
je ju12
mul temp
dec temp
jmp loop1
ju12:ret
fact endp
end
No comments:
Post a Comment