Much better off, as Rbraz says, to use 'es' segment to point at the screen. Right now, your variables are being stored in the first few pixels of the screen!
Second, 320x200 means that bytes (db) aren't going to be big enough to hold all the x and y positions. Much better to make them words (dw). I can't believe fasm lets you write mov bx,[ x] when x is only a byte without warning you that you've done something silly.
Third, try using suboutines instead of jumping around. ie. use 'jsr' to call the functions instead of 'jmp' and use 'ret' to go back to the instruction after the 'jsr'. Define proper interfaces to these functions, for example always use ax to return a result, always use si to pass an address, cx for a count. 'Push' and 'pop' any other registers you use, to avoid corrupting things in the main loop. Document these parameters. It might not be important for this little program, but if you ever do anything more complex you won't regret it.
Keep at it!

Jim
<edit>ez-code got the better of my example