Методическое руководство к курсовой работе по дисциплине Assembler ibm pc содержание

Вид материалаРуководство

Содержание


Endp main
Ctrl-C. Функции ввода/вывода в своём большинстве проверяют код 03h в кольцевом буфере клавиатуры и при его обнаружении вызывают
Prg3. Запрет прерываний по Ctrl-C и Ctrl-Break (первый вариант)
Подобный материал:
1   2   3   4   5   6   7   8   9
^

Endp main


END main ;Конец программы/точка входа

Комментарий:

Поля данных основной программы находятся, как это и положено, в сегменте данных, а обработчика new_1Ch в сегменте кода обработчика. Это структурирует программу, но обязывает программиста быть внимательным при выполнении ссылок в обработчике к данным, находящимся в памяти. Функция 02h int1Ah выводит время CMOP- часов в двоично-десятичном формате (код BCD), поэтому в состав обработчика new_1Ch включена подпрограмма bcd_ascii перевода в двоичную ASCII- строку. В обработчике применён непосредственный вывод в видеопамять (текстовый режим: 25 строк по 80 символов), когда каждое знакоместо представляется двумя байтами: символом и его атрибутом (атрибут задаёт цвет символа и фон под ним). Начальная позиция курсора задаётся переменной locate и представляет собой смещение знакоместа в диапазоне от B800h:0000h (левый верхний угол) до B800h:0F9Eh (правый нижний).

Здесь не приходится думать о каких-либо способах сцепления обработчиков, поскольку это реализовано естественным путём, а именно включением обработчика 1Ch (а, следовательно, и new_1Ch) в состав системного обработчика 08h.

7. Клавиатура и системный обработчик 09h

Для уверенной работы с компьютером полезно понимать, каким образом вводятся и обрабатываются символы, вводимые с клавиатуры. Процесс взаимодействия системного обработчика прерываний от клавиатуры иллюстрируется схемой рис. 5. Работой клавиатуры управляет контроллер клавиатуры, который в сою очередь обменивается информацией с системным обработчиком с помощью портов 60h и 61h. Эти порты доступны по чтению и записи. При этом порт 60h – по чтению – является портом данных клавиатуры, в который заносится скан-код (номер клавиши) последней нажатой клавиши. Порт 61h – это регистр, управляющий работой не только клавиатуры, но и другими устройствами (например, динамиком). Если в старший бит порта 61h записать “1”, клавиатура будет заблокирована, “0” – разблокирована. После чтения обработчиком скан-кода из порта 60h необходимо установить бит 7 в порту 61h в “1”, с последующим возвращением его в исходное состояние (данный механизм будет продемонстрирован в программе prg3).

Считанный с порта 60h скан-код анализируется системным обработчиком 09h на предмет того, какая клавиша нажата – алфавитно-цифровая, клавиша с расширенным ASCII- кодом или управляющая. Если клавиша алфавитно-цифровая, то её ASCII- код (младший байт) и скан-код (старший байт) помещаются в кольцевой буфер клавиатуры (см. рис. 5). Если клавиша имеет расширенный ASCII-код (все функциональные клавиши F1…F12, клавиши управления курсором Home, End, PgUp, PgDown, ←, ↑, →, ↓ и др.), то этот двухбайтовый код с нулевым младшим байтом также помещается в кольцевой буфер. Наконец, если нажата управляющая клавиша (Caps Lock, Shift, Ctrl, Alt, Num Lock, Scroll Lock, SysReg, Insert, Pause), то обработчик меняет соответствующий флаг в слове состояния клавиатуры (два байта по адресу 40h:17h и 40h:18h). Клавиша Insert является единственной, которая при нажатии выдаёт как код символа в буфер клавиатуры, так и меняет статус соответствующего флага клавиатуры. Кроме того, существует несколько комбинаций, которые не генерируют скан-коды, но распознаются системным обработчиком для вызова специальных процедур: Ctrl-Break, Ctrl-Alt, Ctrl-Alt-Del, Shift-PrtScr, PrtScr.

Слово-состояние клавиатуры и кольцевой буфер клавиатуры опрашивается обработчиком прерывания BIOS 16h, при этом функции DOS получают сведения о нажатых клавишах только через это прерывание.





Вернёмся к рассмотрению кольцевого буфера клавиатуры. Сформированный обработчиком двухбайтовый код алфавитно-цифровой или функциональной клавиши, или сочетания управляющих и функциональных клавиш, например, Shift F1, Ctrl-Home, Alt-Insert и т.п., засылаются в кольцевой буфер по адресу, хранящемуся в хвостовом указателе (40h:1Ch). Этот адрес всегда указывает на первую свободную ячейку буфера, увеличиваясь на 2 после выполнения очередной записи в буфер. Каждое последующее нажатие на какую-либо клавишу заносит в буфер очередной код и смещает хвостовой указатель. Выполняемая на компьютере программа, может получить код нажатой клавиши, если обратится к каким-либо системным средствам DOS (прерывание 21h) или BIOS (прерывание16h), которые считывают двухбайтовый код из кольцевого буфера по адресу, хранящемуся в головном указателе (40h:1Ah) с последующим увеличением адреса на 2. Следовательно, программный запрос на ввод символа с клавиатуры, фактически воспринимает код не с клавиатуры, а с кольцевого буфера. Хвостовой указатель, увеличиваясь в процессе занесения в буфер кодов, доходит до его конца (40h:3Ch), а затем – при записи очередного кода – заново устанавливается на его начало (40h:1Eh) и так далее по кольцу. Аналогичные изменения происходят и с головным указателем. Буфер может хранить 15 нажатий клавиш и считается заполненным, когда разность между указателями становится равным 2 (содержимое 1Сh меньше на 2 содержимого ячейки 1Ah).

