somewhere писал(а):Формула, конечно, жесть)) Ох уж эти математики, вечно их тянет с виду простую интерпретацию превратить в трехэтажное унылое Г. Вообще, в полярных координатах, трехлистник выражается зависимостью R = sin(3A), где А - текущий угол в полярных координатах, а R - получаемый радиус. Теперь то понятно как рисовать?
во-вторых не указан микропроцессор, операционная система
.686()
если вы об этом.
ОС Windows
Искал в интернете инфу по поводу рисования.
Сделал по примеру,вывод спирали.Вот код (MASM)
[ASM]
.686 ; директива визначення типу мікропроцесора
.model flat,stdcall ; завдання лінійної моделі пам’яті
; та угоди ОС Windows
option casemap:none ; відмінність малих та великих літер
option casemap:none ; отличие строчных и прописных букв
include C:\masm32\include\windows.inc ; файлы структур, констант
include C:\masm32\include\kernel32.inc ; системные функции приложений
include C:\masm32\include\user32.inc ; файлы интерфейса
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
ExitProcess proto
WORD ; прототип процедури
OperDigs proto
WORD,
WORD,
WORD ; прототип процедури
.data ; директива визначення даних
delta dd 0.001 ;шаг
const3 dd 3.0
const200 dd 200.0
x dw 0 ;координаты точки
y dw 0
.code ; директива початку програми
start: mov ax,12h ;инициализация графического режима 640х480
int 10h
mov si,0C45h/2 ;количество итераций =Pi/0.001
mov ax,0C03h
finit ;инициализация сопроцессора
fldz ;alpha = 0
l1: fld st ;st(0)=alpha st(1)=alpha
fmul const3 ;st(0)=alpha*3 st(1)=alpha
fsin ;st(0)=sin(alpha*3) st(1)=alpha
fmul const200 ;st(0)=200*sin(alpha*3) st(1)=alpha
fxch st(1) ;st(0)=alpha st(1)=200*sin(alpha*3)
fld st ;st(0)=st(1)=alpha st(2)=200*sin(alpha*3)
fxch st(2) ;st(0)=200*sin(alpha*3) st(1)=alpha st(2)=alpha
fxch st(1) ;st(0)=alpha st(1)=200*sin(alpha*3) st(2)=alpha
fsincos ;st(0)=cos(alpha) st(1)=sin(alpha) st(2)=200*sin(alpha*3) st(3)=alpha
fmul st,st(2) ;st(0)=200*cos(alpha)*sin(alpha*3) st(1)=sin(alpha) st(2)=200*sin(alpha*3) st(3)=alpha
fistp x ;X=200*cos(alpha)*sin(alpha*3) st(0)=sin(alpha) st(1)=200*sin(alpha*3) st(2)=alpha
fmul ;st(0)=200*sin(alpha)*sin(alpha*3) st(1)=alpha
fistp y ;Y=200*sin(alpha)*sin(alpha*3) st(0)=alpha
mov cx,x
mov di,cx
neg di
add cx,320 ;координаты точки относительно центра экрана
mov dx,y
add dx,200
int 10h ;выводим зеленую точку
lea cx,[di+320]
int 10h ;выводим зеленую точку
fadd delta ;вычисляем новое значение alpha
dec si
jnz l1 ;цикл пока SI не равно нулю
mov ah,0 ;ожидание нажатия клавиши
int 16h
mov ax,3;перевод обратно в TextMode
int 10h
exit: int 20h ;стандартный выход
END start
[/ASM]
Но и тут не без греха,ошибка
"cannot use 16-bit register with a 32-bit address"
Не могу ее решить....
[quote="somewhere"]Формула, конечно, жесть)) Ох уж эти математики, вечно их тянет с виду простую интерпретацию превратить в трехэтажное унылое Г. Вообще, в полярных координатах, трехлистник выражается зависимостью R = sin(3A), где А - текущий угол в полярных координатах, а R - получаемый радиус. Теперь то понятно как рисовать?
во-вторых не указан микропроцессор, операционная система[/quote]
.686()
если вы об этом.
ОС Windows
Искал в интернете инфу по поводу рисования.
Сделал по примеру,вывод спирали.Вот код (MASM)
[ASM]
.686 ; директива визначення типу мікропроцесора
.model flat,stdcall ; завдання лінійної моделі пам’яті
; та угоди ОС Windows
option casemap:none ; відмінність малих та великих літер
option casemap:none ; отличие строчных и прописных букв
include C:\masm32\include\windows.inc ; файлы структур, констант
include C:\masm32\include\kernel32.inc ; системные функции приложений
include C:\masm32\include\user32.inc ; файлы интерфейса
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
ExitProcess proto :D WORD ; прототип процедури
OperDigs proto :D WORD, :D WORD, :D WORD ; прототип процедури
.data ; директива визначення даних
delta dd 0.001 ;шаг
const3 dd 3.0
const200 dd 200.0
x dw 0 ;координаты точки
y dw 0
.code ; директива початку програми
start: mov ax,12h ;инициализация графического режима 640х480
int 10h
mov si,0C45h/2 ;количество итераций =Pi/0.001
mov ax,0C03h
finit ;инициализация сопроцессора
fldz ;alpha = 0
l1: fld st ;st(0)=alpha st(1)=alpha
fmul const3 ;st(0)=alpha*3 st(1)=alpha
fsin ;st(0)=sin(alpha*3) st(1)=alpha
fmul const200 ;st(0)=200*sin(alpha*3) st(1)=alpha
fxch st(1) ;st(0)=alpha st(1)=200*sin(alpha*3)
fld st ;st(0)=st(1)=alpha st(2)=200*sin(alpha*3)
fxch st(2) ;st(0)=200*sin(alpha*3) st(1)=alpha st(2)=alpha
fxch st(1) ;st(0)=alpha st(1)=200*sin(alpha*3) st(2)=alpha
fsincos ;st(0)=cos(alpha) st(1)=sin(alpha) st(2)=200*sin(alpha*3) st(3)=alpha
fmul st,st(2) ;st(0)=200*cos(alpha)*sin(alpha*3) st(1)=sin(alpha) st(2)=200*sin(alpha*3) st(3)=alpha
fistp x ;X=200*cos(alpha)*sin(alpha*3) st(0)=sin(alpha) st(1)=200*sin(alpha*3) st(2)=alpha
fmul ;st(0)=200*sin(alpha)*sin(alpha*3) st(1)=alpha
fistp y ;Y=200*sin(alpha)*sin(alpha*3) st(0)=alpha
mov cx,x
mov di,cx
neg di
add cx,320 ;координаты точки относительно центра экрана
mov dx,y
add dx,200
int 10h ;выводим зеленую точку
lea cx,[di+320]
int 10h ;выводим зеленую точку
fadd delta ;вычисляем новое значение alpha
dec si
jnz l1 ;цикл пока SI не равно нулю
mov ah,0 ;ожидание нажатия клавиши
int 16h
mov ax,3;перевод обратно в TextMode
int 10h
exit: int 20h ;стандартный выход
END start
[/ASM]
Но и тут не без греха,ошибка
"cannot use 16-bit register with a 32-bit address"
Не могу ее решить....