Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка наличия собственного обраб. прерывания 
:(
    Опции темы
Martin_8
Дата 23.10.2006, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.10.2006
Где: Минск

Репутация: нет
Всего: нет



Здравствуйте
Пытаюсь написать прогу, по следующему заданию:
Цитата

Разработать программу, которая будет устанавливать новый обработчик прерывания от клавиатуры (или другого). Для установки новых векторов прерываний использовать функции 25h и 35h прерывания 21h. 
Программа установки нового обработчика должна обеспечить проверку наличия нового обработчика в памяти и выводить сообщение "Обработчик уже есть в памяти" либо "Обработчик успешно установлен". В первом случае программа завершает работу без установки резидента. Во втором - заменяет вектор прерывания и завершает работу оставляя резидентную часть в памяти

Обработчики прерываний 1Сh и 09h:
Каждые 5 секунд выводит в правом нижнем углу экрана очередной символ латинского алфавита (новый обработчик 1Сh). Нажатие F2 приводит к восстановлению прерываний 09h и 1Сh


Подскажите, пожалуйста, как можно проверить наличие нового обработчика в памяти?  smile 

Реализация остальной части проги.:
Код

.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


PM   Вверх
anwe
Дата 23.10.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



Слышал про такое: мультиплексорное прерывание и при спецификацию AMIS? Это нужно не только для тебя, чтобы ты определял есть ли в памяти резидент или нет. Это нужно и для DOS.
Начало каждого обработчика должно быть согласно этой спецификации. Там хранится информация, в частности, и адрес предыдущего обработчика.
Функции, поддерживаемые AMIS - проверка наличия резидента, запрос на активацию, выгрузка из памяти, список перехваченых клавиш и по-моему еще что-то.
Вот и поищи. Тема немаленькая, в размеры форума не впишешь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0393 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.