Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
С подключением как до, так и после системного.Содержание книги
Поиск на нашем сайте Иногда удобно некоторую часть обработки выполнить до системного обработчика, а некоторую часть после. При получении управления, наш обработчик запоминает в ячейке tail содержимое хвостового указателя. Затем управление передается в системный обработчик. После возврата из системного обработчика, сохраненное содержимое хвостового указателя сравнивается с текущим значением, полученным из ячейки 40h:1Ch. Если системный обработчик не сместил хвостовой указатель, это значит, что была нажата какая-то управляемая клавиша (Shift),(Alt) и т.д. В этом случае необходимость в дальнейшем анализе отсутствует. Если указатель сместился, то в буфер был введен очередной код, который, очевидно, помещен в буфер по адресу, сохраненному в ячейке tail. Таким образом, предыдущая программа написана не совсем корректно. В ней не рассматривалась возможность наличия управляемых клавиш, которые ничего не заносят в буфер. Нажатие управляемых клавиш приведет к тому, что предыдущая программа снова проанализирует предыдущий символ, который скорее всего был проанализирован ранее. Правда, такой повторный анализ не приведет к ошибке. Если использовать в резидентной программе регистр DS, то каждая команда с адресацией к памяти получается на один байт короче, т.к. будет отсутствовать байт префикса замены регистра.
CODE_SEG SEGMENT ASSUME CS:CODE_SEG,DS:code_seg ORG 100H START: JMP BEGIN
int_2Fh_vector DD? old_09h DD? tail DW 0 ;============================================================================= ; ;============================================================================= new_09h proc far
push AX push ES
mov AX,40h; Настроим ES на сегментный mov ES,AX; адрес области данных BIOS
mov AX,ES:[1Ch]; Сохраним адрес хвоста перед обработкой mov CS:tail,AX
pop ES pop AX
pushf; В системный обработчик call CS:old_09h; с возвратом
push AX push BX push ES
mov AX,40h; Настроим ES на сегментный mov ES,AX; адрес области данных BIOS mov BX,CS:tail; Адрес нового хвоста cmp BX,ES:[1Ch]; Хвост сместился? je go_out; нет – на выход
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
В командах, где обращение выполняется по абсолютному адресу, необходимо указывать обозначение сегментного регистра. Так, командуя mov AX,[1ch] засылает в АХ число 1сh (квадратные скобки не определяют косвенную адресацию), в то время, как, командуя mov AX DS: [1ch] загружает в АХ содержимое слова памяти расположенного по адресу DS:1ch. Указание регистра DS в программной строке не приводит к добавлению к коду команды префикса замены сегментного регистра, так как все команды с обращением к памяти по умолчанию используют для адресации именно регистр DS.
|
||
|
Последнее изменение этой страницы: 2017-02-07; просмотров: 291; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.128 (0.007 с.) |