Здравствуйте Пытаюсь написать прогу, по следующему заданию:
| Цитата | Разработать программу, которая будет устанавливать новый обработчик прерывания от клавиатуры (или другого). Для установки новых векторов прерываний использовать функции 25h и 35h прерывания 21h. Программа установки нового обработчика должна обеспечить проверку наличия нового обработчика в памяти и выводить сообщение "Обработчик уже есть в памяти" либо "Обработчик успешно установлен". В первом случае программа завершает работу без установки резидента. Во втором - заменяет вектор прерывания и завершает работу оставляя резидентную часть в памяти
Обработчики прерываний 1Сh и 09h: Каждые 5 секунд выводит в правом нижнем углу экрана очередной символ латинского алфавита (новый обработчик 1Сh). Нажатие F2 приводит к восстановлению прерываний 09h и 1Сh
|
Подскажите, пожалуйста, как можно проверить наличие нового обработчика в памяти?
Реализация остальной части проги.:
| Код | .model small .stack 256 .186 .data time = 92 old_interrupt dd ? .code start:
;инициализируем видеорежим (на всякий случай) mov ax,3 int 10h
mov ax,@data mov ds,ax ; запрет прерываний cli ; читаем вектор прерывания: для это в регистр al загружаем ; номер вектора (в данном случае он 1ch), при этом в рехистр ah ; загружаем номер функции, выполняющей это чтение (35) mov ax,351ch int 21h ; в old_interrupt сохраняем смещение для вектора прерывания 1ch ; а также значение сегментного регистра которые оказались в ; в регистрах es:bx после вызова функции mov word ptr cs:old_interrupt,bx mov word ptr cs:old_interrupt+2,es ; заносим в стек значение сегментного регистра ds push ds ; заносим в ds адрес сегмента функции my_interrupt через ax: prep->ax->ds ; заносим в dx смещение функции my_interrupt, тем самым инициализировав пару ; ds:dx для вызова функции 25, которая устанавливает новый обработчик ; прерывания mov ax,seg my_interrupt mov dx,offset my_interrupt mov ds,ax mov ax,251ch int 21h ; возвращаем сегментному регистру ds его значение, сохраненное в стеке pop ds ; разрешение прерываний sti pushf
;------- xor ax,ax int 16h ;ожидание ;------ call goBack
popf ; стандартный выход mov ah,4ch int 21h
; мой новый обработчик прерываний
my_interrupt proc push es push di push ax
dec cs:timer_count jnz intexit mov ax,time mov cs:timer_count,ax ;обновить счетчик
mov ax,0b800h mov es,ax ; ah -- атрибут цвет фона цвет символа mov ah,010 mov al,cs:def_char inc cs:def_char mov di,(80*5+5)*2 stosw ;записали в видео память
intexit: pop ax pop di pop es iret my_interrupt endp
;****************************************** ;out_chars proc ;mov dx,cx ;mov cx,2000 ;next_face: ; mov es:[di],ax ; add di,2 ;loop next_face ;mov cx, dx ;ret ;out_chars endp ;****************************************** ; восстановление старого вектора прерывания goBack proc mov ax,251ch mov dx,word ptr cs:old_interrupt+2 mov ds,dx mov dx,word ptr cs:old_interrupt int 21h ret goBack endp def_char db 'A' timer_count dw 1 ;18.2(тиков в сек.)*5 сек
end start
|
|