Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
PegasBlond
0 / 0 / 2
Регистрация: 06.04.2016
Сообщений: 10
#1

Графический режим в ассемблере. Создание эллипсоидной спирали - Assembler

22.11.2016, 23:14. Просмотров 538. Ответов 2
Метки нет (Все метки)

Доброго времени суток! Прошу помощи, мне необходимо изменить спираль как на скрине (спираль на синем фоне), на эллипсоидную спираль что на фотографии. Как это сделать я слабо представляю
P.S.:Листинги программы и макроса приложил снизу.
Графический режим в ассемблере. Создание эллипсоидной спирали
Графический режим в ассемблере. Создание эллипсоидной спирали
Код программы .asm и .inc с макросом.
Листинг программы:
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
TITLE SPIRAL
;Программа построения спирали Архимеда
include pixels.inc ;подключить макросы вывода точки, осей и символа
.model small
.stack 100h
.data
fi dd 0.0 ;Начальное значение переменной угла.
delta dd 0.001 ;Шаг изменения угла.
xdiv2 dw 320 ;Координаты центра экрана по X.
ydiv2 dw 240 ;Координаты центра экрана по Y.
K dd 5.0 ;Коэффициент шага спирали.
xr dw 0 ;Координата выводимой точки по X.
yr dw 0 ;Координата выводимой точки по Y.
forcolor DB 00000010b ;Цвет спирали
Variant db 'Spiral_2_7_vitkov', '$' ;Поясняющая надпись.
.code
.486 ;Используем расширенную систему команд
;---------------Вывод пиксела---------------------------------------------
;CX-координата X (столбец), DX-координата Y (строка),
;AL-цвет пиксела
POINT PROC 
pusha
mov CX,xr ;Вычисляем координату х
add CX, xdiv2 ;в регистре CX.
mov DX, ydiv2 ;Вычисляем координату y
sub DX, yr ;в регистре DX.
mov AL, forcolor ;Задать цвет спирали.
mov BH, 0
mov AH,12 ;Вывести пиксел
int 10h ;средствами BIOS.
popa
ret
POINT ENDP
;-----------Закрашивание экрана цветом фона---------------------
;CX-координата X (столбец), DX-координата Y (строка),
;AL-цвет пиксела
FON PROC
pusha
mov CX, 0
mov DX, 0
mov AL, 00000001b ;Цвет фона.
mov BH, 0 ;Номер страницы.
c_1: mov AH, 12 ;Вывести пиксел
int 10h ;средствами BIOS.
inc CX 
cmp CX, 639
jne c_1
xor CX, CX
inc DX
cmp DX, 479
jne c_1
popa 
ret
FON ENDP
;===========Основная программа====================
start:
mov ax,@DATA
mov ds,ax 
xor ax,ax
mov CX, 43960 ;Количество итераций цикла
;(определяет число витков).
;----------------------------------------------------------------------------------
mov ah,0h ;Инициализация графического
mov al,12h ;режима 640х480.
int 10h
call FON ;Вызов процедуры закрашивания фона.
;-------Вывод строки Variant-------------------------------------------------
pusha
mov cx,17
mov bx,0
l3:
mov al,Variant[bx]
inc bx
OutCharG bl, 02h, 03h, al ;Вызов макроса. 
loop l3
popa
;---------рисуем оси-----------------------------------------------------------
AxleX ;Вызов макроса.
AxleY ;Вызов макроса.
;------Вычисляем формулу x=round(fi*K*cos(fi))----------------------
finit ;Инициализация сопроцессора. 
l1:
fld fi ;Загрузить угол fi в стек FPU.
fcos ;Вычислить cos(fi).
fld fi ;Загрузить угол fi в стек FPU. 
fmul K ;ST(0):=K*(ST(0))
fmul ;ST()):=(ST(0))*(ST(1))
frndint ;ST(0):=round(ST(0)) 
fistp word ptr xr ;Заносим X в переменную для вывода ;на экран
;------Вычисляем формулу y=round(fi*K*sin(fi))-----------------------
fld fi
fsin
fld fi
fmul K
fmul 
frndint
fistp word ptr yr ;Заносим Y в переменную для вывода ;на экран. 
call POINT
;---------Вычисляем новое значение угла fi----------------------------- 
fld delta
fld fi
fadd
fstp fi
loop l1 ;Повторить цикл пока (СХ) не равно 0.
;-----------------------------------------------------------------------------------
mov ah,1h ;Ожидание нажатия клавиши. 
int 21h
;-----------------------------------------------------------------------------------
mov ah,0h ;Перевод в Text Mode.
mov al,03h
int 10h
;-----------------------------------------------------------------------------------
exit:
mov ax,4C00h ;Стандартный выход.
int 21h 
END start

