Введение
Программы написанные на низкоуровневом языке программирования могут быть очень эффективны, в сравнении с такой же программой, написанной на высокоуровневом языке. К сожалению, чем сложнее становится наш код, тем сложнее писать и поддерживать низкоуровневый код.
Ассемблер, как главной представитель языков низкого уровня, всё ещё используется современными программистами, но это встречается всё реже и реже, особенно это заметно при работе с графикой и цветом, которые являются неотъемлемой частью современного программного обеспечения.
Работа с цветом и графиком на ассемблере тоже имеет свои плюсы, рациональное использование процессора, видеоадаптера и памяти. Но данные преимущества с лихвой перевешивает главный недостаток, высокая сложность работы с видеоадаптером и процессором для манипулирования пикселями.
Графический режим работы на ассемблере
Язык ассемблера поддерживает несколько режимов работы, текстовый, режим по умолчанию, и графический, который используется для работы с графикой, цветом и изображениями. Для переключения системы в графический режим, ассемблер использует не функции подсистемы DOS, а нижний уровень операционной системы – базовую систему ввода-вывода (BIOS). В отличи от DOS, где к любой функции можно обращаться, используя единственное прерывание int 21h, BIOS за каждым компонентом ПК закрепляет собственное прерывание, к примеру работа с диском – int 13h, а необходимое нам работа с цветом, с помощью прерывания экрана – int 10h.
Для генерации цветных изображений ассемблер использует минимальные точки растра, которые называют пикселями ил пэлами. На первых графических адаптерах, существовал режим CGA, который имел всего 3 степени разрешения, для построения изображений:
Низкое разрешение – 100 строк по 160 точек, 1 точка = 4 бита. Каждая точка может иметь 1 из 16 стандартных цветов.
Среднее разрешение – 200 строк по 320 токе. 1 точка = 2 бита. Каждая точка может иметь 1 из 4 стандартных цветов.
Высокое разрешение – 200 строк по 640 точек. 1 точка = 1 бит. Каждая точка может иметь 1 из 2 стандартных цветов, то есть монохромный вывод.
Такие ограничения вызваны ограниченным размеров видеопамяти. В современных графических адаптерах такие ограничения отсутствуют, благодаря новым видеорежимам, например Direct color, который поддерживает 16.8 миллионов различных цветов, где для кодирования каждого пикселя используется 3 байта (24 бита), но так как обработать 3 байта 1 командой невозможно, добавляется 4 пустой бит.
Функции BIOS не позволяют работать с графическими примитивами, поэтому для рисования чего-бы то ни было, необходимо напрямую работать с цветом каждого пикселя. Для того чтобы разобраться как это работает, рассмотрим пример кода, который выводит на экран горизонтальную линию:
mov АН,00h ;(1) Функция задания режима
mov AL,10h ;(2) Выбираем графический режим EGA
int 10h ;(3) Вызов BIOS
; Рисование прямой происходит в цикле, путём изменения X
mov SI,145 ;(4) Задаём начальную координату по X
mov CX,280 ;(5) Число точек по горизонтали
line:
push CX ;(6) Сохраним его в стеке
mov AX,0Ch ;(7) Функция вывода пиксела
mov AL,4 ;(8) Задаём цвет, 4 - красный
mov ВН,0 ;(9) Видеостраница
mov CX,SI ;(10) Задаём координату X, (переменная)
mov DX,180 ;(11) Задаём координату Y, (const)
int 10h ;(12) Вызов BIOS
inc SI ;(13) Увеличиваем значение координаты X на 1
pop CX ;(14) Восстановим счетчик шагов
loop line ;(15) Цикл из CX шагов
;Остановим программу для наблюдения результата ее работы
mov АН,08h ;(16) Функция ввода с клавиатуры без эха
int 21h ;(17) Вызов DOS
; Переключим видеоадаптер назад в текстовый режим
mov АН,00h ;(18) Функция задания режима
mov AL,03h ;(19) Текстовый режим
int 10h ;(20) Вызов BIOS
Строчки 1-3 позволяет перевести видеоадаптер в графический режим. Причём, если вы заметили тип режима устанавливается в регистр AL, который может хранить 256 различных комбинаций, а значит всего может существовать 263 различных режимов работы видеоадаптера. Рисование изобретения происходит в цикле, строки 6-15. Для вывода на экран цветной точки, используется команда mov AX, 0Ch прерывания 10h, которая настраивается занесением в регистр AL кода цвета, а в регистр BH, номера видеостраницы.
Рассмотрим подробнее функцию mov AX, 0Ch. В графическом режиме EGA, доступны 2 видеостраницы, видимая (0 – по умолчанию) и невидимая (1) , а также имеется поддержка 64 цветов, хотя в каждый момент времени изображении может содержать не более 16 цветов из стандартной цветовой палитры EGA, которая задаётся программно (рисунок 1).
Рисунок 1 – Cтандартная цветовая палитра EGA
Заключение
Работа с графикой на ассемблере напрямую связана с попиксельным изменением цвета изображения, а также низкоуровневой работой с видеоадаптером. Где нам нужно вручную выбирать графический режим, от которого зависит, как максимально доступное разрешение, так и количество цветов, с которыми мы можем работать. Причём не стоит забывать, что не каждый видеоадаптер поддерживает необходимый вам режим, а следовательно, для каждой конфигурации компьютера нужна собственная версия программы.
Высокоуровневые языки программирования избавляют нас от этой рутины, компилятор сам выбирает необходимый режим, а нам как программисту, используя специальные функции, остаётся манипулировать цветами и графическими примитивами.
Список литературы
Кузнецов А.Е. Исследование методов цветного графического вывода с помощью ассемблера / А.Е. Кузнецов, О.Ф. Абрамова // Студенческий научный форум – 2020: доклады XII Международной студенческой научной конференции. Направление «Технические науки» (секция «Актуальные проблемы компьютерной визуализации») / Российская академия естествознания (РАЕ). - Москва, 2020. - URL: https://scienceforum.ru/2020/article/2018018028
Фомичев Е.А. Графический ввод–вывод на языке Ассемблер [Электронный ресурс] / Е.А. Фомичев, О.Ф. Абрамова // Студенческий научный форум – 2019: доклады XI международной студенческой электронной научной конференции. Направление «Технические науки» (секция «Актуальные проблемы компьютерной визуализации») / РАЕ. - Москва, 2019. - Режим доступа: https://scienceforum.ru/2019/forum.
CodeNet Графика SVGA. Программирование современных видеокарт в реальном и виртуальном режимах. [Электронный ресурс] // URL: http://www.codenet.ru/progr/video/vbe-svga.php
AllBest Программирование вывода в цветном графическом режиме на ассемблере. [Электронный ресурс] // URL: https://revolution.allbest.ru/programming/00330696_0.html
TDOC.ru Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал. [Электронный ресурс] // URL: http://www.tdoc.ru/c/programming/assembler/assembler-programming-terminal-output.html