Вопрос № 95460: У меня несколько вопросов по поводу программы-резидента(Выпуск № 010) из рассылки Калашникова. Её код в приложении.
1) В конце этого выпуска сказано, что для работы программы требуется 2 файла:
1-сама программа(prog10.com) с обработчико...
Вопрос № 95.460
У меня несколько вопросов по поводу программы-резидента(Выпуск № 010) из рассылки Калашникова. Её код в приложении.
1) В конце этого выпуска сказано, что для работы программы требуется 2 файла:
1-сама программа(prog10.com) с обработчиком прерывания 21h
2- любая другая с выводом строки на экран(test10.com).
Следуя указаниям, я сначала запускаю в Far prog10.com,та возвращается в Dos, затем набираю test10.com .Всё работает- на экран выводится строка "Моя строка!". В другом окне(т.к. первое окно занято резидентом) Far я запускаю test10.com в отладчике AFDPro , но когда захожу внутрь прерывания Int 21h , то вместо нашего обработчика прерывания программа переходит на адрес оригинального обработчика 21h. Не знаю, почему...
С SoftIce такие же проблемы!
2) Int_21h_vect dd ? говорит о том, что переменная не инициализирована? Если да, то какая разница между такой записью и записью вида Int_21h_vect dd 0 - в отладчике то же самое и занимает столько же места(байт) ?!
3) call dword ptr cs:[Int_21h_vect]
Во-первых, почему call, ведь мы изменяем одновеменно 2 регистра(CS:IP). Или она работает автоматически - при указании сегмента он
помещается в стек?
Во-вторых, заменив cs на ds, в работе программы ничего не изменилось, а заменив в строке jmp dword ptr cs:[Int_21h_vect], она выдала
какие-то непонятные символы. Странно, обращаемся мы всё равно к данным?! Может cs и ds в разные промежутки времени разные:
Ok_09:
push ds
push dx
push cs
pop ds
Почему мы в ds заносим cs? Повторяю, с отладчиками проблемы.
Приложение:
Отправлен: 17.07.2007, 18:40
Вопрос задал: Fat NTFSov
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 4)
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Fat NTFSov!
1) В windows 98+ нет чистого MSDOS. Это только эмуляторы MSDOS. Когда Вы работаете в разных MSDOS-окнах, у Вас получается 2-е разных программы которые независят друг от друга (изменение в одной программе не влияет на вторую)
2) Int_21h_vect dd ? - эта запись указывает компилятору не заниматся инициализацией этой переменной(но по умолчанию компилятор ставит 0х00000000, хотя может быть и любой "мусор"),
при такой записи Int_21h_vect dd 0 - компилятор должен записать туда значение 0х00000000.
3)При запуске обработчика известны только CS:IP, остальные регистры могут быть изменены тестовой программой.
push ds ;Сохраним регистры
push dx
push cs ;Адрес строки должен быть в DS:DX
pop ds
mov dx,offset My_string
pushf ;Так надо! Позже рассмотрим
call dword ptr cs:[Int_21h_vect]
в этих строчках передается управление на функцию 09h прерывания 21h, она требует данные по адресу DS:DX, если не изменять DS то вместо нашей строки будет выводится информация из тестовой программы, а там могут находится не корректные данные приводящие с сбою.
Если не менять DS и вызвать команду перехода, то сегмент будет стестовой программы, а смещение с нашего обработчика. Куда мы попадем не известно.
Удачи!
--------- И только наступив на грабли мы приобретаем драгоценный опыт!