Листинг макроса pixels.inc:
Кликните здесь для просмотра всего текста
Код
;Макрос вывода символа в графическом режиме
;(char - ASCII код символа)
OutCharG macro x, y, color, char
pusha
mov ah,02h
mov bh,0h
mov dh,y
mov dl,x
int 10h
mov ah,09h
mov al,char
mov bh,0h
mov bl,color
mov cx,01h
int 10h
popa
endm
;----------------------------------------------------------------------------------
;Макрос вывода пиксела на экран с коорд. x,y и цветом color
PutPixel macro x,y,color
pusha
mov ah,0ch
mov al,color
mov bh,0h
mov cx,x
mov dx,y
int 10h
popa
endm
;-----------------------------------------------------------------------------------
;Макрос вывода горизонтальной линии в середине экрана
AxleX macro
local iter
pusha
OutCharG 4eh,0fh,03h,78h ;X
mov cx,640
iter:
PutPixel cx,240,4h
loop iter
PutPixel 637,241,4h ;стрелка
PutPixel 637,239,4h
PutPixel 636,241,4h
PutPixel 636,239,4h
PutPixel 635,241,4h
PutPixel 635,239,4h
PutPixel 634,241,4h
PutPixel 634,239,4h
PutPixel 633,241,4h
PutPixel 633,239,4h
PutPixel 632,242,4h
PutPixel 632,238,4h
PutPixel 633,242,4h
PutPixel 633,238,4h
PutPixel 632,241,4h
PutPixel 632,239,4h
PutPixel 634,242,4h 
PutPixel 634,238,4h
popa
endm
;---------------------------------------------------------
;Макрос вывода вертикальной линии в середине экрана
AxleY macro
local iters
pusha
mov cx,480
iters:
mov dx,cx
PutPixel 320,dx,4h
dec cx
cmp cx,19
jge iters
PutPixel 319,22,4h ;Стрелка.
PutPixel 321,22,4h
PutPixel 319,23,4h
PutPixel 321,23,4h
PutPixel 319,24,4h
PutPixel 321,24,4h
PutPixel 318,25,4h
PutPixel 322,25,4h
PutPixel 318,26,4h
PutPixel 322,26,4h
PutPixel 318,27,4h
PutPixel 322,27,4h
PutPixel 319,26,4h
PutPixel 321,26,4h
PutPixel 319,27,4h
PutPixel 321,27,4h
PutPixel 319,25,4h
PutPixel 321,25,4h
OutCharG 29h,01h,03h,79h ;Y 
popa
endm

Заранее СПАСИБО за любую помощь!!!
http://www.cyberforum.ru/assembler-dos/thread1857146.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2016, 23:14
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Графический режим в ассемблере. Создание эллипсоидной спирали (Assembler):

Графический редактор (paint) на ассемблере
Доброго всем времени суток! Ситуация вот в чем: есть задание на курсовую,...

Графический режим
Доброе время суток, разработать программу вычисления значений функций согласно...

Графический режим
Дорогие форумчане! Помогите, пожалуйста, второкурснице сделать лабораторную. Я...

графический режим и windows 7
пишу программу на TASM, которая выводит прямоугольник на экран. На компе на...

Ассемблер, графический режим
Здравствуйте, помогите пожалуйста разобраться... Имеется вот такая программа...

2
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,449
23.11.2016, 01:01 #2
Лучший ответ Сообщение было отмечено PegasBlond как решение

Решение

