Konyuhova_progr_ustr_Assembler
.pdfСогласно /4/, единицей перемещения мыши является «микки» - сигналы, которые подсчитывает мышь, а потом через определѐнные интервалы передаѐт драйверу. Последний использует эти сигналы для определения положения мыши, преобразуя их в пиксели на экране. Драйвер автоматически перемещает курсор на экране в соответствии с движением мыши и отслеживает координаты курсора, а также предоставляет пользовательской программе ряд функций по использованию мыши. Эти функции обрабатываются прерыванием мыши
INT 33h.
1) Начальная установка драйвера мыши.
Функция 0h (пересылается в AH) прерывания 33h производит начальную установку и возвращает информацию о текущем состоянии аппаратных и программных средств мыши. Функция определяет текущий режим экрана, прячет курсор и помещает его в центр экрана, а также задаѐт начальные значения внутренним переменным драйвера (подробнее в /3/). В качестве результата в регистре AX возвращается значение FFFFh (мышь и драйвер мыши установлены), в регистре BX – количество кнопок мыши: 0002h – две кнопки, 0003h – три кнопки, 0000h – другое количество кнопок. В противном случае, в регистре AX возвращается значение 0000h – мышь или драйвер мыши не установлены.
2) Показ/ сокрытие курсора мыши.
Драйвер мыши поддерживает внутренний счетчик, управляющий видимостью курсора мыши. Функция 2h уменьшает значение счетчика на единицу, а функция 1h увеличивает его, но только до значения 0. Если значение счетчика - отрицательное число, он спрятан, если ноль - показан.
2.1) Чтобы показать курсор необходимо в регистр AH переслать функцию 1h и вызвать прерывание 33h.
2.2) Чтобы спрятать курсор необходимо в регистр AH переслать функцию 2h и вызвать прерывание 33h.
Нужно иметь в виду, что на каждый вызов функции 2h впоследствии должен быть произведен вызов функции 1h, для того чтобы восстановить внутреннее значение флажка курсора. Кроме того, при каждом переключении режима экрана функция 2h вызывается автоматически.
41
3) Определение состояния мыши.
Для определения положения курсора мыши и состояния еѐ кнопок используется функция 3h (пересылается в AH) прерывания 33h. В качестве результата эта функция возвращает в регистре BX состояние кнопок мыши, в регистре CX – координату по оси X, в регистре DX – координату по оси Y. В регистре BX первые 3 бита (0-2) отвечают за состояние кнопок (Таблица 4.9), остальные биты не используются.
Таблица 4.9 – Биты состояния кнопок мыши
№ бита |
Описание |
0 |
Левая кнопка мыши |
1 |
Правая кнопка мыши |
2 |
Средняя кнопка мыши |
Если бит установлен (равен 1), то соответствующая кнопка нажата, если сброшен (равен 0) – кнопка отпущена.
Возвращаемые координаты совпадают с пиксельными координатами соответствующей точки на экране в большинстве графических режимов, кроме 4, 5, 0Dh, 13h, в которых Х-координату мыши нужно разделить на 2, чтобы получить номер столбца соответствующей точки на экране. В текстовых режимах обе координаты надо разделить на 8, чтобы получить номер строки и столбца соответственно.
4) Установка/ отмена обработчика событий мыши.
Вбольшинстве случаев указанная выше функция не используется
впрограммах, так как для того, чтобы реагировать на нажатие кнопки или перемещение мыши в заданную область, требуется вызывать это прерывание постоянно, что приводит к трате процессорного времени. Гораздо эффективнее указать драйверу самому следить за еѐ передвижениями и передавать управление в программу, как только выполнится заранее определенное условие (например, нажатие левой кнопки мыши). В этом случае выполнение прикладной программы временно приостанавливается, и управление передаѐтся по установленному адресу.
Такую возможность обеспечивает функция 0Ch (пересылается в AH) - установить обработчик событий. Битовая маска определяет условия, вызывающие прерывания. Установленный в 1 бит разрешает прерывание, сброшенный в 0 – запрещает прерывание. При вызове данной функции битовая маска помещается в регистр CX; описание битов маски представлено в таблице 4.10.
42
Таблица 4.10 – Описание битов маски
№ бита |
Описание |
0 |
Изменение позиции курсора мыши |
1 |
Нажатие левой кнопки мыши |
2 |
Отпускание левой кнопки мыши |
3 |
Нажатие правой кнопки мыши |
4 |
Отпускание правой кнопки мыши |
5 |
Нажата средняя кнопка мыши |
6 |
Отпускание средней кнопки мыши |
7-15 |
Не используются |
Драйвер фирмы Microsoft следит за позицией мыши, а драйверы фирм Logitech и Mouse Systems – за позицией курсора.
Также при вызове функции пара регистров ES:DX должна содержать адрес дальнего перехода на процедуру обработки прерываний.
Обработчик событий должен быть оформлен, как дальняя процедура. На входе в процедуру обработчика необходимо передать следующие параметры:
1)регистр АХ содержит условие вызова (биты установлены также как и в маске вызова);
2)регистр ВХ содержит состояние кнопок;
3)регистры СХ, DX — X- и Y-координаты курсора мыши, соответственно;
4)регистры SI, DI — счетчики последнего перемещения по горизонтали и вертикали (единицы измерения для этих счетчиков — микки, 1/200 дюйма).
После завершения работы подпрограммы работа прикладной программы возобновляется в той точке, где была прервана.
Перед завершением программы установленный обработчик собы-
тий должен быть обязательно удален (вызов функции 0Ch с СХ=0), так как иначе при первом же выполнении условия управление будет передано по адресу в памяти, с которого начинался обработчик.
5 Процесс ассемблирования и выполнения программы
5.1 Получение исполняемого модуля
Перед написанием программы, сначала нужно убедиться в наличии на компьютере файлов пакета TASM:
1)DPMILOAD.EXE;
2)DPMIMEM.DLL;
3)TASM.EXE;
43
4)TLINK.EXE;
5)TD.EXE (TDHELP.TDH - необязательно).
Для получения исполняемого файла программы необходимо:
1)создать в любом редакторе исходную программу на языке ассемблера, т.е. символьный файл, и сохранить его как файл с расширением .ASM.
2)этот файл странслировать путем ввода в командной строке следующей команды:
TASM \Путь\Имя файла.ASM /Z
После трансляции на экране появится сообщение: Assembling file: транслируемый файл.
Error messages: сообщения об ошибках. ( None - нет ошибок).
Warning messages: предупреждающее сообщение. Passes: количество страниц.
Remaining memory: занимаемая память.
Результатом работы транслятора в случае отсутствия ошибок будет файл с расширением - .OBJ - объектный модуль. В противном случае на экране появится перечень ошибок с указание их типа и местоположения. После трансляции можно получить листинг - отпечатанную программу с относительными адресами и машинным кодом.
3) Странслированный без ошибок файл необходимо обработать компоновщиком т.е. набрать в командной строке следующую команду:
TLINK \Путь\ Имя файла.OBJ /V
Результатом при отсутствии ошибок будет файл с расширением
.EXE или .COM - загрузочный модуль. Эти программы готовы к выполнению на ЭВМ. Их имена можно набрать на клавиатуре и нажать ENTER. Выполнение команд программы можно посмотреть в отладчике.
4) Для работы в отладчике необходимо иметь программу с расширением .EXE или .COM и набрать в командной строке команду:
TD \Путь\ Имя файла.EXE
Примечание. Для того чтобы посмотреть, какие ключи имеют программы TASM и TLINK, надо набрать их имена в командной строке и нажать клавишу ENTER.
44
5.2 Работа с отладчиком программ TURBO DEBUGGER
Отладчик TURBO DEBUGGER позволяет по шагам проследить процесс выполнения программы на уровне регистров процессора и ячеек памяти. Внешний вид окна отладчика представлен на рисунке
5.1.
Нижнее меню в отладчике - меню функциональных клавиш. Значения некоторых функциональных клавиш:
1)F7 – трассировка программы.
2)F8 – выполнение программы по шагам т.е. по программе перемещается полоса выбора (синяя), и будет выполнена та команда, на которой эта полоса размещена.
Примечание. Трассировка по F7 отличается от пошагового выполнения по F8 тем, то при наличии подпрограмм при трассировке будет по шагам выполняться не только основная программа, но и каждая подпрограмма, которая вызывается из основной программы.
Апри пошаговом выполнении по F8 по шагам выполняется только основная программа, а каждая подпрограмма выполняется как единый оператор.
После выполнения команды на экране появляется содержимое регистров, флагов и адрес следующей на очереди команды (соответствующие регистры подсвечиваются белым цветом).
3)F10 - выход в главное, верхнее меню.
Запускаются команды или с помощью мыши или с помощью клавиш перемещения курсора на клавиатуре. Курсором выбирается нужная команда и нажимается клавиша ENTER или нажимается левая кнопка мыши, если выбор выполнялся с помощью мыши. Выбор группы верхнего меню также может выполняться с помощью мыши или с клавиатуры (ALT+ горячая клавиши соответствующей группы).
В верхнем меню по команде FILE можно открыть любой файл, если он не был указан в команде TD при запуске отладчика.
По команде VIEW появляется еще меню, в котором DUMP - команда получения содержимого памяти по соответствующему адресу заданному в регистре DS, т.е. содержимое данных определенных в нашей программе. Данные начинаются с нулевого относительного адреса. Эти данные можно изменять.
45
1
5 4
2 |
3 |
Рисунок 5.1 – Окно отладчика
REGISTERS - после запуска этой команды появляется окно с регистрами, и данные, находящиеся в этих регистрах, можно изменять. Курсором или мышкой выбрать изменяемый регистр и перевести курсор на изменяемое данное, на клавиатуре в появившемся окне набрать новое данное и нажать ENTER.
Выход из отладчика по нажатию ALT+X.
Выход из любой команды по нажатию клавиши ESC.
Закрыть появившееся окно можно или нажать ALT+F3 или надо перевести мышкой курсор в левый угол окна на зеленый квадрат и нажать левую кнопку мыши.
Верхнее и нижнее меню обрамляют отдельные окна, содержащие следующую информацию.
1)О сегменте кода текущей программы. В этом окне отражается смещение команды относительно начала сегмента кода (регистра CS), код команды, мнемоника команды и операнды в шестнадцатеричной системе счисления.
2)О сегменте данных текущей программы. В этом окне отражается смещение данных относительно начала сегмента (регистра DS), их представление в шестнадцатеричном виде и в виде символа табли-
цы ASCII.
46
3)О сегменте стека текущей программы. В этом окне отражается смещение вершины стека (регистра SP) относительно начала сегмента стека (регистра SS) и элементы стека в шестнадцатеричном виде.
4)О регистре флагов процессора. В этом окне перечислены все флаги (кроме TF) и в процессе выполнения команд программы отображается их реакция на выполненную команду.
5)О регистрах микропроцессора. В этом окне перечислены регистры процессора и в процессе выполнения команд программы отображается их содержимое после очередной выполненной команды.
Анализируя информацию из этих окон, можно делать вывод о правильности выполнения текущей программы.
Далее рассмотрим, что представляет собой программа на языке ассемблера.
6 Программа на языке ассемблера
6.1 Структура программы
Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы.
Предложения ассемблера бывают четырех типов:
1)команды или инструкции, представляющие собой символические аналоги машинных команд. В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд микропроцессора;
2)макрокоманды - оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями;
3)директивы, являющиеся указанием транслятору ассемблера на выполнение некоторых действий. У директив нет аналогов в машинном представлении;
4)строки комментариев, содержащие любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором. Комментарий начинается с символа ―;” и действует в
пределах текущей строки.
6.2 Примеры программ
1) программа вывода на экpан стpоки символов:
47
s_s segment stack "stack" dw 12 dup(?)
s_s ends d_s segment
soob dw ‘ОК’,0ah,0dh,’$’ ;в первых апострофах то, что выводим, ;затем 0ah -пеpевод стpоки,
;0dh- возвpат каpетки, $- конец строки
d_s ends c_s segment
assume ss:s_s,ds:d_s,cs:c_s begin:
mov ax,d_s mov ds,ax
mov ah,9h ;вывод стpоки символов на экpан - функция 9h lea dx,soob ;в dx - адpес стpоки для вывода
int 21h ;выводим стpоку на экран mov ah,4ch
int 21h c_s ends end begin
Примечание. Команда LEA, в отличие от команды MOV записывает в указанный регистр адрес ячейки, где находится данное, а не само данное по этому адресу.
2) пpогpамма, использующая команды ввода-вывода (программа проверки, установлен ли математический сопроцессор)
d_s segment sum db 0 d_s ends c_s segment
assume ss:s_s,ds:d_s,cs:c_s begin:
mov ax,d_s mov ds,ax
mov al,14h ;переписать N регистра (14-хранит информацию о out 70h,al ;периферии) в 70h порт (через дополнительную
; пересылку в регистр al)
in al,71h ;прочесть содержимое 14 регистра через 71h порт test al,10b ;проверить 1-ый бит, который указывает, есть ли
;сопроцессор
jz no_c ;если не установлен 1 бит, то переход на метку
................ ;если установлен (равен 1), то выполняются следующие
.............. ;команды mov sum, al
48
no_c: mov sum, ah ;сопроцессора нет mov ah,4ch
int 21h c_s ends
end begin
3) программа, которая запрашивает символы с клавиатуры до тех пор, пока не будет нажата клавиша с символом «x».
c_s segment
assume ss:s_s,cs:c_s begin:
m1: mov ah,1h ; функция считывания символа с клавиатуры int 21h ; считывание одного символа с клавиатуры (с эхом) cmp al,'x' ;считанный символ помещается в AL
je m2 ;если была нажата клавиша с символом «x», то на m2 jmp m1 ;иначе, снова запрашивается ввод символа (на m1)
m2: mov ah,4ch int 21h c_s ends end begin
Программы, имеющие такой вид, компонуются в файл с расширением .EXE. Для инициализации ассемблерной пpогpаммы необходимо: 1) указать ассемблеpу, какие сегментные pегистpы должны соответствовать сегментам; 2) загpузить в DS адpес начала сегмента данных. Пpогpамма в фоpмате ЕХЕ может иметь любой pазмеp. Программа с расширением .COM не должна пpевышать 64 Кбайт памяти.
При определении данных, начинающихся с буквы, необходимо перед буквой ставить цифру 0.
7 Практическое занятие № 1. Управление дисплеем. Вывод символов ASCII на экран
7.1 Цель практического занятия
Цели практического занятия:
1)изучение принципов работы дисплея и функций ОС и BIOS для вывода отдельных символов с атрибутами в текстовом режиме;
2)изучение принципов работы системных часов;
3)приобретение навыков использования функций ОС и BIOS для управления дисплеем для вывода отдельных символов с атрибутами в текстовом режиме при написании ассемблерных программ;
49
4) приобретение навыков использования функций управления системными часами для организации задержек в ассемблерных программах.
7.2 Контрольные вопросы
1) Основные части видеосистемы. Понятие дисплейной страни-
цы.
2)Сколько байтов отводится на каждую позицию экрана в текстовом режиме? Какое разрешение имеет дисплей в текстовом режиме?
3)Функции управления курсором в текстовом режиме.
4)Функции вывода на экран одного символа. Особенности вывода чисел на экран
5)Распределение битов в байте атрибутов
6)Функции очистки экрана.
7)Организация задержки с помощью системных часов.
7.3 Практическое задание
Написать программу на языке ассемблера, которая выводит все символы таблицы кодов ASCII на экран в указанную позицию курсора. Символы выводятся в одну и ту же позицию с заданной задержкой и заданным цветом (каждый символ выводится другим цветом). Перед выводом символов экран необходимо очистить. Позиция на экране, время задержки и варианты распределения цвета символов выбираются самостоятельно.
8 Практическое занятие № 2. Управление дисплеем в графическом режиме
8.1 Цель практического занятия
Цели практического занятия:
1) изучение принципов видеосистемы в графическом режиме;
2) приобретение навыков использования функций, необходимых для работы в графическом режиме при написании ассемблерных программ.
8.2 Контрольные вопросы
1) Особенности растровой и векторной графики.
2) Изменение цвета фона в графическом режиме.
3) Типы видеоадаптеров.
50
