Методическое пособие для выполнения лабораторных работ и КР, страница 19
Описание файла
PDF-файл из архива "Методическое пособие для выполнения лабораторных работ и КР", который расположен в категории "". Всё это находится в предмете "системное программирование" из 4 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 19 страницы из PDF
Дляработы с буфером клавиатуры предусмотрено два указателя на начало (голову списка Head) и на конец (хвост списка - Tail). Если эти указатели равны, то список пуст.Кроме того, в системной области фиксируется информация о нажатии управляющих клавиш (таких как Alt, Ctrl и др.) Расположение специальных полей в системной области (0400Н), позволяющих работать с буфером клавиатуры (более подробно содержаниесистемной области смотрите в справочниках – General Memory Map) показано ниже:По адресу 0417h – находится информация (размером в 2 байта) о нажатии специальных управляющих клавиш (Ctrl, Alt, Shift и др.), подробнее о содержаниисмотрите в справочниках.По адресу 041Аh – находится адрес головы циклического буфера (2 байта)По адресу 041Сh – находится адрес головы циклического буфера (2 байта)По адресу 041Eh (32 - байта) – циклический буфер клавиатурыНа основе этой информации можно установить код символа, стоящего в очередь наобработку, и информацию о нажатии управляющих клавиш. Использование буфера клавиатуры возможно после вызова стандартного обработчика прерывания от клавиатуры.Работа через порт.
При использовании порта ввода/вывода можно прочитать коднажатой клавиши в порта А контроллера 8255 (60Н). Это может быть выполнено в программе собственного обработчика с помощью следующей команды:IN AL , 060H; чтение скан-кода клавишиПолученный скан-код (см. раздел - 23.5. SCAN – коды), можно использовать в программе. Для получения признака нажатия управляющих клавиш (Shift, Ins и др. см.
всправочнике) можно использовать специальное прерывание BIOS. В примере, расположенном ниже проверяется нажатие клавиши Shift совместно с клавишей ‘Q’.INAL, 60H; Взять из порта 60Н сканкод на регистр ALCMP AL , 10H; Проверка нажатия ’Q’, скан код не зависит от регистраJNEOLD; Переход на стандартный обработчик; проверка клавиши Shift (первый бит в байте состояния управляющих клавиш)MOV AH , 02HINT 016H; Получим управляющий байт на ALTEST AL , 00000010b; Проверим на 1JZ OLD; Переход на стандартный обработчик, если 0Для завершения самостоятельной обработки необходимо через порт В контроллера8255 (61Н) передать информацию о считывании скан-кода. Для этого нужно выполнитьследующие команды:IN AL, 61HOR AL, 10000000bOUT 61H, ALAND AL, 01111111bOUT 61H, AL; Считаем старое состояние; Установим 7-й бит в 1; Запишем в порт; Сбросим 7-й бит; Запишем в портДанные команды позволяют подтвердить прием скан-кода из клавиатуры.
Если далее нам не нужно обрабатывать стандартным обработчиком данное прерывание, то необходимо передать сигнал (20Н – EOI END OF INTERUPT) в порт контроллер прерываний.Это делается командами:MOV AL,20HOUT 20H,ALPOP AXIRETЕсли нужно завершить обработку с системным обработчиком прерываний, то нужно ему передать управление:OLD:POP AX862010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”STIJMPCS:SAVEINT9; Вызов старого обработчикаРабота с буфером клавиатуры. При работе с буфером клавиатуры целесообразновызвать старый обработчик предварительно. Это можно сделать так:NEWINT9:PUSHAXPUSH CSPOPDSPUSHFCALL CS:SAVEINT9; Сохранение используемых регистров; для работы с данными; Это обязательно для корректного возврата; Вызов старого обработчикаДля полноты работы с клавиатурой нужно иметь возможность получить информацию об управляющих клавишах и значение введенного кода( скан-кода, ASCII кода ирасширенного ASCII кода).
Для проверки нажатия управляющих клавиш можно прочитать специальный байт по адресу 0417 из системной области. Это можно сделать так:; проверка левого шифтаMOV AX , 40H; сегментный адрес системной областиMOV ES , AXMOV AL , ES:17H; смещение для управляющего байта состояния клавишTEST AL , 00000010b ; проверка второго битаJZ PROD; переход если левый шифт не нажатТакие действия можно выполнить и по-другому, основываясь на прерывании BIOS02H – 16H:MOV AH , 02HINT16H; BIOS прерывание для получения управляющего байтаTEST AL , 00000010b ; проверка второго битаJZ PROD; переход если левый шифт не нажатЕсли символ прочитанный с клавиатуры не должен появляется на экране (например, в окне COMMAND.COM) необходимо обнулить буфер клавиатуры.
Это можно сделать, установив одинаковые значения указателей циклического буфера. Например, так:MOV AX , 40HMOV ES , AXMOV BX , ES:1AHMOV ES:1CH , BXПосле такой операции введенный символ не будет выводиться на экран командногопроцессора. Это можно сделать и так:MOV AH , 00HINT16H; код команды чтения символа и выборки из буфера; BIOS прерывание для получения управляющего байтаЕсли буфер клавиатуры пуст, то программа будет ожидать нажатия клавиши. Избуфера клавиатуры можно прочитать коды нажатой клавиши или их комбинации напрямую.
Это может быть сделано так:MOVMOVMOVMOVAX ,ES ,BX ,AX,40HAXES:1AHES:[BX]После такой операции на регистрах AH и AL заносится комбинация кодов, на основе которых можно выделить следующее: ASCII символ, скан-код или расширенныйASCII код. Это можно сделать и так:MOV AH , 01HINT16H; код команды чтения символа и без выборки из буфера; BIOS прерывание для получения управляющего байтаЕсли регистр AL содержит 0, то это значит, что в регистр АН занесен расширенныйASCII код, который можно анализировать. В противном случае регистр AL содержитASCII введенного символа, а регистр AH содержит скан-код нажатой клавиши.Предварительно необходимо вызвать системный обработчик прерываний.
Анализвведенного кода для проверки нажатой клавиши может быть проведен так:MOV AX , 40HMOV ES , AXMOV BX , ES:1AH872010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”MOV AX, ES:[BX] ; на АХ 2 байта их буфера клавиатуры; Проверка расширенного кодаCMP AL , 0; проверка отсутствия ASCIIJE PRINT_EXT; переход, если расширенный кодCMP AL ,61H ; Проверка символа ’a’JNE EXITCMP AH, 1EH; Проверка нужного скан-кода для клавиши ’A’JNE EXIT…PRINT:…; Проверка комбинации расширенного кодаPRINT_EXT:CMP AH , 5ЕH; Ctrl + F1JNE EXIT; Переход если не наша комбинация…JMP PRINTВ данном примере сначала на AX из буфера клавиатуры получаем два байта.
Затемпроверяем AL на 0. Нулевое значение свидетельствует о наличии расширенного кодаASCII и мы переходим на метку для его анализа (PRINT_EXT). Там мы проверяем кодкомбинации Ctrl + F1( код - 5E). Если код ASCII (AL != 0), то проверяем нужный код в регистре AL (у нас 61Н – код строчной буквы ‘а’). Для иллюстрации наличия скан-кода клавиши ‘А’ делаем дополнительную проверку регистра AH, куда помещен скан-код этойклавиши – 1ЕН. Если код не соответствует, то уходим на выход из процедуры.Практике программирования и в курсовой работе по СП Вы можете выбрать любойиз вариантов для обработки прерываний от клавиатуры.18.21.
Освобождение памяти внешнее из отдельной программыОсвобождение памяти под резидент и восстановление векторов прерываний старыхобработчиков прерываний. Вы можете выполнить и вне резидента, в отдельной программе. Для этого нужно вычислить адрес начала резидентной программы и PSP, а затем выполнить действия по восстановлению старых векторов прерываний и освобождению оперативной памяти. Трудности может составить получение адресов сохраненных старых адресов вектора прерываний. Если разместить переменную для сохранения старого адресаобработчика непосредственно перед точкой входа в процедуру обработки прерываний, тополучить этот адрес несложно, вычитая из этого адреса четыре.SAVEINT9 DD ?; Сохранение старого обработчика;Новый обработчик прерывания 09НNEWINT9:PUSHAX; Сохранение используемых регистровНачальная точка расположения резидентной программы и адрес ее PSP могут бытьполучены аналогично.18.22.
Завершение основной программы при проверке повторной загрузкиПри проверке повторности загрузки в части инициализации, программа завершается обычным образом, если она не остается резидентной. Аналогичное завершение должнобыть при выдаче справке о программе. Завершение основной программы в этих случаяхможет быть выполнена так:Либо:MOV AX , 4C00HINT 21HНа AL задается код возврата программы (ERRORLEVEL).882010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”Либо:MOV AX , 0000HINT 20H18.23.
Проверка загрузки и выгрузки с помощью утилитыmem.exeДля контроля наличия резидента в ОП нужно использовать утилиту ОСMEM.EXE. Эта утилита используется несколько раз: с ее помощью уточняется объемсвободной памяти до запуска резидента; проверяется наличие резидента в ОП и проверяется освобождение ОП под модули резидента после его выгрузки. Для этого необходимосначала уточнить параметры ее запуска, так как для Разных ОС они могут отличаться. Поэтому ее нужно запустить в режиме справки ( MEM.EXE /?). Размер свободной памяти дозагрузки резидента должен полностью соответствовать размеру свободной памяти послеего выгрузки. Запуск в режиме справки для XP:C:\work>mem /?Справка на экране:Вывод сведений об используемой и свободной памяти.MEM [/PROGRAM | /DEBUG | /CLASSIFY]/PROGRAM or /P/DEBUG or /D/CLASSIFY or /CВывод статуса программ, загруженных в память.Вывод статуса программ, внутренних драйверов и другойдополнительной информации.Классификация программ по использованию памяти.Вывод сведений о размерах программ, использовании памятии максимальном свободном блоке памяти.Если предварительно загрузить резидент (TSRKBD.COM) и проверить распределение памяти командой:C:\work>mem /pМы получим на экране следующую информацию:…Адрес------000000000400000500000700000A70002210Имя--------IOMSDOSIOРазмер-----0004000001000002000003700017A0002280Тип-----Вектор прерыванияОбласть обмена ПЗУ (ROM)Область обмена DOSСистемные данныеСистемные данныеСистемные данные0044A000500000508000567000DE2000E34000EEA000F3A000F8C000FA3000FF50027440…0D4310COMMANDMSDOSCOMMANDDOSXCOMMANDCOMMANDCOMMANDTSRKBDTSRKBDMEMMEMMSDOS000B500000700005E00087A0000510000B500004F00005100001600005100174E0078BA0Программа- Свободно ОкружениеПрограммаДанныеПрограммаОкружениеОкружениеПрограммаОкружениеПрограмма- Свободно -MSDOS00BCE0- Свободно -655360 байт - всего обычной памяти655360 байт - доступно для MS-DOS892010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”589968 максимальный размер исполняемой программы1048576 байт - всего непрерывной дополнительной памяти0 байт - доступно непрерывной дополнительной памяти941056 байт - доступной памяти XMSрезидентная часть MS-DOS загружена в сегмент HMAНа этом примере видно, что под область резидентной программы выделяется двафрагмента ОП, которые необходимо освобождать (программа и окружение).
Количествосвободной памяти в этом режиме определяется строкой: “589968 максимальный размерисполняемой программы”.18.24. Описание данных и процедур резидентаОписание данных и процедур, используемых в резидентной части, нужно размещать только в области самого резидента.BEGIN: …JMP INIT; Описания данных…; обработчики прерываний и процедуры…; Описания процедур резидентаMY_PROC PROC…MY_PROC ENDP…; Описания данных…MSG DB …INIT: …Если данные для резидента случайно описать в области части инициализации, онине будут доступны и программа резидента не сможет работать правильно.18.25. Русификация сообщений резидентаДля того чтобы резидент мог выдавать сообщения на русском языке необходимовыполнить следующие условия:− Загрузить перед запуском резидента русификатор (например, RKM – см.выше) и− Сообщения резидента закодировать в коде ASCII, для чего их необходимоввести в текстовом редакторе DOC при включенном русификаторе.