Страница 1 из 2
Вызов программы из int 09h (intel, нечто вроде i80286)
Добавлено: 24 июн 2009, 21:46
MiReQ
Проблема такова:
надо как-то вызвать из прерывания 09h (IRQ 1) процедуру (или запустить программу), использующую функцию 08h (чтение символа без эха) прерывания 21h (DOS).
Вроде, из-за этого у меня прога и виснет...
тело моего обработчика 09h:
Код: Выделить всё
S_CODE equ 1Fh
int09h proc
push ax
in al,60h
cmp al,S_CODE
je s
oldhandler_jmp:
pop ax
jmp cs :o ldhandler
s:
push es
push ax
xor ax,ax
mov es,ax
pop ax
mov ah,es:[417h]
pop es
test ah,04h
jz oldhandler_jmp
call test
in al,61h
mov ah,al
or al,80h
out 61h,al
xchg ah,al
out 61h,al
mov al,20h
out 20h,al
pop ax
iret
oldhandler dd 00h
int09h endp
перехватчик прерывания:
Код: Выделить всё
setint proc
push ax
push bx
push dx
push si
push es
mov si,offset oldhandler
mov ax,3509h
int 21h
mov [si],bx
mov [si+2],es
mov ax,2509h
mov dx,offset int09h
int 21h
pop es
pop si
pop dx
pop bx
pop ax
ret
setint endp
Re: Вызов программы из int 09h (intel, нечто вроде i80286)
Добавлено: 24 июн 2009, 23:54
somewhere
а где, собственно, сама процедура test? Как всегда самое главное забываем выложить
Re: test proc
Добавлено: 25 июн 2009, 09:54
MiReQ
Код: Выделить всё
test proc
push ax
push si
push es
mov ax,0B800h
mov es,ax
mov si,cs:shift
mov ax,0FF2Dh
mov es:[si],ax
add si,02h
mov cs:shift,si
mov ah,08h
int 21h
mov ax,0B800h
mov es,ax
mov si,cs:shift
mov ax,0FF2Dh
mov es:[si],ax
add si,02h
mov cs:shift,si
pop es
pop si
pop ax
ret
shift dw 0000h
test endp
Re: Вызов программы из int 09h (intel, нечто вроде i80286)
Добавлено: 25 июн 2009, 09:58
airyashov
нет ничего интереснее читать символы с помощью прерывания перехватывая работу клавиатуры, в такой ситуации как у Вас буфер клавиатуры будет пуст, скорее всего.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
лучше сформулируйте задачу что нужно конкретно сделать
Re: Вызов программы из int 09h (intel, нечто вроде i80286)
Добавлено: 25 июн 2009, 10:02
MiReQ
airyashov писал(а):нет ничего интереснее читать символы с помощью прерывания перехватывая работу клавиатуры, в такой ситуации как у Вас буфер клавиатуры будет пуст, скорее всего.
почему? ведь если клавиша не моя, я возвращаю управление старому обработчику...
Код: Выделить всё
in al,60h
cmp al,S_CODE
je s
oldhandler_jmp:
pop ax
jmp cs :o ldhandler
Re: Вызов программы из int 09h (intel, нечто вроде i80286)
Добавлено: 25 июн 2009, 10:10
somewhere
" писал(а): mov ah,08h
int 21h
Нельзя читать данные с клавиатуры во время обработки прерывания нажатия клавиши. Почему? Потому что прерывание еще не завершено и пока мы не сделаем
" писал(а): mov al,20h
out 20h,al
оно и не придет и внутри процедуры чтения MS-DOS образуется бесконечный цикл. Так же учтите, что любой INT разрешает прерывания, а этого делать нельзя ни в коем случае при обработке самого прерывания. Вообщем что хотите делайте, но меняйте логику программы.
Re: Вызов программы из int 09h (intel, нечто вроде i80286)
Добавлено: 25 июн 2009, 10:17
MiReQ
airyashov писал(а):
лучше сформулируйте задачу что нужно конкретно сделать
Изначальная задача такая:
Написать резидентный словарик.
при нажатии Ctrl+S выскакивает окошко словаря.
В словаре вводится слово (сделал через int 08h), рисуется его перевод из файла.
Выход - Alt+X (сделал так же через int 08h)
Так вот. Написал сам словарик, только без резидента и без перехвата прерываний (т.е. запускаешь, и уже появляется само окошко).
Собственно, теперь пытаюсь приклеить к нему резидент и прерывание.
Re: Вызов программы из int 09h (intel, нечто вроде i80286)
Добавлено: 25 июн 2009, 10:26
somewhere
Тогда надо делать по другому.
1) В обработчике прерывания запомнить адрес возврата из стека (RETADDR)
2) Если нажато Ctrl+S то выставить флаг.
3) По нажатию Alt-X сбросить флаг
4) Передать управление процедуре-обработчику MS-DOS
5) Если выставлен флаг, то заменить на стеке адрес возврата на адрес нужной вам функции test
В конце функции тест выполнить переход по RETADDR. Функция TEST должна читать только один символ.
Re: Вызов программы из int 09h (intel, нечто вроде i80286)
Добавлено: 25 июн 2009, 10:27
airyashov
Я нечто похожее писал, но всегда через флаги запуска/сброса, использую прерывания таймер+клавиатура. Принцип работы программы как хранитель экрана.
Re: работа со стеком
Добавлено: 25 июн 2009, 11:08
MiReQ
somewhere писал(а):Тогда надо делать по другому.
1) В обработчике прерывания запомнить адрес возврата из стека (RETADDR)
2) Если нажато Ctrl+S то выставить флаг.
3) По нажатию Alt-X сбросить флаг
4) Передать управление процедуре-обработчику MS-DOS
5) Если выставлен флаг, то заменить на стеке адрес возврата на адрес нужной вам функции test
В конце функции тест выполнить переход по RETADDR. Функция TEST должна читать только один символ.
Спасибо большое! Работает
P.S. Сейчас доделаю, и выложу весь код, может кому-нибудь понадобится...