Здравствуйте, Дмитрий!
Вот Вам программа, которая устанавливает на время своей работы свой обработчик вектора 5
Для вывода на экран использовал прерывание БИОС-а.
Это лучше, чем прерывание ДОС-а, которое крайне нежелательно использовать в прерывании.
Да и проще варианта с прямой записью в память.
Обратите внимание, что если ее просто так запустить под ХР, то программа не будет работать, как надо!!!
Это связано с тем, что система некоторые комбинации клавиш и просто клавиши, в том числе PrintScreen,
считает служебными и не желает отдавать их программам.
Но клавишу PrintScreen можно попросить у системы, если создать PIF-файл для EXE-программы.
И там, в свойствах, на вкладке "Разное" выключить checkbox "PrtSc".
Запускать программу надо будет с помощью PIF-файла.
[code h=207]
.model small
assume cs:code, ds:data, ss:Stk
Stk segment stack
dw 1024 dup (?)
Stk ends
data segment
sPress db 0dh,0ah,'Press ESC for exit...$'
Off_05 dw ? ;указатель на старый обработчик вектора 05h
Seg_05 dw ?
data ends
code segment
main proc
mov ax, data
mov ds, ax ;ds = data
mov ax, 3505h
int 21h ;узнаем вектор 05h в es:bx
mov Off_05, bx ;сохраним старый адрес в сегменте данных
mov Seg_05, es
push ds
lea dx, new_05 ;установим новый адрес
push cs ;обработчика прерывания 05h
pop ds ;ds:dx
mov ax, 2505h
int 21h
pop ds
lea dx, sPress ;выведем приглашение нажать ESC
mov ah, 9
int 21h
wait_ESC:
mov ah, 0 ;ждем
int 16h
cmp al, 1bh ;выходим по ESC
jne wait_ESC
;воcстановим старый обработчик вектора 05h
push ds ;ds
lds dx, dword ptr Off_05 ;ds:dx - адрес старого вектора
mov ax, 2505h
int 21h ;восстановим!
pop ds ;ds = data
sti
mov ax, 4c00h
int 21h ;выход в ДОС
main endp
new_05 proc far ;подпрограмма отработки 05h
push ax
push ds
mov al, 0dh ;на новую строку
int 10h
mov al, 0ah
int 10h
xor ax, ax
mov ds, ax ;сегмент векторов
mov ax, ds:[5*4+2] ;сегмент вектора 5
call PrintHex ;в hex
mov al, ':'
int 10h
mov ax, ds:[5*4] ;смещение вектора 5
call PrintHex ;в hex
pop ds
pop ax ;восстановим регистры
iret ;возврат из прерывания
new_05 endp
PrintHex proc ;вывод ax в hex
push ax
mov al, ah ;старший байт
call PutHexByte
pop ax ;младший байт
PutHexByte:
push ax
shr al, 4 ;старшая тетрада
call PutHexDigit
pop ax
and al,0fh ;младшая
PutHexDigit: ;вывод hex-цифры
add al,90h
daa
adc al,040h
daa
mov ah, 0eh ;ф-я вывода al на экран БИОС-а
int 10h
ret
PrintHex endp
code ends
end main
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен