Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать (FAQ)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Ассемблер? Это просто! Учимся программировать (FAQ)
______________________________________

Выпуск N 002

Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"

Дата выхода: 2001-05-04


Вопрос

Не могу отладить програму из 10 выпуска (перехват 9 функции прерывания 21h) При запуске программы происходит ошибка на строке int 27h (завершить и остаться резидентной). Операционная система WinME, TASM 3.2. Заранее благодарен.

Green

Ответ

Уважаемый Green!

В Вашей программе были исправлены некоторые ошибки:

1. В процедуре обработки прерывания перед вызовом оригинального обработчика перехваченного прерывания командой call нужно заносить в стек флаги, но не доставать их после этого! Вот пример:

pushf ;Заносим флаги
call dword ptr cs:[Int_21_Vec]

;Флаги НЕ достаем.

Об этом писалось в рассылках.

2. При вызове функции 25h прерывания 21h нужно указывать в DX смещение процедуры в памяти, а не переменной, где храниться ее адрес:

mov ax, 2521h
mov dx, offset Int_21_Proc ;Здесь была ошибка!
int 21h

Прилагаемая программа работает без ошибок.

Прилагаемая программа:


Отправил: Калашников Олег, (http://www.kalashnikoff.ru)

Вопрос

Где находится программа (точка входа) обработки прерывания 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 (а не адрес процедуры обработки загруженного резидента) будет очень сложно. Для этой цели используется трассировка. Но это очень большая и сложная тема, которая требует немалых затрат времени для реализации подобного механизма.


Отправил: Калашников Олег, (http://www.kalashnikoff.ru)

Вопрос

Подскажите, как создать программу, которая удаляла бы такой-то файл (или каталог) на таком-то диске. Если она небольшая напишите, ПОЖАЛУЙСТА, исходник.

Ответ

Уважаемый Vovik!

Удаление файла и каталога - разные вещи.

1. Удаление файла - функция 41h прерывания 21h, при этом DS:DX должен содержать адрес файла для удаления.

2. Удаление каталога - функция 3Ah прерывания 21h при этом DS:DX должен содержать адрес каталога для удаления.

Примеры смотрите в файле-приложении.

Рекомендую Вам также скачать файл HelpAssm.exe на сайте http://www.Kalashnikoff.ru.

Прилагаемая программа:


Отправил: Калашников Олег, (http://www.kalashnikoff.ru)

Подписаться на рассылки

Рассылки Subscribe.Ru
Ассемблер? Это просто! Учимся программировать
Ассемблер? Это просто! Учимся программировать (FAQ)

Задать вопрос экспертам.


Ведущий рассылки,

Калашников Олег: Assembler@Kalashnikoff.ru
ICQ No.:
68951340
URL сайта подписчиков: http://www.Kalashnikoff.ru

______________

По вопросам сотрудничества, рекламы и спонсорства обращайтесь:

  1. Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
  2. Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
  3. Издание книги (спонсорство): Sponsor@Kalashnikoff.ru

Рассылка 'Ассемблер? Это просто! Учимся программировать (FAQ)' Рассылка 'Ассемблер? Это просто! Учимся программировать'


(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав.

List Banner Exchange lite
Реклама на сайте Калашников.ru


http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное