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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 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 <...
Вопрос № 17487: Всем хорошего здоровья. :) Пробую загрузить программу в SoftICE 4.2.7 (WinXP sp1). Делаю так: 1) Компилирую программу так: C:Masm32Binml.exe /c /coff /Zi proga.asm C:Masm32Binlink.exe /SUBSYSTEM:CONSOLE /DEBUG /DEBUGTYPE:CV /LIB...
Вопрос № 17489: Здравствуйте уважаемые эксперты! Недавно я начел изучать язык ASSEMBLER по рассылке О. Калашникова. До вчерашнего дня все работало нормально, а после того как я написал пример Prog02 и запуситл его, вылетила вот такая мессага (см. приложение). У ...
Вопрос № 17493: Привет! Я создаю raw-socket и включаю promiscious mode(SIO_RCVALL), т.е. моя прога получает все пакеты которые проходят с моего компа. Вопрос: как сделать чтоб моя прога получала только заголовки TCPIP-пакета?...
Вопрос № 17501: Здраствуйте. У меня следующая проблема. Я написал такую програмку. Но при запуске, скажем, какой либо программы с СD, или с дискетки, защищенной от записи, DOS страшно ругается. (Ошибка записи: повторить, отменить, игнорировать). Как этого избежать? ...

Вопрос № 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться

В избранное