Введение
Графика в жизни программиста занимает особое место. В различных программах графика уже реализована в большей или меньшей степени. Начинающие программисты думают, что вне зависимости от языка программирования, графика реализуется одинаково. Но работа с графикой в каждом языке уникальна. В данной статье мы рассмотрим графическую составляющую языка ассемблер.
Операции ввода/вывода по прерыванию INT 21H
Уникальность ассемблера состоит в том, что он напрямую указывает процессору режим работы с графикой. В ассемблере существует множество режимов, которые определяются шестнадцатеричным числом, содержащимся в регистре АH. Рассмотрим эти примеры прерываний.
AH=01: Ввод с клавиатуры с отображением в консоли. Данная операция считывает с консолисимвол и помещает его в регистр AL. После считывания содержимое данного регистра представляет собой ASCII-символ. Если после считывания символа регистр AL будет равен 0, значит, с клавиатуры были нажаты специальные клавиши (F1, PgUp и т.д). Для определения их кода необходимо повторить запрос.
AH=02: Вывод символа в консоль. При выводе символа на экран в текущую позицию курсора необходимо поместить код данного символа в регистр DL.
AH=06: Ввод/вывод символов. Данный режим может использоваться, как для ввода, так и для вывода. Для вывода в консоль символа необходимо поместить его в DL и вызвать прерывание INT 21H. Для ввода символа необходимо занести в DL FFh и вызвать прерывание INT 21H. При использовании данной команды программа не остановиться, а продолжит выполняться в штатном режиме. При вводе символ поместиться в регистр AL.
AH=07:Ввод с клавиатуры без отображения в консоли. Данная команда работает аналогично с командой при AH=01H, но немного отличается. При вводе символа с клавиатуры он не отображается на экране.
AH=09H: Вывод строки в консоль. Для вывода строки необходимо, чтобы она заканчивалась специальным символом ($). Затем адрес начала строки помещается в регистр DX. Символ доллара в консоли не выводится.
Пример кода выполнения операции прерывания при AH=09H:
Str DB “Выводимая строка $”
Leadx, str; смещение регистра DX до начала строки
Movah, 9; Помещаем в ah 9 для вывода строки
Int 21h; Прерывание для вывода строки
AH=0AH: Ввод значений в буфер.При данном режиме работы данные помещаются в буфер, где определена максимальная длина введенной строки. Если при вводе, строка оказывается меньше в длинны буфера, то окончание ввода строки определяется символом клавиши [ENTER], если больше длины буфера, тогда пользователь предупреждается звуковым сигналом. При переполнении буфера введенная строка не учитывается. Во второй байт буфера возвращается реальная длинна введенной строки в байтах. Адрес буфера заносится в регистр DX. Таким образом, в первом байте находится максимальная длина вводимой строки, так как это поле является однобайтовым, значит максимальная длина будет равна 255 символов (FF- шестнадцатеричное представление). Во втором байте храниться реальное количество символов. В третьем байте хранятся введенные символы.
Ввод /вывод по прерыванию int 10H
Для вывода символов в консоль или их ввода используются различные команды DOS. Однако он не поддерживает смену цвета в консоли ни перемещение курсора, но возможности DOS можно увеличить при помощи драйвера ANSI.SYS. С графической составляющей всё гораздо хуже в DOS нет никаких графических команд. Зато можно переключить видеоадаптер в графический режим с помощью Esc-последовательностей. Для осуществления перехода необходимо обратиться к нижним уровням операционной системы, называемой BIOS (BasicIn-OutSystem). Программы Bios находятся в ПЗУ(постоянное запоминающее устройство). BIOS в отличии от DOS (все команды выполняются при помощи инструкций прерываний int 21h), выполнение команд осуществляется при помощи различный команд прерываний, то есть за каждым устройством закреплён определённая команда прерываний (клавиатура- int 16h, экран-int 10h, и так далее). Прерывание int 10h выполняет все команды видеоадаптера: вывод строк и символьной информации, смена шрифтов, смена цвета, работа с изображениями и т.д.
Пример: Вывод на экран горизонтальной прямой
;Устанавливаем графический режим
mov ah,00h ;(1)Команда для задания режима
mov al,10h ;(2)Входим в графический режим
int 10h ;(3)Вызов BIOS
;Рисуем линию
mov si,150 ;(4)si- Начальная координата (X)
mov cx,300 ;(5)Количество точек по горизонтали
liniya:
pushcx ;(6)Помещаем количество точек в стек
mov ax,0Ch ;(7)Команда вывода пикселя
mov al,4 ;(8)Устанавливаем цвет красный
mov bh,0 ;(9)Видеостраница
movcx,si ;(10)Х-координата (изменяется)
mov dx,175 ;(11)Y-координата (постоянная)
int 10h ;(12)Вызов BIOS
incsi ;(13)Инкремент Х-координаты
popcx ;(14)Восстановим количество шагов
loopliniya ;(15)Цикл из CX шагов
;Останавливаем программу для просмотра её работы
mov ah,08h ;(16)Команда ввода с клавиатуры без отображения в консоли
int 21h ;(17)Вызов DOS
;Переключаем видеоадаптер в текстовый режим
mov ah,00h ;(18)Команда задания режима
mov al,03h ;(19)Текстовый режим
int 10h ;(20)Вызов BIOS
В 1-3 строчках при помощи команды 00H вызвали прерывание Bios 10h и осуществили переключение видеоадаптера в режим графики. Затем поместили номер режима в регистр AL, всего существует порядка 256 разных режимов (текстовых и графических), однако на сегодняшний день используется порядка ста режимов. Команда прерывания int 10h обеспечивает графическое отображение с разрешением 640х350 пикселей и около 16 цветов.
Все изображения рисуются по точкам (пиксели) так как в BIOS нет команд для вывода каких либо геометрических фигур и нет команд закрашивающих области. Для вывода цветного пикселя на экран используется команда 0CH и прерывание int 10h. Данная команда необходима для занесения в регистр AL кода цвета, в BH- номера видеостраницы, в CX – координаты точки по оси Х в, в DX –координаты точки впо оси Y, все координаты вводятся в диапазоне от 0 до 639.
После того как программа завершила построение изображения в программе существует остановка для просмотра результата построения. Останавливаем программу при помощи команды DOS 08h (ввод символа без отображения на экране , что бы не портить графическое изображение),и при нажатии любой клавиши (кроме управляющих) программа возобновляет работу. Затем в конце программы выполняется переход обратно в стандартный текстовый режим. Если не перейти с графического режима в обычный , то он может помешать работу встроенной программы.
Рассмотрим параметры вызова команд 0Ch прерывания int 10h. Заносим номер видеостраницы, куда выводится данная точка, в регистр BH. А регистр AL заносим код цвета выводимого пикселя. Данный адаптер содержит 16 цветов. Данный набор из 16 цветов задаётся программно и может изменятся в любой момент выполнения программы.
Подведём итог графической работы BIOS и прерывания int 10h. Для вывода на экран изображений используется графический режим. Через прерывание int 10h устанавливается текстовый или графический режим. Для установки режима AH обнуляется и в AL заносится код режима работы, а затем выполняется прерывание 10H.
Заключение
В данной работе мы рассмотрели режимы работы графической составляющей языка ассемблер. И сделали вывод, что все образы и картинки состоят из точек(пикселей),а значит можно нарисовать любой графический объект, меняя координаты вывода следующего пикселя.
Библиографический список
Абрамова О.Ф. К вопросу о визуальном моделировании с использованием BOUML [Электронный ресурс] / О.Ф. Абрамова // NovaInfo.Ru : электрон.журнал. - 2016. - № 45, ч. 2. – Режим доступа :http://novainfo.ru/article/5873
Волжанов А.А. Графический интерфейс как средство визуализации общения [Электронный ресурс] / А.А. Волжанов, О.Ф. Абрамова // Студенческий научный форум 2014 :докл. VI междунар. студ. электрон.науч. конф., 15 февр. – 31 марта 2014 г. Направл.: Технические науки / РАЕ. - М., 2014. - C. 1-4. – Режим доступа :http://www.scienceforum.ru/2014/pdf/6827.pdf.
Юрицын С.В. Обзор методов графической визуализации процесса моделирования информационных систем [Электронный ресурс] / С.В. Юрицын, О.Ф. Абрамова // Студенческий научный форум 2014 :докл. VI междунар. студ. электрон.науч. конф., 15 февр. – 31 марта 2014 г. Направл.: Технические науки / РАЕ. - М., 2014. - C. 1-5. – Режим доступа :http://www.scienceforum.ru/2014/pdf/7555.pdf.
Кузьмин Д.А. Исследование проблем изучения алгоритмов компьютерной графики [Электронный ресурс] / Д.А. Кузьмин, О.Ф. Абрамова // Студенческий научный форум – 2016 :докл. VIII междунар. студенч. электрон.науч. конф. Направление «Технические науки» (секция «Проблемы моделирования, проектирования и разработки программных средств») / РАЕ. - Москва, 2016. - 3 с. – Режим доступа :http://www.scienceforum.ru/2016/pdf/18526.pdf.
Морозов О. Е.Вывод простейших графических изображении[Электронный ресурс] / Морозов О. Е./электронная база “Здесь живут знания” - 2012 – статья 8 -Режим доступа :http://podelise.ru/docs/index-25143997-3.html
Графика и расширенные средства ввода/вывода в Ассемблере [Электронный ресурс]/ Лабораторная работа 3 – 2015 - Режим доступа: http://ecm2017.studga.ru/Лабораторные/Ассемблер/Lab%203.pdf