Введите переменную - коэффициент сжатия по оси Y. И перед строкой 96 добавьте умножение y на этот коэффициент.
1
PegasBlond
0 / 0 / 2
Регистрация: 06.04.2016
Сообщений: 10
23.11.2016, 03:05  [ТС] #3
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Введите переменную - коэффициент сжатия по оси Y. И перед строкой 96 добавьте умножение y на этот коэффициент.
Спасибо большое за помощь! Разобрался и сделал)
Графический режим в ассемблере. Создание эллипсоидной спирали
P.S.: Красным шрифтом и подчеркнутым это то что было внесено в изначальный код.
Кликните здесь для просмотра всего текста
TITLE SPIRAL
;Программа построения спирали Архимеда
include pixels.inc ;подключить макросы вывода точки, осей и символа
.model small
.stack 100h
.data
fi dd 0.0 ;Начальное значение переменной угла.
delta dd 0.001 ;Шаг изменения угла.
xdiv2 dw 320 ;Координаты центра экрана по X.
ydiv2 dw 240 ;Координаты центра экрана по Y.
Y dd 0.002 ;
K dd 5.0 ;Коэффициент шага спирали.
xr dw 0 ;Координата выводимой точки по X.
yr dw 0 ;Координата выводимой точки по Y.
forcolor DB 00000010b ;Цвет спирали
Variant db 'Spiral_2_7_vitkov', '$' ;Поясняющая надпись.
.code
.486 ;Используем расширенную систему команд
;---------------Вывод пиксела---------------------------------------------
;CX-координата X (столбец), DX-координата Y (строка),
;AL-цвет пиксела
POINT PROC
pusha
mov CX,xr ;Вычисляем координату х
add CX, xdiv2 ;в регистре CX.
mov DX, ydiv2 ;Вычисляем координату y
sub DX, yr ;в регистре DX.
mov AL, forcolor ;Задать цвет спирали.
mov BH, 0
mov AH,12 ;Вывести пиксел
int 10h ;средствами BIOS.
popa
ret
POINT ENDP
;-----------Закрашивание экрана цветом фона---------------------
;CX-координата X (столбец), DX-координата Y (строка),
;AL-цвет пиксела
FON PROC
pusha
mov CX, 0
mov DX, 0
mov AL, 00000001b ;Цвет фона.
mov BH, 0 ;Номер страницы.
c_1: mov AH, 12 ;Вывести пиксел
int 10h ;средствами BIOS.
inc CX
cmp CX, 650
jne c_1
xor CX, CX
inc DX
cmp DX, 479
jne c_1
popa
ret
FON ENDP
;===========Основная программа====================
start:
mov ax,@DATA
mov ds,ax
xor ax,ax
mov CX, 43960 ;Количество итераций цикла
;(определяет число витков).
;----------------------------------------------------------------------------------
mov ah,0h ;Инициализация графического
mov al,12h ;режим 640 480.
int 10h
call FON ;Вызов процедуры закрашивания фона.
;-------Вывод строки Variant-------------------------------------------------
pusha
mov cx,17
mov bx,0
l3:
mov al,Variant[bx]
inc bx
OutCharG bl, 02h, 03h, al ;Вызов макроса.
loop l3
popa
;---------рисуем оси-----------------------------------------------------------
AxleX ;Вызов макроса.
AxleY ;Вызов макроса.
;------Вычисляем формулу x=round(fi*K*cos(fi))----------------------
finit ;Инициализация сопроцессора.
l1:
fld fi ;Загрузить угол fi в стек FPU.
fcos ;Вычислить cos(fi).
fld fi ;Загрузить угол fi в стек FPU.
fmul K ;ST(0):=K*(ST(0))
fmul ;ST()):=(ST(0))*(ST(1))
frndint ;ST(0):=round(ST(0))
fistp word ptr xr ;Заносим X в переменную для вывода ;на экран
;------Вычисляем формулу y=round(fi*K*sin(fi))-----------------------
fld fi
fsin
fld fi
fmul K
fmul
fmul Y
fmul

frndint
fistp word ptr yr ;Заносим Y в переменную для вывода ;на экран.
call POINT
;---------Вычисляем новое значение угла fi-----------------------------
...............................................................................................
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2016, 03:05
Привет! Вот еще темы с решениями:

13h графический режим
куда надо заносить какие биты, чтоб задать цвет? (как задается цвет в этом...

Графический режим, закрашиваем пиксели
Всем привет =) Помогите пожалуйста как работать с графикой в масме, желательно...

Графический режим -> возврат в текстовый.
Как, будучи в графическом режиме (al - 19; ah - 0; int 10), вернуться назад в...

В отладчике DEBUG составить и выполнить процедуру, которая устанавливает графический режим экрана
С помощью отладчика DEBUG составить и выполнить процедуру, которая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru