В универе лаботарорку задали, нарисовать график. При подсчёте использовать со-процессор для вычислений. 
Программу я написал, но есть одна проблема. 
У меня вылетает с ошибкой в файле ntvdm.exe, то есть я убиваю ДОС  

Ниже задание, и мой код. 
*********************************************************************
*********************************************************************
Нарисовать параметрический график.
/ x(t) = Mx*sin(At)+Ox
\ y(t) = My*cos(Bt)+Oy 
параметр t меняется от 0 до 2пи шагом 0,001
коефициенты масштаба Mx,My,Ox,Oy выбираются в соответствии с видеорежимом.
Натуральные коефициенты A и B вводятся с клавиатуры.
*********************************************************************
ХОД РАБОТЫ:
0.   Подготовка: выбрать графический режим (прерывание 10h, функция 0) и вычислить целые коефиценты  Mx, My, Ox и Oy как половина размеров экрана (Mx = Ox = ШИРИНА / 2, My = Oy = ВЫСОТА / 2)
1.    в первых двух строчках разрешить использование i80386 процессора
   .386
   .MODEL use16 small
2.   Создать двухбайтовые переменные Mx, My, Ox, Oy с вычисленными значениями 
3.   Запросить с клавиатуры и переделать в целые числа A и B
4.   Переключить видеокарту в графический видеорежим (прерывание 10h, функция 0)
5.   Подготовить счётчик циклов Step = 0
6.   записать в "польской" записи формулу и вычислить с помощью сопроцессора значение X:
        X = Mx * sin(A * Step / 1000) + Ox
7.   Iзаписать в "польской" записи формулу и вычислить с помощью сопроцессора значение Y:
        Y = My * cos(B * Step / 1000) + Oy
8.   Нарисовать на экране точку с координатами X, Y (прерывание 10h, функция 0Ch)
9.   Увеличить счётчик цикла Step на 1, если Step меньше 6284 (2Пи * 1000), то перейти на пункт 6.
10.   Пауза до нажатия клавиши
11.   Переключить видеокарту в режим текста (прерывание 10h, функция 0)
*********************************************************************
Вот такое вот задание. 
вот мой горе-код.
.386
.MODEL use16 small
.STACK 200h
.DATA
        Mx dw ?
        My dw ?
        Ox dw ?
        Oy dw ?
         A dw ?
         B dw ?
         X dw ?
         Y dw ?
      Astr DB 6, ?, 5 dup (?)
      Bstr DB 6, ?, 5 dup (?)
      Step dw ? 
.CODE
ProgramStart:
       mov ax, @DATA
       mov DS, ax
;--------------------------------]
;2.	Создать двухбайтовые переменные Mx, My, Ox, Oy с вычисленными значениями
;--------------------------------] 
       mov Mx, 160
       mov My, 120
       mov Ox, 160
       mov Oy, 120
       
;--------------------------------------------------- 
              mov ah, 0fh                ; узнать видеорежим
              int 10h
              mov ah, 00h                ; установить видеорежим
              int 10h
;---------------------------------------------------
              mov ah, 0ah                ; запрос строки Astr
              mov dx, offset Astr
              int 21h
;--------------------------------------------------- 
              mov ah, 0fh                ; узнать видеорежим
              int 10h
              mov ah, 00h                ; установить видеорежим
              int 10h
;---------------------------------------------------
              mov ah, 0ah                ; запрос строки Bstr
              mov dx, offset Bstr
              int 21h
;--------------------------------------------------- 
              mov ah, 0fh                ; узнать видеорежим
              int 10h
              mov ah, 00h                ; установить видеорежим
              int 10h
;--------------------------------------------------- 
					 ; переводим число А из строки Astr
;---------------------------------------------------
        mov CL, Astr[1]  		 ;CL = кол-во символов
        mov AX, 0			         ;AX = 0
        mov SI, offset Astr[2]		 ;SI = адрес первого введённого символа
	
Frml1:	mov Bx, 10			 ; AX:=AX*10
        mul Bx
	
        mov BL, [SI]			 ;[SI]-'0'
        mov BH, 0
        sub BX, '0'
	
        add AX, BX			 ;Ax:=Ax*10+([SI]-'0')
        inc SI				 ;SI:=SI+1
        dec CL				 ;CL:=CL-1
	
        cmp CL,0			 ; if CL <>0 then goto Frml
        jne Frml1
        mov A, AX
;---------------------------------------------------
					 ; переводим число B из строки Bstr
;---------------------------------------------------
        mov CL, Bstr[1]  		 ;CL = кол-во символов
        mov AX, 0			         ;	AX = 0
        mov SI, offset Bstr[2]		 ;	SI = адрес первого введённого символа
	
Frml2:	mov Bx, 10			 ; AX:=AX*10
        mul Bx
	
        mov BL, [SI]			 ;[SI]-'0'
        mov BH, 0
        sub BX, '0'
	
        add AX, BX			 ;Ax:=Ax*10+([SI]-'0')
	
	
        inc SI				 ;SI:=SI+1
        dec CL				 ;CL:=CL-1
      
        cmp CL,0			 ; if CL <>0 then goto Frml
        jne Frml2
        mov B, AX
        
;---------------------------------------------------  
        mov ah, 0Fh
        Int 10h    ; узнать видеорежим
        mov ah, 13H 
        Int 10h    ; установить видеорежим в режим 640*480
;---------------------------------------------------  
;///////////////////////////////////////////////////	
;---------------------------------------------------
;                Подсчёты и цикл
;---------------------------------------------------
        mov step, 0
Draw:   
        fild A
        fild Step
        fmul
        mov B, 1000
        fild B
        fdiv
        fsin
        fild Mx
        fmul
        fild Ox
        fadd
        fist X
        
        fild B
        fild Step
        fmul
        mov A, 1000
        fild A
        fdiv
        fcos
        fild My
        fmul
        fild Oy
        fadd
        fist Y
; ставим точку
        mov AH, 0ch
        mov AL, 7
        mov BH, 0
        mov CX, X
        mov DX, Y
        int 10h
        
        inc Step
        cmp step, 6284
        jl  Draw
;--------------------------------------------------        
              xor ah, ah        ;пауза до нажатия клавиши
              int 16h
              mov ah, 4ch
              int 21h
;-------------------------------------------------- 
 
	mov ah, 0Fh
	Int 10h    ; узнать видеорежим
	mov ah, 00h 
	Int 10h    ; установить видеорежим текста 	
;--------------------------------------------------- 
END ProgramStart
***************************************************************
Кто может, помогите найти ошибку.
прога вылетает на месте, где я ставлю первый пиксель. Может я с прерыванием что-то напутал? или не так перешёл в видео режим?