В универе лаботарорку задали, нарисовать график. При подсчёте использовать со-процессор для вычислений.
Программу я написал, но есть одна проблема.
У меня вылетает с ошибкой в файле 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
***************************************************************
Кто может, помогите найти ошибку.
прога вылетает на месте, где я ставлю первый пиксель. Может я с прерыванием что-то напутал? или не так перешёл в видео режим?