Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
С подключением после системного обработчикаСодержание книги
Поиск на нашем сайте Рассмотрим подключение обработчика после системного. Во многих случаях прикладная обработка выполняется в качестве дополнения к системной. Системная программа BIOS отработки прерывания от клавиатуры преобразует скен-коды в коды ASCII, кроме этого выполняет массу дополнительных операций: - сходит за указателями КБВ и модифицирует их; - отслеживает нажатие (Ctrl)/(Break) и выполняет при его вводе специфические действия; - позволяет вводить в КБВ коды непосредственно в цифровом виде с помощью нажатия (Alt) и цифр на цифровой клавиатуре и т.д. Т.к. такое большое число функций не целесообразно переносить в прикладной обработчик, то во многих случаях удобнее только изменять коды в КБВ. Например, русификатор, работающий после системного обработчика, и только изменять коды ASCII в КБВ, если включен режим кириллицы. Рассмотрим простой пример. Предположим, что пользователь, работающий с простым редактором часто пользуется символами псевдографики. В этом случае целесообразно закрепить коды ASCII этих символов за какими-то клавишами или сочетаниями клавиш, заменив коды ASCII этих клавиш. Например: (Alt)/(U) - é - уголок (левый верхний уголок) и т.д.
CODE_SEG SEGMENT ASSUME CS:CODE_SEG,DS:code_seg ORG 100H START: JMP BEGIN
int_2Fh_vector DD? old_09h DD? ;============================================================================= ; ;============================================================================= new_09h proc far
pushf; В системный обработчик call CS:old_09h; с возвратом
push AX push BX push ES
mov AX,40h; Настроим ES на сегментный mov ES,AX; адрес области данных BIOS
mov BX,ES:[lCh]; Адрес нового хвоста dec BX; Сместимся назад к последнему dec BX; введенному символу cmp BX,lEh; Хвост не вышел за пределы буфера? jae go; Нет, значит он был где-то внутри буфера
mov BX,3Ch; Хвост после вычитания 2 вышел за пределы буфера, ; сл-но он был в самом начале, а последний введенный ; символ находится в самом конце буфера go: mov AX,ES:[BX]; Получим последний символ из буфера
cmp AX,1600h; Был введен расширенный код ASCII сочетания Alt/U? jne go__out; Нет
mov word PTR ES:[BX],OODAh; Да, заменим код в буфере на код уголка go_out: pop ES pop BX pop AX
iret new_09h endp
;============================================================================= ; ;============================================================================= int_2Fh proc far cmp AX,OC700h jne pass_2Fh mov AL,OFFh iret pass_2Fh: jmp dword PTR CS:[int_2Fh_vector] int_2Fh endp ;============================================================================= ; ;=============================================================================
begin: mov AX,OC700h; AH=OC7h номер процесса C7h ; AL=OOh -дать статус установки процесса int 2Fh; мультиплексное прерывание cmp AL, 0 jz not_installed; возвращает AL=0 если не установлена
lea DX,msg call print int 20h msg DB 'Уже установлена',13,10,'$'
not_instailed: mov AX,352Fh; получить вектор int 21h; прерывания 2Fh mov word ptr int_2Fh_vector,BX; ES:BX - вектор mov word ptr int_2Fh_vector+2,ES
mov DX,offset int_2Fh; получить смещение точки входа в новый ; обработчик на DX
mov AX,252Fh; функция установки прерывания ; изменить вектор 2Fh
int 21h; AL - номер прерыв. DS:DX - указатель программы обработки прер.
mov AX,3509h; получить вектор int 21h; прерывания 09h
mov word ptr old_09h,BX; ES:BX - вектор mov word ptr old_09h+2,ES;
mov DX,offset new_09h; получить смещение точки входа в новый ; обработчик на DX mov AX,2509h; функция установки прерывания ; изменить вектор 09h int 21h; AL - номер прерыв. DS:DX - указатель программы обработки прер. ;------------------------------------------------------------------------------ mov DX,offset begin; оставить программу... int 27h;... резидентной и выйти ;============================================================================= ; ;============================================================================= PRINT PROC NEAR MOV АН,09H INT 21H RET PRINT ENDP ;============================================================================= CODE_SEG ENDS END START После системного управления передается в наш обработчик, а сегментный регистр EC настраивается на начало области данных BIOS (физический адрес 400h, сегментный адрес 40h). Пусть перед вводом данного символа буфер был пуст.
Это адрес указателя а не его содержимое
Очередное нажатие клавиши вызывает нашу программу, а из нее - системный обработчик, который заносит двухбайтовый код нажатой клавиши в хвостовой элемент, перемещая хвостовой указатель на следующее слово буфера:
Головной указатель действительно указывает на последний сохраненный в буфере код, лишь, если при запуске программы буфер был пуст. Если же в процессе загрузки программы пользователь нажимал какие-либо клавиши, их коды были помещены в буфер клавиатуры, и к моменту активизации нашей программы головной указатель будет указывать не на пустую ячейку буфера, а на самый старый из введенных символов. При этом по мере занесения в буфер новых символов, обработке будет подвергаться все тот же самый старый символ. Следовательно, более надежно определять местонахождение последнего символа в буфере по адресу в хвостовом указателе. Однако не всегда этот адрес будет на 2 больше адреса последнего символа, так как буфер - кольцо. В том случае, когда очередная свободная ячейка буфера находилась в самом его конце, по адресу 40h:3Ch, после занесения туда очередного кода хвостовой указатель переместится в начало буфера, указывая на адрес 1Еh. В программе после вычитания 2 из адреса хвостового элемента, проверяется находится ли полученное значение в пределах буфера. Если оно равно или больше 1Еh, команда jae - выполняет переход на продолжение программы. Если полученное значение меньше 1Еh, то это значит, что хвостовой указатель указывает на самое начало буфера, а занесенный только что в буфер код находится в самом его конце:
Затем код нажатой клавиши извлекается из буфера и сравнивается с двухбайтовыми кодами (Alt)/(U) и др. - которые являются расширенными кодами ASCII. Если нажато одно из сочетаний, расш. Код ASCII в буфере заменяется на код ASCII символа псевдографики, без смещения указателя и осуществляется переход на go_out для завершения программы.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Последнее изменение этой страницы: 2017-02-07; просмотров: 315; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.128 (0.006 с.) |