Если на компьютере не выполняется никакая программа, то в активном состоянии находится командный процессор DOS Command.com, который находится в режиме ввода команды, с помощью функции DOS 0Ah прерывания 21h. Поступающие при этом с клавиатуры символы, заносятся в кольцевой буфер, а оттуда во внутренний буфер данных DOS c отображением вводимых символов на экране в командной строке DOS. При получении кода клавиши Enter, функция 0Ah завершает работу, а процессор Command.com, анализируя буфер DOS, приступает к выполнению команды.

8. Особенности обработки прерываний по Ctrl-C и Ctrl-Break

(дополнительно: об особенностях взаимодействия клавиатурного и системного контроллеров прерываний и учёта значений сегментных регистров в обработчиках прерываний)

В данном параграфе рассматриваются достаточно сложные для программистов вопросы, связанные с обработкой в компьютере процедур, вызванных известным нажатием клавиш Ctrl-C или Ctrl-Break, а также ряд вопросов по реализации аппаратных прерываний от клавиатуры.

Во многих прикладных программах сочетание клавиш Ctrl-C зарезервировано для принудительного завершения программы(для этого сочетания клавиш формирует код ASCII 03h). Все сервисные функции DOS делятся на две группы – функции ввода/вывода с номерами 01h – 0Ch и все остальные с номерами 00h, 0Dh – 6Ch, которые условно называют “дисковыми” (обслуживают в основном операции с дисками и файлами). Различие двух указанных групп проявляется в том, что каждая из них:
  • имеет свой внутренний стек, который и используется при вызове соответствующей сервисной функции из прикладной программы,
  • По-разному выполняется проверка на ^ Ctrl-C. Функции ввода/вывода в своём большинстве проверяют код 03h в кольцевом буфере клавиатуры и при его обнаружении вызывают прерывание Int 23h. Системный обработчик этого прерывания завершает текущею программу вызовом известной нам функции DOS 4Ch. Дисковые функции выполняют проверку на Ctrl-C лишь в том случае, если установлен флаг Break, то есть была выполнена команда DOS Break on.

Поскольку проверка на Ctrl-C осуществляется только при выполнении функции DOS, нажатием на Ctrl-C в системе MS-DOS нельзя завершить чисто вычислительную задачу, - надо ждать вызова какой-нибудь системной функции. Однако завершение задачи нажатием клавиши Ctrl-C является не всегда желательным действием, так как при этом могут остаться не восстановленными изменённые вектор прерываний. Именно, поэтому ряд прикладных программ вводят собственные обработчики прерывания new_Int23h.

Система MS-DOS предоставляет и другую возможность вмешательства в ход исполнения программы – нажатие клавиш Ctrl-Break. Распознавание этой комбинации также осуществляется системным обработчиком 09h. При этом выполняется прерывание BIOS 1Bh, содержащее единственную команду Iret. Однако в процессе начальной загрузки компьютера DOS подменяет вектор BIOS 1Bh своим обработчиком. Обработчик DOS 1Bh выполняет следующие действия:
  • Очищает кольцевой буфер клавиатуры,
  • Записывает флаг Ctrl-Break (код 03h) в ячейку области данных BIOS по адресу 40h:71h.
  • Записывает код 03h в буферный регистр драйвера последовательного порта CON.

Последнее обстоятельство для функций DOS ввода/вывода равносильно записи данного кода в кольцевой буфер клавиатуры. Поэтому, если прикладная программа вызывает какую-либо функцию DOS, выполняющую проверку на Ctrl-С, то управление опять будет передано обработчику Int 23h. Следовательно, системная обработка сочетания клавиш Ctrl-С и Ctrl-Break выполняется фактически одинаково, хотя отличие есть. Дело в том, что драйвер ввода/вывода на консоль CON (именно его используют соответствующие функции DOS) анализирует в кольцевом буфере клавиатуры только самый последний из введённых символов, поэтому если перед нажатием Ctrl-С были нажаты какие-либо другие клавиши, то они будут маскировать код 03h (признак этой комбинации). Ввод же Ctrl-Break с обработчиком DOS 1Bh записывает код 03h не в кольцевой буфер, а непосредственно в буферный регистр драйвера CON. Поэтому комбинацию Ctrl-Break нельзя замаскировать.

Программы, желающие исключить прерывание по Ctrl-Break, используют собственный обработчик 1Bh по Ctrl-Break, которые, как правило, содержат единственную команду Iret.

Для исключения же прерывания по Ctrl-С можно вместо замены системного обработчика Int 23h новым, прикладным, ликвидировать саму причину вызова этого обработчика, изменив системный обработчик 09h.1 Новый обработчик new_09h, считывая данные порта 60h должен сравнивать этот скан-код с кодом клавиши С (2Eh) и при его обнаружении проверять статус клавиши Ctrl в байте флагов клавиатуры. Если она также нажата, то необходимо сбросить второй по номеру бит (см. рис. 5). Двух этих операций вполне достаточно, чтобы программа не реагировала на нажатие комбинаций Ctrl-С и Ctrl-Break. В программе prg3 реализован предложенный способ исключения прерываний. Основной модуль программы осуществляет вывод на экран в бесконечном цикле символы ‘*’ с помощью функции DOS 02h. Выход из программы возможен только при нажатии клавиши ESC.

^ Prg3. Запрет прерываний по Ctrl-C и Ctrl-Break (первый вариант)

IDEAL

MODEL small

P486N

STACK 256

DATASEG

;Поля данных программы и место для хранения перехватываемых векторов

old_09h DD ?

old_1Bh DD ?

CODESEG