При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Информационный Канал Subscribe.Ru |
Выпуск № 73
от 02.03.2005, 22:50
Администратор: | Калашников О.А. |
В номере: | Вопросов: 5, Ответов: 10 |
Вопрос № 17474 |
Добрый день. Я снова вернулся к изучению резидентных программ. Мне не совсем понятны следующие строки(отмечены v): CSEG segment assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG org 100h Start: jmp Init Int_21h_proc proc pushf cmp ah,9 je Ok_09 popf v jmp dword ptr cs:[Int_21h_vect] ;что это значит Ok_09: push ds push dx push cs pop ds mov dx,offset My_string pushf v call dword ptr cs:[Int_21h_vect] ;что это значит pop dx pop ds popf v iret ;чем отличается от ret Int_21h_vect dd ? My_string db 'Моя строка!$' int_21h_proc endp Init: mov ah,35h mov al,21h int 21h mov word ptr Int_21h_vect,bx mov word ptr Int_21h_vect+2,es mov ax,2521h mov dx,offset Int_21h_proc int 21h mov dx,offset Init int 27h CSEG ends end Start |
Отправлен: 25.02.2005, 13:45 Вопрос задал: psevdo (статус: 1-ый класс) Всего ответов отправлено: 3 |
Отвечает: Котиев Зураб Добрый день. В переменную Int_21_vect ты сохраняешь истинный адресс(вектор) прерывания 21h т.е. кодовый сегмент прерывания и смещение в нем. Потом с помощью инструкций mov ax,2521h mov dx,offset Int_21h_proc int 21h ты заменяешь обработчик int 21h своим обработчиком pushf cmp ah,9 je Ok_09 popf jmp dword ptr cs:[Int_21h_vect] ;что это значит Ok_09: ты проверяешь переданные в прерывание параметры , и если ah рано 9 (т.е. это вывод строки) работаешь дальше, а если нет ты просто передаешь управление штатному обработчику предварительно очистив стек от сохраненного туда регистра флагов. теперь о ret и iret. инструкция call кладет в стек адресс возврата (т.е. адресс следующей за ней инструкции). ret снимает со стека этот адресс и заносит его в ip. инструкции call far и retf работают аналогично только в стек заносится и снимается еще и cs ,потому что управление передаетя в другой кодовый сегмент(дальний вызов). инструкция int "номер прерывания" заносит в стек регистр флагов ,регистр cs,и адресс возврата(вызов прерывания всегда дальний вызов).Выход из прерывания производится командой iret (Interrupt RETurn). iret соответственно восстанавливает со стека регистр флагов и все остальное. push cs pop ds mov dx,offset My_string pushf call dword ptr cs:[Int_21h_vect] ;что это значит после того как ты заменил указатель на строку своим указателем ты делаешь вызов "настоящего" прерывания int21h командой call(здесь важный момент) а не int 21h. Прерывание отработав вызовет iret а если ты не сохранил в стеке регистр флагов то прерывание возьмет со стека неизвестно что,(допустим ты вызвал прерывание из вложенной процедуры ,то оно снимет со стека адресс возврата из этой процедуры и вернет управление эта процедура неизвестно куда;одним словом висяк). Поэтому при передаче управления прерыванию командой call необходимо сохранить в стеке регистр флагов: pushf call dword ptr cs:[Int_21h_vect]; |
Ответ отправил: Котиев Зураб (статус: 1-ый класс) Отправлен: 25.02.2005, 15:52 |
Отвечает: Стас Здравствуйте, psevdo! jmp dword ptr cs:[Int_21h_vect] - безусловный переход по адресу хранящемуся в переменной Int_21h_vect, куда ранее поместили "старый обработчик" прерывания. call dword ptr cs:[Int_21h_vect] - тоже самое, только после выполнения "старого обработчика", программа продолжится со следующей команды. iret ;отличается от ret тем что дополнительно восстанавливает флаги из стека (POPF) ЛЮБОЙ обработчик прерывания заканчивается IRET или "имитируется" IRET например так: RETF 2 - если нужно сохранить флаги. Кстати, а ты знаешь чем RET от RETF отличается? А то может тебе почитать о командах ассемблера. |
Ответ отправил: Стас (статус: Практикант) Отправлен: 26.02.2005, 00:19 |
Отвечает: Евгений Иванов Здравствуйте, psevdo! jmp dword ptr cs:[Int_21h_vect] - это переход на следующий вектор прерываний в цепочке обработки прерываний. call dword ptr cs:[Int_21h_vect] - это вызов настоящего прерывания, которое будет, как тут предполагается, работать. iret ;чем отличается от ret - вызов прерываний идёт через технологию INT, так что нужно использовать iret. Отличие от ret - сохраняются флаги. Удачи! |
Ответ отправил: Евгений Иванов (статус: Профессор) Отправлен: 26.02.2005, 01:11 |
Вопрос № 17487 |
Всем хорошего здоровья. :) Пробую загрузить программу в SoftICE 4.2.7 (WinXP sp1). Делаю так: 1) Компилирую программу так: C:Masm32Binml.exe /c /coff /Zi proga.asm C:Masm32Binlink.exe /SUBSYSTEM:CONSOLE /DEBUG /DEBUGTYPE:CV /LIBPATH:c:masm32lib proga.obj 2) Запускаю "Start SoftICE". 3) Запускаю "Loader 32". 4) "File" - "Open". 5) Открываю "proga.exe". 6) Меню "Module" - "Load". На сколько я понимаю здесь должен загрузиться "SoftICE". Программа загружается, а SoftICE нет. Что я делаю неправильно? Заранее благодарен. |
Отправлен: 25.02.2005, 18:43 Вопрос задал: Гнедов Павел Владимирович (статус: Посетитель) Всего ответов отправлено: 1 |
Отвечает: Стас Здравствуйте, Гнедов Павел Владимирович! SoftIce либо не загружен(есть внизу Loaderа надпись SoftIce active?), либо не ловит начала проги, тогда поставьте первой командой Int 3, а softice дайте(ctrl-d) комманду i3here on. |
Ответ отправил: Стас (статус: Практикант) Отправлен: 25.02.2005, 23:59 |
Вопрос № 17489 |
Здравствуйте уважаемые эксперты! Недавно я начел изучать язык ASSEMBLER по рассылке О. Калашникова. До вчерашнего дня все работало нормально, а после того как я написал пример Prog02 и запуситл его, вылетила вот такая мессага (см. приложение). У меня Windows XP sp1. Рассскажите пожалуйста в чем проблема и как её устронить. Заранее благодарен. Приложение: |
Отправлен: 25.02.2005, 19:41 Вопрос задал: Gorodjaaan (статус: Посетитель) Всего ответов отправлено: 2 |
Отвечает: AxMAD Здравствуйте, Gorodjaaan! Всё очень просто переходите или чисто в Ms-DOS или под Windows 9x !!! |
Ответ отправил: AxMAD (статус: Студент) Отправлен: 26.02.2005, 16:42 |
Отвечает: Boriss Здравствуйте, Gorodjaaan! То есть, различие поведения надо искать в изменении вида запуска программы. Вы одинаково делали это? |
Ответ отправил: Boriss (статус: Профессионал) Отправлен: 01.03.2005, 16:46 |
Вопрос № 17493 |
Привет! Я создаю raw-socket и включаю promiscious mode(SIO_RCVALL), т.е. моя прога получает все пакеты которые проходят с моего компа. Вопрос: как сделать чтоб моя прога получала только заголовки TCPIP-пакета? |
Отправлен: 25.02.2005, 20:48 Вопрос задал: valix (статус: Посетитель) Всего ответов отправлено: 2 |
Отвечает: Bob Johnson Здравствуйте, valix! AFAIK - никак... Никакого фильтра повесить невозможно, надо получать все пакеты и фильтровать руками. * EMan2.0: ---===*** Debug mode ***===--- |
Ответ отправил: Bob Johnson (статус: Академик) Отправлен: 26.02.2005, 16:09 |
Отвечает: AxMAD Здравствуйте, valix! так параметр IPPROTO_IP зачем! s = socket( AF_INET, SOCK_RAW, IPPROTO_IP ); |
Ответ отправил: AxMAD (статус: Студент) Отправлен: 26.02.2005, 17:09 |
Вопрос № 17501 |
Здраствуйте. У меня следующая проблема. Я написал такую програмку. Но при запуске, скажем, какой либо программы с СD, или с дискетки, защищенной от записи, DOS страшно ругается. (Ошибка записи: повторить, отменить, игнорировать). Как этого избежать? Да и еще одно: как при запуске программы она может определить полностью свою длинну, окромя: mov plen, offset endpr-offset progenrpoint А как программа при запуске может узнать свое имя полностю с адресом. Да, а как организовать поик необходимого файла? Например: File.ext а вдруг он в ДОСе как FILE.EXT, file.ext? Я имею в виду проблемы с регистром. Заранее вам благодарен. Ну и в конце отвечу на один вопрос Калашникову. Ваша программы, котороя дописывается в конец сом файлов с некоторыми сом будет работать некорректно потому, что они имеют структуру ехе программ. Даже command.com в WinMe имеет в начале MZ и длинну что-то около 84 кб? Вообще как такое может быть? А прога format.com Win2000 вообще под DOSом запустить нелзя!: «This program cannot be run in DOS mode.»!!! Приложение: |
Отправлен: 25.02.2005, 22:14 Вопрос задал: Nieh (статус: Посетитель) Всего ответов отправлено: 2 |
Отвечает: Евгений Иванов Здравствуйте, Nieh! Обрабатывай ошибки правильно, посмотри 59h функцию. Поиск - есть расширенные функции для работы с длинными именами файлов. Вот там доступен и регистр, и длина. |
Ответ отправил: Евгений Иванов (статус: Профессор) Отправлен: 26.02.2005, 01:18 Оценка за ответ: 4 |
Отвечает: Котиев Зураб Здравствуйте, Nieh! при запуске, скажем, какой либо программы с СD, или с дискетки, защищенной от записи, DOS страшно ругается. (Ошибка записи: повторить, отменить, игнорировать). Как этого избежать? надо написать обработчик Int 24h. Этот обработчик должен устанавливать собственную реакцию на критическую ошибку.Нормальный обработчик INT 24H - это код, который выдает сообщение: Abort, Retry, Ignore? _ чтобы этого избежать надо вернуть управление прерванной програм- ме,поместив предварительно в регистр AL код " 3 ": new_24h: mov al,3 iret Да, а как организовать поик необходимого файла? Например: File.ext а вдруг он в ДОСе как FILE.EXT, file.ext? Я имею в виду проблемы с регистром. для ДОСа не имеет значения регистр. Но если ты работаешь напрямую с диском (допустим через int 13 или порты) приведи имя файла к верхнему регистру просто обнулив пятый бит в символах имени. command.com в WinMe имеет в начале MZ и длинну что-то около 84 кб? Ты сам ответил: они имеют структуру ехе программ.Они являются exe прграммами. А расширение com оставлено для совместимости.Format.com из win2000 вообще является PE(portable executable) файлом. А как программа при запуске может узнать свое имя полностю с адресом Смотри DTA . как при запуске программы она может определить полностью свою длинну Ну например открыть себя как файл и вызвать mov ax,4202h int 21h это тебе вернет длину файла в DX:AX. |
Ответ отправил: Котиев Зураб (статус: 1-ый класс) Отправлен: 26.02.2005, 14:59 Оценка за ответ: 5 |
© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.
http://subscribe.ru/
http://subscribe.ru/feedback/ |
Подписан адрес: Код этой рассылки: comp.soft.prog.faq |
Отписаться |
В избранное | ||