Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 2
Регистрация: 06.04.2016
Сообщений: 10

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

22.11.2016, 23:14. Показов 2319. Ответов 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:
Кликните здесь для просмотра всего текста
Code
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
;Макрос вывода символа в графическом режиме
;(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

Заранее СПАСИБО за любую помощь!!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2016, 23:14
Ответы с готовыми решениями:

Формула треугольной спирали
Есть формула спирали Архимедова (на картинке) ;------Вычисляем формулу x=round(fi*K*cos(fi))---------------------- finit...

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

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

2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,922
Записей в блоге: 13
23.11.2016, 01:01
Лучший ответ Сообщение было отмечено PegasBlond как решение

Решение

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

Решение

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Введите переменную - коэффициент сжатия по оси 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2016, 03:05
Помогаю со студенческими работами здесь

График функции y=x/cos(x)
Доброе время суток, разработать программу вычисления значений функций согласно варианту и вывод на экран их графиков. Вывести оси...

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

Нарисовать прямую линию красного цвета
Здравствуйте, помогите пожалуйста разобраться... Имеется вот такая программа (см. ниже), однако при ее запуске (tasm lab31.asm tlink...

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru