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

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


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


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

Выпуск N 19 (Резидент)

Сегодня в рассылке:

  • Информация для новеньких

  • Новости рассылки и сайта

  • Ваши письма

  • Резидент вкратце



  • Пожалуйста, возьмите предыдущие выпуски по следующему адресу:

    http://www.Kalashnikoff.ru (здесь также можно найти все необходимое программное обеспечение для работы с Ассемблером).

    Если у вас нет доступа в Сеть, то напишите мне письмо по адресу:

    assembler@beep.ru?Subject=Issues

    Если в поле "Тема" вы укажите слово Issues, то ВСЕ предыдущие выпуски будут высланы Вам автоматически; это существенно ускорит ответ. Обратите внимание, что у меня изменился электронный адрес, а также адрес сайта, что не было исправлено в предыдущих выпусках!



    Дорогие мои подписчики! Как видите, у нас изменился внешний вид рассылки. Если у вас есть что сказать по этому поводу (стало хуже, плохо печатать на ч/б принтере и т.п.), то пишите. Я обязательно исправлю все изъяны.

    ___________

    Но это не главное. Главное то, что с настоящего выпуска файл-приложение будет всегда выходить вместе с рассылкой! Теперь все просто! После многочисленных откликов по поводу рассылки, я все же сел и наконец-то решил эту проблему. Надеюсь, что теперь получение файла-приложения не доставит вам хлопот...

    ___________

    Посоветовавшись с некоторыми подписчиками, я все же пришел к выводу, что рассылку нужно открыть свова (теперь она видна в каталоге рассылок). Так что наши ряды вновь пополняются!

    ___________

    Наш сайт уже второй раз поменял адрес. Теперь мы находимся на http://www.Kalashnikoff.ru. Думаю, что это окончательный вариант. Вскоре (после Нового года, а может и раньше) будет и своя Гостевая книга там (скрипты уже нашел кое-какие. Надо только кое-чего подкорректировать в них). Заходите, отмечайтесь! Надеюсь, что попасть на этот сайт будет гораздо проще, чем на newmail!

    Более того, нужно освоиться с элекронными адресами, которые у меня появились. Будет что-то вида oleg@kalashnikoff.ru и пр. Их количество неограничено. Думаю, что к выходу следующего выпуска я все настрою и сообщу вам дополнительные возможности, которые откроются для вас.

    ___________

    Предыдущий выпуск № 18 (про оболочку) вышел под номером 17 по моей ошибке. Если вы удалили его, то возьмите на нашем сайте либо напишите мне письмо с просьбой его выслать.



    Новости для пользователей программы Commands Алексея Старчикова.

    В программе собираются команды Ассемблера, которые мы рассматриваем в рассылке.

    Ниже приведено письмо Алексея:

    Здравствуйте!
    Хочу сообщить вам, что я сделал сайт, посвященный моей программе.
    Адрес:
    http://www.vunder.newmail.ru/.
    Там вы можете найти некотурую информацию о программе и скачать ее последнюю версию.

    С уважением,
    Старчиков Алекей. (
    vunder@spb.cityline.ru )

    _________

    Благодарности экспертам.

    К сожалению, моя идея с экспертами работает немножко не так, как хотелось бы. Вопросов мало (а раньше их было так много, что думал никогда в жизни не отвечу!), далеко не все эксперты отвечают на высланные им вопросы, не все подписчики высылали мне оценку... Пришлось самому смотреть и оценивать...

    Кстати, была ошибка (точнее, упущение) с моей стороны, которая заключалась в том, что никто не мог отправить письмо экспертам напрямую, т.к. у меня на eGroups стояла "галочка", которая запрещала отправлять письма экспертам, если отправитель не входит в ту или иную экспертную группу. Теперь все исправил. Можете отправлять. Чтобы получить адреса экспертов, необходимо отправить мне письмо по адресу assmbler@beep.ru?Subject=Experts. Обратите внимание на то, что в поле "Тема" вашего письма должно быть слово "Experts". В таком случае адреса экспертов будут высланы вам автоматически, что ускорит ответ.

    Тем не менее, можно подвести кое-какие результаты. Но прежде хочу поблагодарить всех экспертов, которые отвечали на вопросы подписчиков. Всего было отправлено 25 ответов (что не так и много!).

    Первое почетное место:

    Больше всего "досталось" эксперту с именем Slava V. ( debug_inc@mailru.com ). На его счету 11 ответов, причем, ответов грамотных и подробных, которые изложены на простом языке. Поздравляю тебя, Слава!!! Надеюсь, что и впредь ты будешь в нашей экспертной группе.

    Второе почетное место:

    На мой взгляд второе место получают Михаил Юрьевич ( micks@azov.donpac.ru ) и K.A. Nick ( ILUH_1@mail.ru ). На их счету по два полных ответа. Попрошу вас, Михаил и K. A. Nick, выслать мне информацию, которую Вы бы хотели разместить в рассылке для подписчиков.

    Третье почетное место:

    Мне кажется, что третье место можно разделить между:

    Спасибо всем! Я надеюсь, что вопросов будет поступать больше, и я смогу более точнее распределить места между экспертами...



     

    Как переписать файл-приложение в DOS-файл (так, как мы скачивали с сайта раньше)?

    Для этого:

    • отметьте "мышкой" все, что находится в приведенном выше окне;
    • нажмите Ctrl+Insert;
    • запустите DOS Navigator или FAR;
    • нажмите Shift+F4;
    • введите имя файла RESID19.ASM;
    • нажмите Shift+Insert;
    • нажмите F2;
    • выходите в DOS и ассемблируйте!

    Приступаем к изучению резидента. Прежде всего разберемся, что он делает.

    Итак, после загрузки в память, резидент перехватывает 21h-ое прерывание. Затем отслеживает некоторые действия программ (функции, которые они вызывают) и записывает информацию в свой так сказать log-файл. А функции следующие:

    AX = 4B00h ;Запуск файла на выполнение
    AH = 39h ;Создание каталога
    AH = 3Ah ;Удаление каталога
    AH = 3Bh ;Смена каталога
    AH = 3Ch ;Создание файла
    AX = 3D02h ;Открытие файла для чтения/записи
    AH = 41h ;Удаление файла

    Для выполнения всех этих функций 21h-ого прерывания в регистрах DS:DX должно быть указано имя файла или каталога. Поэтому мы выполняем одни и те же действия, если какая-либо фукция вызвалась. Постарайтесь запомнить приведенные выше функции!

    Примеры:

    Создание каталога:
    mov ah,39h
    mov dx,offset Directory
    int 21h

    Удаление файла:
    mov ah,39h
    mov dx,offset File
    int 21h

    и т.д. кроме функции 4B00h. Помимо указания файла для запуска в DS:DX, нужно еще подготовиться хорошо. Но это позже рассмотрим...

    Что конкретно мы делаем?

    Как вы уже знаете, программы типа *.com начинаются со смещения 100h. От 0 до 0FFh находится т.н. PSP (Prefix Program Segment). Некоторые поля PSP вы уже знаете. Например, по смещению 0 находится команда INT 20h, а по смещению 80h - DTA и изначально командная строка. Оставляя резидент в памяти, мы оставляем и PSP (т.е. "лишние" 100h байт). Получается, что 100h байт постоянно висит в памяти... Вы уже, возможно, заметили, что наши предыдущие резиденты занимали памяти больше, чем их реальный размер. Это-то как раз и связано с тем, что в памяти "висит" PSP программы (плюс еще строка окружения, но об этом попозже).

    У нас есть несколько способов избежать размещения лишних байт в памяти:

    1. Сделать так, чтобы программа в памяти начиналась не со смещения 100h, а со смещения 0. Однако, здесь возможны некоторые проблемы. Об этом позже.

    2. Разместить в нашей свободной области стек (временно, т.е. на то время, пока работают наши обработчики прерываний). Тоже можно...

    3. Сделать в области PSP буфер (т.е. задействовать эту память для временного хранения данных, которые не превышают 100h байт).

    Я предпочитаю всегда использовать 3 способ (хотя иногда и 2 использую). В настоящем резиденте мы так и сделаем. Для чего нужен нам буфер, сейчас рассмотрим.

    Как я уже говорил, мы перехватываем указанные выше функции 21h-прерывания и фиксируем действия программ, которые вызывают данное прерывание в нашем log-файле (c:\report.txt).

    Теперь смотрим, что делает обработчик 21h-прерывания:

    cmp ax,4B00h
    je Start_f

    cmp ah,39h ;Это создание каталога?
    je Create_dir

    ...

    jmp short Go_21h ;Если что-то другое, то передадим управление 21h-ому...

     

    Start_f:
    mov si,offset Start_filemess ;Строка для записи в наш log-файл.
    call Move_string ;Готовим строку и записываем ее в файл...
    jmp short Go_21h ;Передадим управление 21h-ому прерыванию...

    Create_dir:
    mov si,offset Create_dirmess
    call Move_string
    jmp short Go_21h

    ...

    Здесь мы вначале проверили, запускает ли кто-то файл на выполнение или нет. Затем проверяем другие функции, которые могут вызываться. Допустим, некто пытается создать каталог (функция 39h). Тогда мы передаем управление на метку Create_dir (создание каталога). Это видно на приведенном выше примере. Затем в SI заносится адрес строки Create_dirmess:

    Create_dirmess dw Create_dirmessl
    db 'Создание каталога ---> '
    Create_dirmessl equ $-Create_dirmess-2

    Как видите, первые два байта адреса, который заносится в SI содержат длину строки. Обратите внимание, как мы просто получаем длину строки! Вместо Create_dirmessl программа-ассемблер (MASM / TASM) поставят длину строки, которая вычисляется таким способом:

    Create_dirmessl equ $-Create_dirmess-2

    Т.е. $ (текущее смещение) минус смещение Create_dirmess минус два (т.к. первые два байта - и будут указывать на длину строки). После этого временная переменная (которая не будет занимать памяти; она нужна только для MASM / TASM) (Сreate_dirmessl) будет равна длине строки. Пожалуйста, внимательно изучите приведенные выше примеры! Вы должны понять принцип...

    Как только занесли в SI адрес троки (первые два байта корой будут указывать на длину строки), вызываем процедуру Move_string. При этом в BX будет находиться сегмент строки, которую передала некая программа.

    В общем, принцип такой: процедура Move_string заносит по смещению 0 сегмента, в котором находится наш резидент (т.е. в область PSP) соответствующую строку (например, "Создание каталога ---> "), после нее заносится имя файла (то, что получаем в регистрах DS:DX. Это может быть как только имя файла, так и полный путь к файлу, т.е. диск:\ каталог\имя_файла - c:\My_dir\file.ext.). Вот это мы и записываем по смещению 0 сегмента, в котором находится наша программа. Вот, что мы получим в итоге:

    Допустим, кто-то создает каталог c:\assm\directory:

    Создание каталога ---> c:\assm\directory.

    Приведенная выше строка запишется в файл. Думаю, что труда разобраться с резидентом не составит, тем более, что после каждой строки идет комментарий. Вы уже сами можете наиписать подобный резидент, опираясь на нашу рассылку.

    Что нужно вынести вам из этого урока?

    Вам нужно разобрать резидент и понять его работу. Вы должны разобрать алгоритмы, если, конечно, хотите выучить Ассемблер.

    Отмечу лишь некоторые аспекты.

    Мы перехватываем 21h-прерывание, помещая его адрес в 03h-прерывание. Это значит, что многие отладчики просто "обломаются". Обратите внимание, как мы вызываем 21h-ое прерывание в нашем обработчике...

    В принципе, наш резидент очень простой. Вам достаточно разобраться с описанием в файле-приложении. Надеюсь, что труда не составит. Все очень просто. Главное - обращайте внимание на алгоритмы.

    Более подробно работу данного резидента мы рассмотрим в следующем веке...

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

    ____________

    Данный выпуск предпраздничный. Поэтому буду краток.

    Все поздравляю Вас с наступающим Новым годом. Желаю счастья, удачи, любви и материального благополучия. Надеюсь, что в новом веке мы будем вместе, как и прежде.


    С уважением,

    Автор рассылки: Калашников Олег
    URL сайта подписчиков: http://www.Kalashnikoff.ru
    E-mail для вопросов: Assembler@Kalashnikoff.ru
    UIN: 68951340

    Москва, 2000.


    (C) Авторское право. Запрещается использование материала из рассылки в коммерческих целях без письменного согласия автора.


    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Поиск

    В избранное