Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике Номер выпуска: | 1501 | Дата выхода: | 26.12.2011, 21:00 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 181 / 63 | Вопросов / ответов: | 1 / 1 | Консультация # 184907: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Задание. Разработать программу переопределения прерывания 05h (клавиша PrintScreen). Замечания: 1. перед загрузкой нового вектора прерывания необходимо сохра-нить старый вектор (функция 35h прерывания 21h); 2. для проверки, новая процедура обработки прерывания 05h... Консультация # 184907: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Задание. Разработать программу переопределения прерывания 05h (клавиша PrintScreen). Замечания: 1. перед загрузкой нового вектора прерывания необходимо сохра-нить старый вектор (функция 35h прерывания 21h); 2. для проверки, новая процедура обработки прерывания 05h должна выполнять действия в соответствии с вариантом задания. В основной программе необходимо организовать большой цикл, в течении которого можно будет проверить работы прерывания (прерывание 21h в этом цикле использовать нельзя, если оно будет использоваться в подпрограмме обработки прерывания; 3. вывод на экран в из подпрограммы обработки прерывания, можно выполнять, используя функции прерывания 21h, но лучше непо-средственно оперируя с видеопамятью; 4. перед выгрузкой программы из памяти восстановить старый вектор прерывания (функция 25h прерывания 21h). Таблица. Варианты заданий Подпрограмма обработки прерыван ия должны выводить на экран свой адрес в шестнадцатеричной системе счисления в форме «сегмент:смещение». (Эти данные можно прочитать из 5 ячейки таблицы векторов прерывания). Ассемблер-Tasm.exe Исполняемый файл в формате EXE. Дата отправки: 21.12.2011, 20:45 Вопрос задал: Дмитрий (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Дмитрий! Вот Вам программа, которая устанавливает на время своей работы свой обработчик вектора 5 Для вывода на экран использовал прерывание БИОС-а. Это лучше, чем прерывание ДОС-а, которое крайне нежелательно использовать в прерывании. Да и проще варианта с прямой записью в память.
Обратите внимание, что если ее просто так запустить под ХР, то программа не будет работать, как надо!!! Это связано с тем, что система некоторые комбинации клавиш и просто клавиши, в том числе PrintScreen, считает служебными и не желает отдавать их программам. Но клавишу PrintScreen можно попросить у системы, если создать PIF-файл для EXE-программы. И там, в свойствах, на вкладке "Разное" выключить checkbox "PrtSc". Запускать программу надо будет с помощью PIF-файла.
Код : .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
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий