Ассемблер — это просто. Учимся программировать. 2-е издание

Ассемблер — это просто. Учимся программировать. 2-е издание
Автор: Калашников Олег
Год: 2011
ISBN: 978-5-9775-0591-8
Страниц: 336
Язык: Русский
Формат: PDF +CD
Размер: 18 Мб

Download

Подробно и доходчиво объясняются все основные вопросы программирования на ассемблере. Рассмотрены команды процессоров Intel, 16- и 32-разрядные регистры, основы работы с сопроцессором, сегментация памяти в реальном масштабе времени, управление клавиатурой и последовательным портом, работа с дисками и многое другое. Описано, как разработать безобидный нерезидентный вирус и антивирус против этого вируса, как написать файловую оболочку (типа Norton Commander или FAR Manager) и как писать резидентные программы.
Каждая глава состоит из объяснения новой темы, описания алгоритмов программ, многочисленных примеров и ответов на часто задаваемые вопросы. Во второе издание внесены исправления и добавлены новые примеры. Компакт-диск содержит исходные коды всех примеров, приведенных в книге, с подробными описаниями.

+

Системные переменные (окружение MS-DOS)

Системные переменные содержат параметры, устанавливаемые автоматически при запуске консоли либо вручную с помощью внутренних команд. Пример системных переменных:

Системные переменные передаются каждой программе, которая загружается. Причем не важно, резидент это или обычная программа. Читая данные переменные, многие программы находят файлы по пути, который содержит переменная path. Более того, вирусы могут заражать файлы, используя значение этой переменной.
Посмотреть системные переменные можно с помощью внутренней команды SET, набрав ее в командной строке. На рис. 23.2 показаны эти переменные под операционной системой Windows 2000. Изменения системных переменных с помощью команды SET действительны только для текущего сеанса консоли.
Также посмотреть и изменить эти переменные можно следующим способом: правая кнопка мыши на значке Мой компьютер, далее Свойства | Дополнительно | Переменные среды | Системные переменные. Изменение переменных в данном окне сохраняется и действует при следующем сеансе работы в операционной системе.
Эти параметры создает DOS автоматически после загрузки программы в память, но до передачи ей управления и заносит в сегмент, адрес которого находится в PSP по смещению 2Ch, причем смещение всегда равно нулю. Пример чтения окружения рассмотрим далее. Сейчас разберем, чем оно может помешать нашему резиденту.

Дело в том, что резидент, как правило, занимает больше места в оперативной памяти после его установки, чем на диске. Иными словами, COM-файл на винчестере, например, может иметь размер 130 байт, а в памяти — 350 и более байт. Почему так происходит? Вспомните, что перед вызовом прерывания 27h, которое оставляет программу в памяти, необходимо указать в регистре dx последний освобождающийся байт. Все, что расположено перед смещением, указанным в dx, остается в памяти. В табл. 23.3 приведено состояние памяти после загрузки на выполнение файлов типа COM.

Как уже упоминалось ранее, оставлять PSP в памяти вместе с резидентной программой обычно не нужно. В прилагаемом примере мы используем префикс (256 байт), как буфер. Для этого высчитаем размер программы и ее данных, остающихся в памяти: резидентная часть + 256 байт PSP.

Резидентная часть — та часть программы, которая остается в памяти. Резидент — более широкое понятие, включающее в себя еще и процедуру инициализации. Иногда называют резидентом и резидентную часть, что не совсем верно, зато коротко.
Но и это еще не все, что остается в памяти вместе с резидентной частью нашей программы. Помимо PSP, в памяти находится также и сегмент с окружением DOS, создаваемый операционной системой для каждого процесса (программы). Сегмент может занимать 32 Кбайта и более, но, как правило, не превышает 50—100 байт.
Каким образом можно избавиться от окружения DOS, тем самым, освободив дополнительно некоторое количество памяти для других программ? Подобная процедура была актуальна для программ, работающих под управлением MS-DOS и в режиме реального использования памяти. Максимальный объем ОЗУ в этом режиме составляет 640 Кбайт. Тем не менее, в данной главе мы рассмотрим, каким образом можно освободить память, занятую системными переменными, а также пареллельно изучим кое-что новое.
В PSP по смещению 2Ch находится сегмент окружения DOS. Вспомните, как мы в одной из прошлых глав урезали и отводили блоки памяти. То же самое нам надо сделать и с памятью, занимаемой системными переменными. Вот, как это выглядит в файле-приложении (листинг 23.1).