Консультация № 184907
21.12.2011, 20:45
61.10 руб.
0 1 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Задание. Разработать программу переопределения прерывания 05h (клавиша PrintScreen).
Замечания:
1. перед загрузкой нового вектора прерывания необходимо сохра-нить старый вектор (функция 35h прерывания 21h);
2. для проверки, новая процедура обработки прерывания 05h должна выполнять действия в соответствии с вариантом задания. В основной программе необходимо организовать большой цикл, в течении которого можно будет проверить работы прерывания (прерывание 21h в этом цикле использовать нельзя, если оно будет использоваться в подпрограмме обработки прерывания;
3. вывод на экран в из подпрограммы обработки прерывания, можно выполнять, используя функции прерывания 21h, но лучше непо-средственно оперируя с видеопамятью;
4. перед выгрузкой программы из памяти восстановить старый вектор прерывания (функция 25h прерывания 21h).
Таблица. Варианты заданий
Подпрограмма обработки прерывания должны выводить на экран свой адрес в шестнадцатеричной системе счисления в форме «сегмент:смещение». (Эти данные можно прочитать из 5 ячейки таблицы векторов прерывания).
Ассемблер-Tasm.exe Исполняемый файл в формате EXE.

Обсуждение

давно
Посетитель
7438
7205
21.12.2011, 23:22
общий
это ответ
Здравствуйте, Дмитрий!
Вот Вам программа, которая устанавливает на время своей работы свой обработчик вектора 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]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа