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

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


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

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

Выпуск N 027 (Последний резидент)

Доброе время суток, дорогие подписчики!

Сегодня в номере:

  • Информация для новых подписчиков

  • Новости

  • Ваши письма.

  • Резидент

  • Тусоffка


  • Информация для новых подписчиков

    Благодарю Вас, что подписались на рассылку "Ассемблер? Это просто! Учимся программировать". Надеюсь, что Вы не останетесь равнодушны к ней и почерпнете море полезной информации, а также повысите свой уровень в "общении" с IBM-совместимыми компьютерами.

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

    Все, что нужно для изучения Ассемблера (предыдущие выпуски, адреса экспертов, необходимые программы, документацию, а также многое другое), можно найти на сайте http://www.Kalashnikoff.ru. Рекомендую Вам сперва ознакомиться с разделом "Информация для новых подписчиков".

    Если у Вас нет выхода в Сеть, то предыдущие выпуски рассылки, информацию для новеньких и адреса экспертов можно получить по почте, направив пустое письмо по адресу AssmIssues@Kalashnikoff.ru. Архив (390 Кб) будет выслан Вам автоматически в течение двух рабочих дней с момента получения Вашего письма. Однако, пожалуйста, не злоупотребляйте этим, т. к. высылка писем подобного объема несет существенную нагрузку на почтовые сервера.


    Новости

    Новости... Да, новостей у нас несколько. Начну с простых:

    _________

    Новость N 1. Она не совсем относится к программированию, но, тем не менее, мне бы хотелось Вам сообщить. Завязалось сотрудничество с газетой "Покупатель". В этой газете вышла моя первая статья, которая также будет скоро опубликована в Интернете.

    Новость N 2. Теперь на www.Kalashnikoff.ru каждый может добавить адрес своего сайта плюс его описание в раздел "Ссылки на другие ресурсы". Если Ваш сайт имеет отношение к программированию на Ассемблере (и другим языкам), то Вы можете сами (без моего участия) добавить его. Я внимательно буду знакомиться с новыми ссылками (письмо приходит ко мне автоматически сразу после того, как Вы занесете адрес на сайт) и проверять данное Вами описание сайта. Если оно не соответствует действительности или по каким-то иным причинам окажется малоинформативным, то уж не обессудьте: придется его удалить из каталога.

    Это, конечно, мелочи, но развитие в данном направлении будет продолжаться. Не буду пока ничего рассказывать - секрет. Сами скоро все увидите...

    _________

    Новость N 3. Существенно изменился внешний вид сайта (условно - версия 4.0): теперь он состоит из двух окон (фреймов) и протестирован преимущественно на Internet Explorer 4.0 при разрешении экрана 1024х768.

    Лучше получилось или хуже - пока не знаю: выношу на Ваш суд. Все пожелания можно оставлять в Гостевой книге (я ее планирую переименовать в "Книгу отзывов").

    _________

    Новость N 4. Теперь работает форум на сайте www.Kalashnikoff.ru. Предыдущий также до сих пор действует. Причина переноса ясна: прежний форум был очень медленный. Нынешний же работает гораздо быстрее...

    _________

    Новость N 5. В адрес экспертов поступает довольно-таки много вопросов. Информация очень полезная и интересная любому программисту. Но так как у меня просто не хватает времени обрабатывать все это вручную, то я решил автоматизировать данный процесс, чем, собственно, и занимался вплотную последние несколько дней.

    Как это все будет работать?

    Я на днях открыл еще одну рассылку "Ассемблер? Это просто! Учимся программировать (FAQ)" (далее - рассылка FAQ), в которой будут публиковаться вопросы подписчиков и ответы экспертов на них. Первый выпуск уже готов и скоро выйдет. В нем собраны поступившие за последнее время вопросы/ответы. Данный выпуск я пока верстал вручную. Следующий будет создан автоматически.

    Как можно будет задавать вопросы?

    Вопросы задаются через специальную форму, которая будет присутствовать в каждом выпуске. Вы задаете вопрос (если необходимо, в специальное окно добавляете ассемблерную программу), который отправляется напрямую эксперту. При этом вопрос фиксируется на сервере моего хостера. Эксперт получает вопрос в специальной форме, печатает ответ и отправляет его опять-таки через мой сервер подписчику, задающему вопрос. Ваш вопрос и ответ эксперта заносится в базу данных. Как только поступило 5 (или 10) вопросов/ответов, рассылка выходит.

    Какие минусы в новой системе?

    1. Вопрос/ответ будет отправляться через специальную web-форму, что требует у Вас наличия выхода в Интернет. Однако, отправка ответа займет 5-10 секунд - столько же, сколько бы Вы истратили, отправляя его по почте.

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

    3. Минимальный контроль за информацией в рассылке FAQ с моей стороны, что может привести к появлению в ней ненужной информации (например, спама). Если такое будет иметь место, то мне придется закрыть данную рассылку либо действовать иным способом. Максимальный фильтр я постараюсь обеспечить, но только программным путем.

    4. Подписываться на рассылку FAQ желательно в HTML-формате, т.к. в текстовом виде невозможно поместить форму для вопроса. Однако, если Вы не будете задавать вопросы, то можно подписаться и на текстовую версию. Тем не менее, форму можно будет всегда найти на нашем сайте.

    Какие плюсы в новой системе?

    Плюсов побольше.

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

    2. Рассылку будете делать фактически вы, а также эксперты, отвечающие на ваши вопросы.

    3. С моей стороны будет осуществляться минимальный контроль, что освободит кучу дополнительного времени, которое я смогу посвятить этой рассылке (т.е. той которую Вы сейчас читаете).

    4. Все вопросы/ответы будут сохраняться у моего хостера, что повысит надежность хранения информации. Например, совсем недавно у меня "полетел" винчестер, а также все письма экспертов с ответами на ваши вопросы (хотя, кое-что и осталось).

    5. Любой желающий сможет самостоятельно зарегистрировать себя в той или иной экспертной группе, а также отписаться в любой момент. Это также, безусловно, избавит меня от дополнительных хлопот по регистрации.

    6. Набранные экспертами баллы (которые считаются автоматически) будут отображаться в рассылке. Лидеры получат возможность оставить любую информацию о себе лично либо о своем сайте на страницах рассылки (или что-либо еще - пока не придумал).

    7. Возможно, что в рассылке FAQ будут публиковаться формы для голосования за ответ того или иного эксперта, что повысит объективность оценки.

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

    9. Станет гораздо удобней задавать вопрос и получать ответ на него в красиво оформленном виде.

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

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

    12. Эксперт, набравший за месяц (или за неделю) минимальное количество баллов, будет также удаляться из базы данных.

    ______

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

    Повторю: весь процесс будет автоматизирован от начала и до конца.

    Пока что программа, выполняющая все эти "манипуляции", готова на 40%. Еще два-три дня и я доделаю ее до конца. Конечно, она пока не будет выполнять все перечисленное выше, но я буду постоянно ее совершенствовать, стремиться к выполнению всех пунктов и даже больше.

    Уверен, что вначале возможны некоторые "ляпсусы", ошибки и т.п., за который я заранее приношу свои извинения. Вам, программистам, как ни кому лучше знать, что программ без ошибок не бывает. Я постараюсь исправлять всё как можно скорее. В конце концов, мы получим механизм, работающий без сбоев.

    Но не будем забегать далеко вперед. Как говориться, время покажет: получится ли все, что я задумал или нет...

    А пока предлагаю Вам подписаться на рассылку "Ассемблер? Это просто! Учимся программировать (FAQ)" в приведенной ниже форме:

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

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

    Всем спасибо!!!


    Ко мне поступило несколько интересных писем, которые я с удовольствием публикую.

    ___________

    Еще несколько слов о С++.

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

    1. То, что файлы *.h - заголовочные файлы и содержат они в основном прототипы, это правда. Я сказал в основном, потому что это не обязательное условие - просматривая заголовочные файлы реализации языка C++ (версия 3.2) фирмы Borland я встречал в отдельных h-файлах не только описание (прототипы) функций, но и их определение (текст).

    2. Включение библиотек в код программы.
    > в код программы включаются ТОЛЬКО ИСПОЛЬЗУЕМЫЕ В ДАННОЙ ПРОГРАММЕ ФУНКЦИИ.

    Вот это самое большое заблуждение. Надеяться на данных факт просто нельзя! Это сугубо личное дело компилятора, а точнее фирмы, которая его написала. Стандарт языка C++ не оговаривает данное условие. И если честно, то я не встречал ещё ни одного компилятора (не только C-шного, но и любого другого), который бы поступал подобным образом. К коду программы подключается _ВСЯ_ библиотека, независимо от того, одну функцию из неё вы используете или все. И именно подключённые библиотеки влияют на размер программы (ты был прав), а не загрузчики C. Это очень хорошо заметно, когда вы используете огромные библиотеки, например VCL из C++ Builder: размер всех файлов загрузчиков C (c0?.obj) - 18 kB, минимальный размер программы написанной на Builderе с подключенной VCL - ~500 kB (это просто вставляется один include и не используется ни одна функция), по-моему, разница существенная.

    Прислал Mr. None (mrnone@online.sinor.ru).

    ___________

    Здравствуйте.

    У меня есть предложение поместить в вашу рассылку описание функции, возвращающей псевдослучайные числа. Многие книги по программированию об этом умалчивают, и в вашей рассылке я тоже этого не встречал. За основу можно взять метод Дж. Неймана, который называют еще методом середины квадратов.

    Метод заключается в том, что мы берем некоторое число K0, например k0=0.9876, возводим его в квадрат и получаем 0.97535376, выберем четыре средние цифры и положим K1=0.5353. Снова возводим в квадрат - 0.28654609, снова выбираем четыре средние цифры. Получаем K2=0.6546 и т.д : K3=0.8501, K4=0.2670, .... Можно модифицировать этот метод как угодно, например брать не средние цифры, а через одну или накладывать различные маски на уже полученные K. Например к К1 добавляем 0.1111, к К2 - 0.1112 .. до 0.2000, а при переполнении отнимать единицу. Таким образом поле для исследований большое. Можно так же составить программу, которая бы применяла последовательно определенные модификации метода и искала тот метод, где наиболее равномерное распределение.

    Я думаю, что это может быть интересно подписчикам.

    Спасибо за то, что уделили этому внимание,

    Сергей.

    _______

    Уважаемый Сергей!

    Даже не знаю, рассмотрим ли мы данный метод или нет. Боюсь, что время не позволит.

    Тем не менее, полагаю, что, изучив Ассемблер, а также команды сопроцессора, Вы без труда сами напишите подобную программу.

    ___________

    А вот очень интересное предложение от Макса Черничкина.

    Здравствуйте, уважаемый Олег!

    Прочитал рассылку №26, и мне пришел в голову другой вариант хранения файлов в памяти. Т.к. длина имени файла не превышает 255 символов, то вместо адресов следующего и предыдущего имен можно хранить их длины. Это позволяет освободить 2 байта на каждый файл, а для доступа к следующему или предыдущему имени файла просто прибавлять или отнимать длину + 3 байта.

    С другой стороны, оба этих метода, имхо, неэффективны в случае, когда необходимо сделать быстрый скачок через несколько файлов (например, при нажатии клавиши движения курсора вправо или влево). Мне кажется, что лучше отдельно от списка файлов создавать массив с адресами их имен. В самом же списке файлов вместо 2-х адресов соседних имен файлов, хранить индекс текущего имени размером в слово, а может можно будет и от него отказаться (потом видно будет). Также вместе с адресами имен имеет смысл хранить и статус файла для более быстрого доступа к нему. Текущий индекс будем хранить в переменной типа word.

    И еще такой вопрос. Во время работы над своей оболочкой мне надоело постоянно писать команды push хх при передаче параметров в процедуры, поэтому я для каждой процедуры с параметрами сделал макроопределения, которые существенно повышают читабельность и удобство написания кода.

    Например:

    String macro X,Y,msg,Col
    push X
    push Y
    push offset msg
    push Col
    call Stringp
    endm

    Stringp proc
    ...
    ret 8
    Stringp endp

    Вызов процедуры: String 10, 10, message, 1Ah

    Вопрос: нет ли во всем этом каких-либо "подводных камней", которые я мог упустить? Если я не ошибаюсь, то машинный код ведь генерируется одинаковый при нормальном и таком способах вызова процедуры. Спрашиваю потому, что нигде такого не видел.

    И последний вопрос: где можно найти описания "новых" функций ДОС, типа тех, что использовались в Super Shell для работы файлами с длинными именами? Ни в одном моем справочнике, коих у меня довольно много, я их не нашел.

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

    --

    Всего доброго,
    Макс Черничкин (ака Semax) (
    semax@aport.ru)

    ____________

    Спасибо, Макс, за интересную идею по поводу хранения имен длинных файлов. Полагаю, что всех подписчиков данный алгоритм заинтересует (он просто не может не заинтересовать настоящих ассемблерщиков!).

    Что касается вопросов.

    По поводу макросов. Это двольно-таки удобная штука. Однако, я, например, никогда ими не пользуюсь. Просто не привык... Никаких "подводных камней" здесь быть не может, если, конечно, Вы сами не допустите ошибку.

    По поводу новых функций DOS, которые я испльзую в нашей оболочке. Я беру все это из разных источников, как на английском, так и на русском языках. Безусловно, английской документации больше, поэтому, если Вы владеете им, то можете найти описания многих функций на просторах англоязычного Интернета. Могу посоветовать приобрести книгу Зубкова "Ассемблер для DOS, Windows и Unix". В ней можно также встретить много полезной информации.


    RESID27.ASM

    RESID27_.ASM
    TEST27.ASM

    Приложение в Интернете

    ВНИМАНИЕ!!! Не спешите ассемблировать программу. Прочтите сперва выпуск!

    Сегодня у нас последний пример резидентной программы под DOS, в которой мы рассмотрим удаление резидента из памяти.

    Казалось бы: неужели так сложно удалить резидентную программу из памяти? С одной стороны ничего сложного в этом нет, но с другой существует некоторая сложность.

    Во-первых, резидент не всегда удается удалить.

    Во-вторых, необходима некоторая подготовка и проверка определенных параметров перед удалением.

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

    Все это мы рассмотрим в настоящем выпуске. Как обычно для понимания темы вам помогут файлы-приложения.

    Рекомендую вам внимательно ознакомиться с приведенной в данном выпуске информацией, т.к. она поможет вам полностью понять механизм прерываний и принцип работы резидентных программ. Мы почти все это уже рассматривали, но, тем не менее...

    __________

    Выше голову, господа! Приступаем!

    Итак, представим, что никакая резидентная программа не перехватывает прерывание 21h. Т.е. его адрес (вектор) указывает прямиком на ядро DOS. Вот таблица:

    Адрес Кто перехватывает Куда отправляет после обработки
    1234:0000h Ядро DOS Никуда

    Как вам уже известно, MS-DOS имеет свои обработчики некоторых прерываний (например, 20h, 21h и пр.). Использовать прерывания DOS без загрузки самой ОС невозможно. При попытке это сделать, компьютер просто зависнет. Например, в программе загрузочного сектора диска (которая загружается самая первая, т.е. до загрузки DOS) нельзя пользоваться функциями DOS, т.к. они просто не загружены. Но ей ничего не мешает использовать прерывания BIOS, т.к. они находятся в области ПЗУ и могут вызываться из любой ОС и в любое время.

    Теперь внимательно смотрите на приведенную выше таблицу. В данном случае, допустим, что процедура обработки 21h-ого прерывания MS-DOS загрузилась по адресу 1234:0000h. Никакая иная программа его не перехватила еще. Т.о., выполняя команду int 21h, процессор передаст управление напрямую процедуре обработки 21h-ого прерывания MS-DOS, т.е. на адрес 1234:0000h. Данная процедура, отработав (например, выведя на экран строку), передаст управление сразу нашей программе. Это простейшая схема. Надеюсь, что понятно...

    Теперь пользователь загружает некий резидент с именем progA.com, который перехватывает 21h-ое прерывание. Вот, что у нас получится:

    Адрес Кто перехватывает Куда отправляет после обработки
    1234:0000h Ядро DOS Никуда
    2345:0000h progA.com 1234:0000h

    Здесь видно, что progA.com перехватила 21h-ое прерывание. Т.е. как бы стало фильтром на пути к оригинальному обработчику (обработчику MS-DOS (1234:0000h)).

    Теперь, выполняя команду int 21h, первым, кто получит управление, - это progA.com. Процедура обработки 21h-ого прерывания программы progA.com (которая находится по адресу 2345:0000h), получает управление, делает, что хочет, а затем передает дальше, т.е. на 1234:0000h. Ядро DOS выполняет определенные действия, а затем передает управление назад командой iret.

    Вот здесь важно уяснить. Допустим, команда int 21h нашей программы находится по адресу 3456:0100h. Тогда, при выполнении команды int 21h, в стек будет занесен адрес 3456:0102h (т.е. адрес следующей команды. Не забывайте, что int 21h занимает два байта!), а процессор возьмет адрес 21h-ого прерывания из таблицы векторов прерываний (помните такую?) и передаст управление по этому адресу (т.е. на 2345:0000h, т.е. на progA.com).

    В свою очередь, progA.com отработает (может, например, изменить значения каких-либо регистров, что делает наш резидент) и передаст управление... А куда, собственно, передаст управление???

    Вот для этой цели мы в наших резидентах сперва получаем текущий адрес обработчика того или иного прерывания, а затем, как наш обработчик отработал, передаем управление на сохраненный адрес.

    Программа progA.com поступит точно также. Перед тем, как установить обработчик на свою процедуру, она сперва получает адрес прежнего (оригинального) обработчика (т.е. в данном случае - ядра DOS, т.к. никакие резидентные программы не загружены), вызывая функцию 35h прерывания 21h, либо прочитав адрес напрямую из таблицы векторов прерываний.

    Продолжим. ProgA.com отработает и передаст управление по предварительно сохраненному адресу на предыдущую процедуру обработки int 21h.

    Получает управление ядро DOS. Выполняет свои действия и возвращается. Спрашивается, куда и как?

    Естественно, что командой iret, которая вытаскивает из стека предварительно занесенный в него адрес. Какой? На progA.com, либо на нашу программу, выполнившую команду int 21h?

    Все зависит от того, каким образом progA.com передало управление. Как уже не раз отмечалось в предыдущих выпусках, существует два способа передачи управления прежнему (оригинальному) обработчику:

    1. jmp dword ptr cs:[Int_21h_vect]

    и

    2. pushf
    call dword ptr cs:[int_21h_vect]

    В первом случае команда iret передаст управление сразу нашей программе, которая вызывала прерывание 21h командой int 21h. Это и понятно: jmp в стек ничего не кладет. Получается, что перед выполнением команды jmp... в стеке находится адрес возврата на нашу программу (если, конечно, progA.com не нарушает работу стека). Команда IRET обработчика 21h ядра DOS вытащит со стека адрес возврата на нашу программу и все! Наша программа пойдет работать дальше, даже не "подозревая" о том, что некая progA.com сидит в памяти и контролирует вызов 21h-ого прерывания!

    Во втором случае после выполнения IRET управление получит progA.com. Здесь также все понятно: команда call заносит в стек адрес возврата. IRET и вытащит со стека его! Зачем нужен pushf - вы уже знаете...

    Что же будет дальше делать progA.com? Она может посмотреть, что вернула функция и выполнить определенные действия. Затем выполнит команду IRET, которая вытащит со стека адрес возврата на нашу программу, которая и вызывала 21h-ое прерывание командой int 21h.

    Для чего нужно программе progA.com перехватывать int 21h? Да по разным причинам. Многие из них мы уже рассмотрели. Например, контроль за открытием / закрытием файла, чтением / записью да и за всем, что выполняет прерывание 21h!

    Вы уловили суть? Очень надеюсь... Если нет, то попробуйте внимательно прочитать еще раз.

    Итак, вернемся.

    Мы остановились на том, что progA.com "повисла" на 21h прерывание, предварительно сохранив в своем теле адрес оригинального обработчика (т.е. обработчика ядра DOS, т.е. 1234:0000h). Теперь при выполнении команды int 21h управление получает сперва progA.com, а затем уже ядро DOS.

    Теперь мы загружаем еще одну программу progB.com, которая также перехватит 21h-ое прерывание! Смотрим:

    Адрес Кто перехватывает Куда отправляет после обработки
    1234:0000h Ядро DOS Никуда
    2345:0000h progA.com 1234:0000h
    3456:0000h progB.com 2345:0000h

    Теперь какая-то программа (ну, например, NC.EXE) вызывает int 21h. Что происходит?

    Int 21h кладет в стек адрес возврата, достает с таблицы векторов прерываний адрес 21h-ого прерывания (т.е. 3456:0000h) и передает ему управление. ProgB.com выполняет то, что хочет и передает управление на адрес прежнего (оригинального) обработчика 21h-ого прерывания, который был ей предварительно сохранен (т.е. на 2345:0000h, т.е. progA.com). ProgA.com, в свою очередь, делает то, что хочет и т.д. по цепочке, пока управление не получит ядро DOS. Т.о. на одно прерывание можно "насаживать" неограниченного число резидентов.

    Теперь возникает вопрос: как удалять резидент из памяти?

    Вернемся к таблице.

    Адрес Кто перехватывает Куда отправляет после обработки
    1234:0000h Ядро DOS Никуда
    2345:0000h Resid27.com 1234:0000h

    Думаю, что пояснения не требуются. Но есть несколько вопросов:

    ________

    1. Как нам узнать, куда загрузилась программа Resid27.com?

    2. Как нам узнать адрес обработчика прерывания ядра DOS?

    3. Как нам удалить программу из памяти?

    ________

    Все ответы очень просты.

    1. Помните, как мы передавали "позывной" нашему резиденту. Если он откликался, значит уже есть в памяти; если нет - то пока не загружен.

    Таким же способом можно получить сегмент и смещение процедуры обработки 21h-ого прерывания. Сперва проверим на повторную загрузку (mov ax,9988h / int 21h), а затем отправим какое-нибудь число (в нашем примере - 9999h). Тогда наш резидент, получив 9999h в AX, моментально выходит из процедуры, передавая в определенных регистрах необходимую информацию, а именно: сегмент и смещение резидентной части, сегмент и смещение оригинального обработчика 21h-ого прерывания (в данном случае - ядра DOS). Этого будет вполне достаточно для удаления резидента.

    Затем, убедившись, что резидент загружен и получив необходимую информацию для удаления, можно приступать к освобождению памяти.

    Делаем буквально следующее:

    1. Запрещаем все прерывания командой cli;

    2. Восстанавливаем адрес оригинального обработчика (т.е. ядра DOS);

    3. Освобождаем память функцией 49h.

    Все резидента как не бывало!!!

    Но!

    Представим такую ситуацию. Допустим после нашего резидента загрузился еще один, который также перехватил 21h-ое прерывание. Тогда получаем следующее:

    Адрес Кто перехватывает Куда отправляет после обработки
    1234:0000h Ядро DOS Никуда
    2345:0000h Resid27.com 1234:0000h
    3456:0000h ProgA.com 2345:0000h

    Возникает вопрос: что произойдет, если мы удалим Resid27.com из памяти? Подумайте!!!

    Ответ: программа, выполняющая команду int 21h передаст управление на адрес 3456:0000h, т.е. программе progA.com. ProgA.com, отработав, передаст управление на адрес 2345:0000h. Но что будет находится по этому адресу, если мы удалим Resid27.com?

    Возникает еще один вопрос: а можно ли тогда вообще удалить Resid27.com, если после него загрузился еще один резидент, который также перехватывает 21h-ое прерывание?

    Ответ: а никак! Нужно сперва удалить progA.com, а затем уже удалять Resid27.com.

    Примечание. Resid27.com - это программа, которую мы написали. Удалить чужой резидент очень сложно. Например, Volcov Commander может удалять резиденты. Надеюсь, вы поймете, как он это делает. Но обратите внимание, что удаляет он их снизу вверх. Советую поэкспериментировать с VC. Очень советую...

    ___________

    Что еще осталось? Осталось только прочитать комментарии к фалам-приложениям, которых у нас сегодня три.

    Как экспериментировать с прилагаемыми файлами?

    1. Запустите TEST27.COM.

    2. Запустите RESID27.COM без параметров в командной строке.

    3. Запустите снова TEST27.COM.

    4. Запустите RESID27.COM с параметром /u (т.е. resid27.com /u).

    5. Запустите снова TEST.COM.

    6. Запустите RESID27.COM.

    7. Запустите RESID27_.COM.

    8. Запустите RESID27.COM с параметром /u (т.е. resid27.com /u).

    9. Прочтите описания в файлах-приложениях, а также еще раз рассылку.

    10. Задавайте вопросы нашим экспертам и наслаждайтесь жизнью!

    Удачи!


    Итак, подача заявок на участие в Тусоffке прекращена. Всего подано заявок: 31. Точное время и место встречи будет сообщено по почте персонально каждому подавшему заявку. Ориентировочно: конец мая - начало июня, Москва. Место встречи одно из следующих: центр города, Парк Культуры, Гребной канал, Тушино, ближайшее Подмосковье... Просьба ко всем, кто подал заявку: напишите, где бы Вы хотели встретиться. Забыл я это в форме указать...

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

    К сожалению, последнее письмо от Олега (дата получения: 17 апреля) было получено с небольшими искажениями в электронном адресе отправителя. Прошу Вас, Олег, отправить мне на e-mail Вашу заявку повторно. Спасибо.


    С уважением,

    Калашников Олег: Assembler@Kalashnikoff.ru
    Мой ICQ No.:
    68951340
    My ICQ secretary No.
    (только по-английски!):
    115592286
    URL сайта подписчиков:
    http://www.Kalashnikoff.ru

    ______________

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

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

    Наши друзья

    Подписка на рассылку Сергея Никифорова "Программирование на Visual Basic и ASP" на Subscribe.ru (код рассылки: comp.soft.prog.vbs).

    Название и сайт автора: Visual Basic Streets, http://www.vbstreets.ru.


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

    List Banner Exchange lite

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

    В избранное