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