Ассемблер? Это просто! Учимся программировать (FAQ)
______________________________________
Выпуск N 002
Вопросы, которые поступили от подписчиков рассылки "Ассемблер? Это просто! Учимся программировать"
Дата выхода: 2001-05-04
Вопрос
Не могу отладить програму из 10 выпуска (перехват 9 функции прерывания 21h) При запуске программы происходит ошибка на строке int 27h (завершить и остаться резидентной). Операционная система WinME, TASM 3.2. Заранее благодарен.
Green
Ответ
Уважаемый Green!
В Вашей программе были исправлены некоторые ошибки:
1. В процедуре обработки прерывания перед вызовом оригинального обработчика перехваченного прерывания командой call нужно заносить в стек флаги, но не доставать их после этого! Вот пример:
Где находится программа (точка входа) обработки прерывания 21Н в памяти компьютера в DOS режиме и как её найти? Мне известно, если я не ошибаюсь, что таблица адресов прерываний начинается с нулевого адреса 0000:0000, на каждый адрес отводится 4 байта, соответсвенно адрес 21-го прерывания находится по адресу 0000:0084, а там записано 09 00 41 28, причём в 86 и 87-ой ячейке памяти могут быть другие значения. А дальше я не знаю как применить информацию из этих 4-ёх байтов, как не пытался по этому адресу 0900:4128 или 0009:2841 находится какая-то белиберда.
Память компьютера просматривал с помощью Turbo Debugger версии 3.1 фирмы Borland International
С уважением Пёрышков Э.Г. u10277@dialup.podolsk.ru
Ответ
Уважаемый Edward!
Адрес (вектор) прерывания 21h находится в таблице векторов прерываний, которая начинается по адресу 0000:0000h.
Чтобы получить адрес (сегмент и смещение) 21h прерывания необходимо выполнить следующие команды:
push 0
pop es
mov bx,es:[21h*4]
mov es,es:[21h*4+2]
В результате регистры es:bx будут содержать сегмент и смещение 21h-ого прерывания.
Можно также воспользоваться функцией 35h прерывания 21h для получения адреса того или иного прерывания. Об этом подробно описывается в рассылке "Ассемблер? Это просто! Учимся программировать".
Изначально (сразу после загрузки ОС, но без загрузки какого-либо резидента) вектор указывает на процедуру обработки 21h-ого прерывания ядра DOS. Однако, если какой-то резидент перехватил 21h-прерывание, то получить вектор ядра DOS (а не адрес процедуры обработки загруженного резидента) будет очень сложно. Для этой цели используется трассировка. Но это очень большая и сложная тема, которая требует немалых затрат времени для реализации подобного механизма.
Подскажите, как создать программу, которая удаляла бы такой-то файл (или каталог) на таком-то диске. Если она небольшая напишите, ПОЖАЛУЙСТА, исходник.
Ответ
Уважаемый Vovik!
Удаление файла и каталога - разные вещи.
1. Удаление файла - функция 41h прерывания 21h, при этом DS:DX должен содержать адрес файла для удаления.
2. Удаление каталога - функция 3Ah прерывания 21h при этом DS:DX должен содержать адрес каталога для удаления.
(C) Москва, 2001. Авторское право принадлежит Калашникову О.А.
Публичное размещение материала из рассылки, а также его использование
полностью или частично в коммерческих или иных подобных целях без письменного
согласия автора влечет ответственность за нарушение авторских прав.