Thanks for the help. I was even able to understand how to lighten the program up. Check some of this out, you'll see what I mean:
.model small
.stack 100h
.data
Prompt db 10, 13, 'Enter a number 1-8: $'
msg2 db 10, 10, 13, 'Factorial is: $'
msg db 10, 10, 13, 'That is a zero fool. Try again. Enter a number 1-8: $'
msg3 db 10, 10, 13, 'Typing a nine will just get you a dirty messge.',10, 13, 'Try again,this time, try to remember what numbers are between 1-8: $'
.code
fact proc
mov ax, @data
mov ds,ax
mov dx,offset prompt
mov ah,9h
int 21h
mov ah, 01h; get character input
int 21h
mov ah, 0
sub ax, 30h; make it a number from ASCII char
push ax
comp:
cmp al, 1
jb do_over; jump if below 1
cmp al, 8
jg do_over2; jump if greater than 8
jmp cont
do_over2:
mov ax, 0
mov dx, offset msg3
mov ah,9h
int 21h
jmp Get_input
do_over:
mov ax, 0
mov dx, offset msg
mov ah,9h
int 21h
Get_input:
mov ah, 01h
int 21h
mov ah,0
sub ax, 30h
push ax
jmp comp
cont:
mov ah, 9h
mov dx, offset msg2
int 21h
call facto; factorial proc
call div10; proc to create the base 10
mov ah,4ch;send return to dos code
int 21h
fact endp
facto proc
pop bx; pop from stack
pop ax; pop from stack
push bx; push back onto stack
cmp ax,1; compare ax to 1
je lonley
push ax; onto stack
dec ax; simply decrease ax by 1
push ax; onto stack, decreased by 1
call facto; back to top of proc
pop bx; from stack
mul bx; multiply
lonley:
ret; to main next proc div10
Facto endp
div10 proc
mov cx,0
divi10:
mov dx, 0
mov bx, 10
div bx
push dx
add cx, 1
cmp ax, 0
jg divi10
disp10:
pop dx
add dl, 30h
mov ah, 02h
int 21h
loop disp10
ret; return after the call
div10 endp
end fact