Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1045 / 315 / 74
Регистрация: 13.07.2013
Сообщений: 1,270

Программа выведения точек (линии) на экране

13.07.2013, 18:29. Показов 3038. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа!
Я очень долго шарил по Интернету в поисках материалов по Ассемблеру - ничего дельного не нашел и потерял надежду самому написать на нем программу. Мне нужна программа-вставка в программу Тубро Бейсика. Она должна чертить линию (вертикальную) с задаными координатами начала и конца (координаты лучше бы через регистры передавать). В общем она должна выполнять примерно следующий алгоритм:

PureBasic
1
2
3
4
x=reg(1)
y=reg(2)
z=reg(3)
line(z,x)-(z,y)
Конечно, это можно сделать и на Турбо Бейсике, но: оператор "line" работает слишком медленно для моих целей, и мне нужен вывод графики напрямую в видеопамять. Также от ассемблерной программы требуется следующее:
1). Иметь наибольшее возможное разрешение экрана
2). Не очищать экран после завершения своей работы.

Поможете?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.07.2013, 18:29
Ответы с готовыми решениями:

Программа для выведения чётных индексов массива
Программа для выведения чётных индексов массива для n количества чисел.

Программа для создания файла, записи в него, чтения и выведения результата по формуле
Помогите пожаолуйста.Завтра нужно сдать зачет.Среда Дэлфи. А. Создать файл, содержащий сведения о количестве изде¬лий категорий А, В, С,...

Программа для создания файла,записи в него, чтения и выведения результата по формуле
А. Создать файл, содержащий сведения о количестве изде¬лий категорий А, В, С, собранных рабочим за месяц. Структура записи имеет поля:...

19
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
13.07.2013, 20:35
Быстрее всего вывести вертикальную линию в режиме 13h (320*200*256 цветов):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mov cx,z
mov dx,x
mov di,y
cmp di,dx
jnb m1
xchg dx,di
m1:
    mov ax,0a000h   ;сегмент видеопамяти
    mov es,ax
    shl dx,6    ;y*64
    mov bx,dx   ;bx=y*64
    shl dx,2    ;dx=y*256
    add bx,dx   ;y*256+y*64=y*320
    add bx,cx   ;y*320+x
    mov al,color
m2: mov es:[bx],al  ;вывести пиксель в видеопамять
add bx,320
inc dx
cmp dx,di
jbe m2
Все остальные режимы будут работать медленней

З.Ы. Не проверял, но должно работать
1
1045 / 315 / 74
Регистрация: 13.07.2013
Сообщений: 1,270
13.07.2013, 23:42  [ТС]
Большое Вам спасибо! =)
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
14.07.2013, 10:52
Цитата Сообщение от Good-Morning Посмотреть сообщение
Я очень долго шарил по Интернету в поисках материалов по Ассемблеру - ничего дельного не нашел
Ты бы на каком другом форуме такое грузил.
0
14.07.2013, 12:22  [ТС]

Не по теме:

