Цитата(ФедосеевПавел @ 1.12.2013, 19:34) | Если ОС - DOS, то могу поделиться примером из книги. Правда, я его набирал для TASM, но для MASM будут какие-то незначительные изменения в синтаксисе. Рисование окружности выполняется по параметрическому уравнению. Но из-за вытянутости экранов получался эллипс. Я добавил коррекцию по одной из осей координат поэтому при расчётах присутствуют два разных радиуса rx и ry.
Если трудно понять как рисовать на асме, то нарисуй для начала на ЯВУ один клевер. Потом проработай подпрограмму и примени её три раза для разных координат и цветов. И тогда приводи все к асму.
Код | ;Пример из книги: ;Рудаков П.И., Финогенов К.Г. программируем на языке ассемблера IBM PC - Изд. 2-е. - Обнинск: ;Издательство "Принтер", 1997.-584 с., илл.
;Пример 84.1. Вычисление координат точек, расположенных на окружности ;и вывод их на экран
.386
data segment use16
x360 dd 180.0 ;константа перевода градусы-радианы x36 dw 360 ;число точек на окружности forcolor db 10 ;салатовый цвет ;Координаты центра окружности xc dw 320 yc dw 175 ;Значение радиуса по осям ratiox equ 16 ;Соотношение строн монитора: 4:3 или 16:9 ratioy equ 9 sizex equ 640 ;Размер экрана при режиме 10h: 640x350 sizey equ 350 _rx equ 100 ;_ry equ (_rx*ratiox*sizey)/(ratioy*sizex) ;<-- Так будет переполнение и неверный результат _ry equ (((_rx*sizey)/ratioy)*ratiox)/sizex
rx dw _rx ;100 ry dw _ry ;70 ;Переменные x dw ? ;Текущие координаты точки окружности y dw ? angl dw 1 ;Текущее значение угла
data ends
text segment use16 assume CS:text, DS:data, SS:stk ;Подпрограмма изменения цвета пиксела point proc
push CX mov CX, xc mov AH, 0Ch mov AL, forcolor mov BH, 0 ; fld yc1 ;Это универсальная процедура расчитана на ; fistp yc ;несколько примеров, поэтому в ней присутствуют ;"лишние" команды и ссылки на несуществующие переменные mov DX, yc ; fld xc1 ; fistp xc mov CX, xc sub CX, x sub DX, y int 10h pop CX
ret
point endp
;Главная процедура main proc
mov AX, data ;Инициализация регистра DS mov DS, AX
mov AH, 0h ;Установка графического режима mov AL, 10h ;Режим 10h (640x350) int 10h
mov CX, x36 ;Число шагов построения окружности
finit ;Инициализация сопроцессора fldpi ;Загрузка в стек числа pi fld x360 ;Загрузка в стек числа 180 fdiv ;pi/180, результат в ST fstp x360 ;Сохранение в памяти коэффициента ;перевода градусов в радианы ;Вычисление координат точек и вывод рисунка do: fld x360 ;Коэффициент градус-радианы в стек fild angl ;Очередное значение угла в стек fmul ;перевод в радианы
fsincos ;sin(x) -> ST(1), cos(x) -> ST(0)
fild ry ;Загрузка радиуса по координате y fmul ;Вычисление координаты y fistp y ;Запись её в память в формате целого ;числа с звлечением из стека fild rx ;Загрузка радиуса по координате x fmul ;Вычисление координаты x fistp x ;Запись её в память в формате целого ;числа с звлечением из стека fwait ;Ожидание завершения работы сопроцессора
call point ;Вывод точки на экран
inc angl ;Приращение угла
loop do
;Задержка до нажатия клавиши mov AH, 8 int 21h
mov AX, 4C00h ;Выод в DOS с кодом ошибки 0 int 21h
main endp
text ends
stk segment stack 'stack' db 1024 dup(?) stk ends
end main
|
и ещё однотипный рисунок
Код | ;Пример из книги: ;Рудаков П.И., Финогенов К.Г. программируем на языке ассемблера IBM PC - Изд. 2-е. - Обнинск: ;Издательство "Принтер", 1997.-584 с., илл.
;Пример 84.2. Вычисление координат точек, расположенных на спирали ;и вывод их на экран
.386
data segment use16
x360 dd 180.0 ;константа перевода градусы-радианы x36 dw 360 ;число точек на окружности forcolor db 9 ;голубой цвет ;Координаты центра окружности xc dw 320 yc dw 175
; ratiox equ 16 ;Соотношение строн монитора: 4:3 или 16:9 ratioy equ 9 sizex equ 640 ;Размер экрана при режиме 10h: 640x350 sizey equ 350 _rx equ 100 ;_ry equ (_rx*ratiox*sizey)/(ratioy*sizex) ;<-- Так будет переполнение и неверный результат _ry equ (((_rx*sizey)/ratioy)*ratiox)/sizex
;Значение радиуса по осям rx dd 100.0 ry dd 70.0 ;Переменные x dw ? ;Текущие координаты точки окружности y dw ? angl dw 1 ;Текущее значение угла ; xc1 dd 320.0 ;Дополнительные переменные для yc1 dd 175.0 ;преобразования координат центра ;Параметры спирали del dd 0.9985 ;Коэффициент сжатия спирали delx dd 1.0000004 ;Коэффициент перемещения по оси x dely dd 0.999997 ;Коэффициент перемещения по оси y
data ends
text segment use16 assume CS:text, DS:data, SS:stk
;Подпрограмма изменения координат центра и радиуса coord proc
fld rx fmul del fstp rx
fld ry fmul del fstp ry
fld xc1 fmul delx fstp xc1
fld yc1 fmul dely fstp yc1
ret coord endp
;Подпрограмма изменения цвета пиксела point proc
push CX
mov CX, xc mov AH, 0Ch mov AL, forcolor mov BH, 0
fld yc1 fistp yc mov DX, yc
fld xc1 fistp xc mov CX, xc
sub CX, x sub DX, y
int 10h
pop CX
ret
point endp
;Главная процедура main proc
mov AX, data ;Инициализация регистра DS mov DS, AX
mov AH, 0h ;Установка графического режима mov AL, 10h ;Режим 10h (640x350) int 10h
mov CX, x36 ;Число шагов построения окружности
finit ;Инициализация сопроцессора fldpi ;Загрузка в стек числа pi fld x360 ;Загрузка в стек числа 180 fdiv ;pi/180, результат в ST fstp x360 ;Сохранение в памяти коэффициента ;перевода градусов в радианы ;Вычисление координат точек и вывод рисунка do: fld x360 ;Коэффициент градус-радианы в стек fild angl ;Очередное значение угла в стек fmul ;перевод в радианы
fsincos ;sin(x) -> ST(1), cos(x) -> ST(0)
fld ry ;Загрузка радиуса по координате y fmul ;Вычисление координаты y fistp y ;Запись её в память в формате целого ;числа с звлечением из стека fld rx ;Загрузка радиуса по координате x fmul ;Вычисление координаты x fistp x ;Запись её в память в формате целого ;числа с звлечением из стека fwait ;Ожидание завершения работы сопроцессора
call point ;Вывод точки на экран
inc angl ;Приращение угла
call coord ;Изменение координат и радиуса
loop do
;Задержка до нажатия клавиши mov AH, 8 int 21h
mov AX, 4C00h ;Выод в DOS с кодом ошибки 0 int 21h
main endp
text ends
stk segment stack 'stack' db 1024 dup(?) stk ends
end main
|
|
к сожалению ОС Windows |