Подробно и доходчиво объясняются все основные вопросы программирования на ассемблере. Рассмотрены команды процессоров Intel, 16-и 32-азрядные регистры, основы работы с сопроцессором, сегментация памяти в реальном масштабе времени, управление клавиатурой и последовательным портом, работа с дисками и многое другое. Описано, как разработать безобидный нерезидентный вирус и антивирус против этого вируса, как написать файловую оболочку (типа Norton Commander или FAR Manager) и как писать резидентные программы. Каждая глава состоит из объяснения новой темы, описания алгоритмов программ, многочисленных примеров и ответов на часто задаваемые вопросы.
Поиск и считывание файлов . Сюда будет записываться информация о найденных файлах для заражения. Теперь можно попробовать найти первый файл с расширением . Для этого используется функция . Файловая оболочка, вирус, резидент . Обращаем ваше внимание, что вирус у нас пока неработоспособный. То есть он ничего не заражает вообще. Однако на экране ничего не будет отображено в процессе работы программы. Лучше ее сразу смотреть под отладчиком. Дальше все просто. В данном случае, если функция . Если флаг переноса сброшен . мы рассмотрим в последующих главах. Для того чтобы. Но то, что мы будем в ней рассматривать, очень важно. Вам придется вспомнить основы математики и немного подумать. Большую часть работы мы для вас сделали, а именно. Вам осталось только внимательно с ним ознакомиться и разобраться. Очень внимательно изучите данную главу и прилагаемый к ней файл . Так как профамма у нас будет большая, то для облегчения ее понимания и поиска необходимой процедуры будем указывать в скобках название самой процедуры и файла, где нужно искать то, о чем мы вас попросим. Модели памяти Почему мы пишем только файлы типа СОМ. Что такое модель памяти, и какие модели бывают. Модели памяти могут быть следующими. размер программы не может превышать . Эта модель памяти используется в файлах типа СОМ, компактна, и очень удобна для написания небольших программ на ассемблере . Файловая оболочка, вирус, резидент анй. Вершина стека изначально равна . Все предыдущие наши примеры имеют именно такую модель памяти. В этом случае обращение к данным происходит с указанием сегмента и смещения. Следовательно, к данным можно обращаться, используя только смещение, а к коду . Таким образом, один сегмент может иметь размер до . Подобная модель используется, как правило, в профаммах, написанных под . Модель памяти задается директивой . Приведенная ниже профамма типа СОМ оформлена с использованием этой директивы . Вывод окна в центре экрана . Управление курсором Сразу заглядываем в файл . Прежде чем это делать, необходимо запомнить его текущую позицию. Это позволяет сделать функция . Как уже вам известно, видеокарта имеет достаточно памяти для размещения . Каждая видеостраница имеет свой курсор. Причем, отсчет начинается с нуля . Получение текущей позиции курсора . Файловая оболочка, вирус, резидент После того как получили текущую позицию курсора, мы можем его спрятать. Самый распространенный метод — установка курсора за фаницу экрана. В нашем случае — установка на . Так как отсчет идет с нуля, то последняя позиция курсора . Следовательно, установив курсор на строку . Операторы работы со стеком процессора . Как вы знаете, все уважающие себя оболочки сохраняют и, при необходимости, показывают пользователю то, что изображено на экране. Как сохранить то, что находится на экране в данный момент, а затем, при необходимости, показать это пользователю. Почему бы нам не скопировать содержимое пользовательской, нулевой страницы в первую. Здесь мы встречаем новые операторы. Вывод окна в центре экрана . Когда пишут, например, что такой. , но никак не на . В нашем случае команды . Для этого в самом начале файла . Эта директива указывает ассемблеру . Если ничего подобного не указывать . Безусловно, использование команд . Они уменьшают размер профаммы, однако в то же время необходимо следить за тем, чтобы не произошло переполнения стека. Обратите также внимание, как мы заносим в сегментный регистр число. Файловая оболочка, вирус, резидент . Все остальное в данной процедуре . Как и в процедуре восстановления экрана . Прямое отображение в видеобуфер Курсор спрятали, экран пользовательский сохранили. Сейчас можно и окно рисовать. Будем это делать, не прибега. Воспользуемся выводом символов на экран путем прямого отображения в видеобуфер, С данным методом мы уже сталкивались, когда пытались выводить на экран . Теперь рассмотрим его более подробно. Метод прямого отображения символов в видеобуфер — вывод символов на экран, путем записи их напрямую в сегменты видеобуфера . Стоит отметить, что это самый быстрый способ вывода символов на экран. Здесь все зависит от профессионализма программиста и — как следствие — алгоритма вывода, скорости его выполнения. Рассмотрим вкратце модели мон. Вот ряд от старых к современным. При попытке вывода символа в мониторе . Однако эти прерывания использовали процедуру, которая проверяла состояние хода луча монитора . Не знаю, есть ли в настоящих . Главное — при выводе символов через прерывания скорость резко снижается. Полагая, что никто из вас не использует сейчас . И уж тем более на процессорах . Для процедуры рисования окна . В дальнейшем научимся передавать данные в стеке. Перед вызовом данной процедуры необходимо занести некоторые числа в соответствующие переменные . Дальше будем изучать — добавим еще переменных. Для этого необходимо разделить высоту рамки на . Файловая оболочка, вирус, резидент В строке . Что делает оператор . Это гораздо быстрее, чем если бы мы пользовались оператором . А затем вычитаем из . Например, мы выводим рамку высотой в . Вот как производим вычисления. Все то же самое мы делаем с колонками . Посмотрите в прилагаемом примере. В принципе, если что. Как только мы вычислили координаты для вывода окна в центре экрана, мы переводим высоту. Что такое линейный адрес и зачем он нужен. Видеокарта не знает, что такое колонка и строка. Ддя нее все данные расположены в линейном массиве, т. Так как один символ занимает . Для того чтобы отобразить символ в первой строке . отсчет начинается с нуля. Следовательно, если мы указываем строку. Вывод окна в центре экрана. будем делать во всех наших процедурах. самой верхней на экране. один символ на экране занимает два байта. Вот он, линейный адрес. Так как в одной строке . Затем все это складываем . Файловая оболочка, вирус, резидент Листинг . Просто сдвинем биты на . Новые операторы в табл. Практика Теперь рассмотрим, как это выглядит на практике.