Цитата Сообщение от Ethereal Посмотреть сообщение
Ты бы на каком другом форуме такое грузил.
Я имел в виду, что сам бы как-нибудь разобрался - самоучителем или еще как-то, но все самоучители устроины одинаково - сначала там все рассказывается для явных "несведующих людей", потом вода, вода... Мое внимание на этой воде рассеивается и уже что либо полезное я не вижу... Затем вовсе идет такой БРЕД, что я даже понять не могу (может, потому, что это действительно бред, может - потому что не смог начало прочитать). Ах, да, чуть не забыл - есть самоучители, где ВСЕ нужно скачивать - я даже пробовать не стал - у меня и без того папка для изучения Ассемблера забита была. Я пробовал напрямую найти программу - не нашел. Даже сейчас я "сижу" с готовой программой (спасибо alexcoder'у за программу), но без нормального компилятора - все, что находил - не работают вообще никак. Пробовал так запустить - не фурычит, пробовал через DOSBox - та же история. На Windows 3.1 - не работает и с режимами совместимости подобрая картина... Есть еще один "подвид" - которые выдают "окно" на экране (DOSBox) и больше ничего. Никаких объяснительных текстов (всякие "/s for debug") нет. Пробую запустить Ассемблерную программу через Turbo Basic, предварительно переведя код... Получится ли перевести? Получится ли запустить? Согласится ли DOSBox выполнять такое (бывало и не соглашалось)? Я не знаю.

0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
14.07.2013, 12:59
Good-Morning, нужно только включить голову, открыть справочник по командам ассемблера, и начать читать и думать. Главное - знать, что хочешь сделать. Если не знаешь, то бесполезно что-то делать.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
14.07.2013, 13:08
Взял из Википедии реализацию алгоритма Брезенхема на C++ и записал то-же
самое на ассемблере. В данном случае для монохромного графического режима
CGA 640*200.
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
                Model   Tiny    ;Line in CGA 640*200 graphic mode
                .Code
                Org     100h
                Locals  @@
 
                X0 = 0
                Y0 = 0
                X1 = 639
                Y1 = 199
 
Start:          mov     ax, 6
                int     10h
                mov     dx, 101h
                mov     di, X1-X0
                test    di, di
                jns     @@1
                neg     dl              ; dl : signX = X0 < X1 ? 1 : -1
                neg     di              ; di : deltaX = abs(X1-X0)
@@1:            mov     bp, Y0-Y1
                test    bp, bp
                js      @@2
                neg     dh              ; dh : signY = Y0 < Y1 ? 1 : -1
                neg     bp              ; bp : -deltaY = -abs(Y1-Y0)
@@2:            lea     si, [di][bp]    ; si : error = deltaX - deltaY
                mov     bx, X1
                mov     cx, Y1
                call    Plot            ; Plot(X1,Y1)
                mov     bx, X0          ; bx : X = X0
                mov     cx, Y0          ; cx : Y = Y0
IsItLast:       cmp     bx, X1          ; while
                jne     Next            ; ( X != X1
                cmp     cx, Y1          ;     ||
                jne     Next            ;   Y != Y1 )
                xor     ax, ax
                int     16h
                mov     ax, 3
                int     10h
                retn
 
Next:           call    Plot            ; Plot(X,Y)
                mov     ax, si
                add     ax, si          ; ax : error2 = error * 2
                cmp     ax, bp          ; if (error2 > -deltaY)
                jle     @@1             ; {
                add     si, bp          ; si : error -= deltaY
                mov     al, dl
                cbw
                add     bx, ax          ; bx : X += signX
                jmp     short IsItLast  ; }
@@1:            cmp     ax, di          ; if (error2 < -deltaX)
                jge     IsItLast        ; {
                add     si, di          ; si : error += deltaX
                mov     al, dh
                cbw
                add     cx, ax          ; cx : Y += signY
                jmp     short IsItLast  ; }
 
                ; BX - column
                ; CX - row
Plot:           push    ax
                push    bx
                push    cx
                mov     ax, cx
                mov     cx, 0B800h
                shr     al, 1
                jnc     @@1
                mov     ch, 0BAh
@@1:            mov     ds, cx
                mov     ah, 80
                mul     ah
                mov     cl, 7
                and     cl, bl
                shr     bx, 1
                shr     bx, 1
                shr     bx, 1
                add     bx, ax
                mov     al, 80h
                shr     al, cl
                or      [bx], al
                pop     cx
                pop     bx
                pop     ax
                retn
 
                End     Start
1
1045 / 315 / 74
Регистрация: 13.07.2013
Сообщений: 1,270
14.07.2013, 13:12  [ТС]

Не по теме:

Цитата Сообщение от sh2ezo Посмотреть сообщение
Good-Morning, нужно только включить голову, открыть справочник по командам ассемблера, и начать читать и думать. Главное - знать, что хочешь сделать. Если не знаешь, то бесполезно что-то делать.
Это да... Только вот для этого нужен компилятор, а у меня его нет.:cry: Ладно, программа есть - дальше попробую разобраться.



Добавлено через 2 минуты
Цитата Сообщение от Ethereal Посмотреть сообщение
Взял из Википедии реализацию алгоритма Брезенхема на C++ и записал то-же
самое на ассемблере. В данном случае для монохромного графического режима
CGA 640*200.
... ... Спасибо?..
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
14.07.2013, 13:31
Цитата Сообщение от Good-Morning Посмотреть сообщение
Даже сейчас я "сижу" с готовой программой (спасибо alexcoder'у за программу), но без нормального компилятора - все, что находил - не работают вообще никак. Пробовал так запустить - не фурычит
[/OFF]
То была не программа. То был фрагмент кода. Т.е. сам по себе он работать не будет. Его надо в свою программу вставлять и там использовать. А для этого надо наконец начать писать свои программы.

>пробовал так запустить - не фурычит
так это как ? Текстовый файл запускал ?

Добавлено через 13 минут
Цитата Сообщение от Good-Morning Посмотреть сообщение
[OFF]
Это да... Только вот для этого нужен компилятор, а у меня его нет


Компиляция :
tasm /m/l proga.asm
tlink /t proga.obj
1
1045 / 315 / 74
Регистрация: 13.07.2013
Сообщений: 1,270
14.07.2013, 13:40  [ТС]
Цитата Сообщение от Ethereal Посмотреть сообщение
То была не программа. То был фрагмент кода. Т.е. сам по себе он работать не будет. Его надо в свою программу вставлять и там использовать. А для этого надо наконец начать писать свои программы.
Я догадывался, что это только фрагмент... В основном потому, что в конце нет ничего - никакого прерывания, что могло бы остановить программу... Насчет
Цитата Сообщение от Ethereal Посмотреть сообщение
А для этого надо наконец начать писать свои программы
- я пишу всю "логику" в Turbo Basic. Это лишь вставка в мою программу (если бы не медленная графика - то даже доделанную программу). Моей программе нужно пара ассемблерных вставок (можно и других языков, но 16bit-ных). В конечном итоге, конечно, придется провести денек с увесистым, электронным "словарем" по операторам Ассемблера... (И еще найти компилятор для него...) Работы много - но по крайней мере фрагмент подпрограммы графики у меня есть (еще раз спасибо alexcoder'у и, видимо, Ethereal'у).

Добавлено через 1 минуту
Цитата Сообщение от Ethereal Посмотреть сообщение
так это как ? Текстовый файл запускал ?
Я про компилятор.

Добавлено через 55 секунд
Цитата Сообщение от Ethereal Посмотреть сообщение
http://**********/files/qfdcc8bkn
Компиляция :
tasm /m/l proga.asm
tlink /t proga.obj
Спасибо - теперь, надеюсь, все пойдет на лад! =)
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
14.07.2013, 13:45
--------------------------
0
 Аватар для 6a6kin
232 / 102 / 5
Регистрация: 18.04.2010
Сообщений: 294
14.07.2013, 14:19
del
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
15.07.2013, 04:26
Закрепленная тема FAQ для раздела Assembler, MASM, TASM, открываем содержание, находим Рисование линий на экране по ссылке законченная программа, а не фрагмент программы, но если ТС "like an octopus with asshole-driven hands" — тут уже ничем не поможешь...
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
15.07.2013, 10:08
Что-то в этом FAQ черезчур громоздкая реализация алгоритма Брезенхема для линии.
Я нарисовал гораздо более лаконичную. У меня там вообще переменные не используются,
только одни регистры. И если подпрограмму Plot заменить, то выйдет рисование линии
для других видеорежимов.
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
15.07.2013, 11:00
Ethereal,
это из Майкла Абраша "Таинства программирования графики", 1995, я не оптимизировал, можно сравнить с твоим кодом и создать что-нибудь более и совершенное и быстрое, главное поставить цель
0
1045 / 315 / 74
Регистрация: 13.07.2013
Сообщений: 1,270
15.07.2013, 14:02  [ТС]
Цитата Сообщение от Mikl___ Посмотреть сообщение
Закрепленная тема FAQ для раздела Assembler, MASM, TASM, открываем содержание, находим Рисование линий на экране по ссылке законченная программа, а не фрагмент программы, но если ТС "like an octopus with asshole-driven hands" — тут уже ничем не поможешь...
Я не видел этой темы (я на форуме недавно и пока до конца не разобрался в его систематике) ... Спасибо...
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
15.07.2013, 14:20
В том примере из FAQ неплохо бы очепятки исправить мелкие.

Строчки
org 100h
.code
поменять местами

В строчке
.start:
убрать точку

В строчках 46 и 139 переместить ; к началу строки
2
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
20.07.2013, 14:24
Хм, нашел либу того же Tenie Remmel'я, который написал glib для modeX, но уже в разрешении 640х400x256, и заточеную под purebasic: http://www.filegate.net/pdn/pdnbasic/pbagi.zip
P.S. васика не знаю, так что...
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
21.07.2013, 18:01
Блин, в предыдущем своем варианте кода допустил ошибку из-за чего линия
выходит излишне ступенчатой. Исправляюсь.

Вот пример рисования линии из FAQ в предельно оптимизированном виде :
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
                Model   Tiny    ;Line in VGA 320*200 256 colors graphic mode
                .Code
                Org     100h
 
                COLOR = 5
                X0 = 0
                Y0 = 0
                X1 = 55
                Y1 = 12
 
Start:          mov     ah, 0Fh
                int     10h             ; Get current video mode
                mov     ah, 0
                push    ax              ; Video mode to restore
                mov     al, 13h
                int     10h             ; Set video mode 13h
                mov     cx, 1
                mov     dh, -1
                mov     di, X1-X0
                test    di, di
                jns     _
                neg     cx              ; cx : signX = X0 < X1 ? 1 : -1
                neg     di              ; di : deltaX = abs(X1-X0)
_:              mov     bp, Y1-Y0
                test    bp, bp
                js      __
                neg     dh              ; dh : signY = Y0 < Y1 ? 1 : -1
                neg     bp              ; bp : -deltaY = -abs(Y1-Y0)
__:             lea     si, [di][bp]    ; si : error = deltaX - deltaY
                mov     bx, X0          ; bx : X = X0
                mov     dl, Y0          ; dl : Y = Y0
CheckEnd:       cmp     bx, X1          ; while
                jne     NextPlot        ; ( X != X1
                cmp     dl, Y1          ;     ||
                jne     NextPlot        ;   Y != Y1 )
                call    Plot            ; Plot(X1,Y1)
                xor     ax, ax
                int     16h             ; Press any key
                pop     ax
                int     10h             ; Restore video mode
                retn                    ; Program terminate
 
NextPlot:       call    Plot            ; Plot(X,Y)
                mov     ax, si
                add     ax, si          ; ax : error2 = error * 2
                cmp     ax, di          ; if (error2 < -deltaX)
                jge     ___             ; {
                add     si, di          ; si : error += deltaX
                add     dl, dh          ; dl : Y += signY }
___:            cmp     ax, bp          ; if (error2 > -deltaY)
                jle     CheckEnd        ; {
                add     si, bp          ; si : error -= deltaY
                add     bx, cx          ; bx : X += signX
                jmp     short CheckEnd  ; }
 
                ; BX - column
                ; DL - row
Plot:           push    bx
                mov     ax, 0A000h
                mov     ds, ax
                mov     al, 160
                mul     dl
                shl     ax, 1
                add     bx, ax
                mov     byte ptr [bx], COLOR
                pop     bx
                retn
 
                End     Start
2
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
22.07.2013, 02:56
Ethereal,
за имена меток: _, __, ___ отдельное спасибо, век живи — век учись
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.07.2013, 02:56
Помогаю со студенческими работами здесь

Рисование на экране линии или фигуры
Доброго времени суток.Суть задачи в том что нужно нарисовать на экране линию или фигуру и что бы курсор мышки прошелся по линии фигуры.С...

Серые линии на экране с видеокартой 9600GT
Короче купил новый комп Athlon 64 x2 Dual Core Processor 5000+ 2,61ГЦ 2 Гига оперативы! ВИдюха 9600GT Но почему то по экрану...

Линии и полоски на экране. Что с видеокартой?
Видяха борохлит или что с ней? когда в биосе нахожусь ничего не происходит ни какие линии не выходят и когда загружается система начинается...

Рисование на экране ломаной линии между точками
Помогите составить программу рисования на экране ломаной линии между точками, в которых производится нажатие левой клавиши мыши. ...

Изобразить на экране куб, выделив пунктиром невидимые линии
Помогите, пожалуйста, написать программу на Lazarus: Изобразить на экране куб, выделив пунктиром невидимые линии. Вывести на экран формулу...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru