Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.218.230] |
|
Сообщ.
#1
,
|
|
|
Слушай, не знаю откуда у меня руки растут,
но винда виснет по страшной силе когда я int 9h переопределяю. Если тебе не в лом, напиши полностью прогу которая весится на 9-е прерывание и при нажатии любой клавиши выводит ее на экран, а при нажатии 'e' - возвращает в таблицу прерываний старое значение вектора... Да, прога должна быть TSR. Ну а если тебе все-таки влом, то хоть подскажи че-нибудь. |
Сообщ.
#2
,
|
|
|
Вот оно...
Компилить (COM-файл): TASM int9.asm /m2 TLINK int9.obj /x /t При нажатии 'e' прога восстанавливает адрес старого обработчика, но память не освобождает. Т.е. прога так и будет висеть в памяти (только уже бессмысленно). .MODEL Tiny .286 .CODE ORG 100h Start: jmp SetIntVec OldInt DD ? ; Адрес старого обработчика Handler: push ax cx si di es in al,60h ; Читаем Scan-код клавиши cmp al,12h ; Scan-код клавиши 'e' je SetOldInt ; Если нажата 'e', то идти на SetOldInt or al,al ; Устанавливаем или сбрасываем флаги lea si,PressMsg jns Press ; Прыгаем, если флаг SF=1 (AL >= 80h, т.е. клавиша отпущена) lea si,ReleaseMsg Press: and al,7Fh ; Чтобы код клавиши был < 80h push ax mov ax,0B800h mov es,ax xor di,di ; ES:DI = Видеопамять mov cx,Len cld mov ah,15 ; Цвет NextChar: lods BYTE PTR cs:[si] stosw ; Копируем текст в видеопамять loop NextChar pop cx mov al,cl shr al,4 ; AL = Старшая цифра call PrintDigit ; Выводим цифру mov al,cl and al,0Fh ; AL = Младшая цифра call PrintDigit ; Выводим цифру Exit: pop es di si cx ax pushf call cs:OldInt ; Вызываем старый обработчик Int 9 iret ; Выходим SetOldInt: xor ax,ax mov es,ax ; ES = Таблица прерываний mov ax,WORD PTR cs:OldInt[0] mov es:[9*4+0],ax ; Восстанавливаем смещение старого обработчика mov ax,WORD PTR cs:OldInt[2] mov es:[9*4+2],ax ; Восстанавливаем сегмент старого обработчика jmp Exit ; Все на выход!!! PressMsg DB 'Нажата клавиша с кодом: ' Len = $-PressMsg ReleaseMsg DB 'Отпущ. клавиша с кодом: ' ; Вывод цифры в AL PrintDigit proc add al,'0' ; ... cmp al,'9' ; ... jbe Ok ; ... add al,'A'-('9'+1) ; Преобразуем в HEX-цифру Ok: stosw ; Выводим цифру ret PrintDigit endp SetIntVec: mov ax,3509h int 21h ; Получаем адрес старого обработчика mov WORD PTR OldInt[0],bx mov WORD PTR OldInt[2],es mov ah,25h lea dx,Handler int 21h ; Устанавливаем новый обработчик mov ah,49h ; Советую вот эту штуку делать, mov es,ds:[2Ch] ; если не используешь Environment int 21h ; (лишнюю память освобождаешь) lea dx,SetIntVec int 27h ; Вешаемся как TSR END Start |
Сообщ.
#3
,
|
|
|
Сенькю вери мач )
|