Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf
Добавлен: 16.02.2019
Просмотров: 29198
Скачиваний: 1689
Часть III. Файловая оболочка, вирус, резидент
294
XMS_src
(слово) — указывает идентификатор источника. Если эта переменная
равна нулю, то источником (откуда пересылаются данные) является основная
память. В противном случае, переменная должна содержать идентификатор от-
веденного блока XMS-памяти, который выдает функция управления XMS-
памятью при отведении блока (см. в листинге 30.3
XMS_id
).
XMS_offsrc
(два слова) — содержит смещение в блоке-источнике (если копиро-
вание идет из расширенной памяти в основную) или сегмент и смещение в ос-
новной памяти (если копирование идет из основной памяти в расширенную).
XMS_rec
(слово) — указывает идентификатор приемника. Если эта переменная
равна нулю, то приемником (куда пересылаются данные) является основная па-
мять. В противном случае, переменная должна содержать идентификатор отве-
денного блока XMS-памяти, который выдает функция управления XMS-
памятью при отведении блока (см. в листинге 30.3
XMS_id
).
XMS_offrec
(два слова) — содержит смещение в блоке-приемнике (если копиро-
вание идет в расширенную память из основной) или сегмент и смещение в ос-
новной памяти (если копирование идет из расширенной памяти в основную).
Теоретически мы рассмотрели работу с XMS-памятью. Вам осталось лишь вни-
мательно изучить прилагаемый файл XMSblock.asm и описания к нему.
30.4. Программа XMScopy.asm.
Копирование файла с использованием
расширенной памяти
Обратите внимание:
программа корректно копирует файл, размер которого не превышает объем
XMS-памяти, установленной в вашем компьютере! Если в вашей машине стоит
512 Мбайт ОЗУ, то максимальный размер файла, который можно скопировать
с помощью этой программы, будет 512 Мбайт минус 640 Кбайт;
программа копирует файл C:\file.txt в C:\filenew.txt. Прежде чем запускать про-
грамму, необходимо создать файл file.txt в корневом каталоге диска C: (либо про-
дублировать любой другой, задав имя дубликату C:\file.txt). Файл C:\filenew.txt
создается автоматически нашей программой. После того как программа отработа-
ет, оба файла должны быть идентичны, что свидетельствует о корректной работе
программы.
Все эти недоработки вы сможете сами легко устранить. Здесь же был приведен
простейший алгоритм копирования файла.
Программа работает в такой последовательности:
1. Читает файл C:\file.txt в память:
читает 64 Кбайт файла в основную память;
перебрасывает прочитанный блок в расширенную память;
сдвигает указатель, задающий, куда помещать следующую порцию данных
в расширенную память;
Глава 30. Работа с расширенной памятью
295
если не достигнут конец файла, то читает следующий блок. И так до тех пор,
пока не будет достигнут конец файла.
2. После того как файл целиком загружен в память, программа начинает записы-
вать прочитанные данные в файл C:\filenew.txt:
перебрасывает 64 Кбайт из расширенной памяти в основную;
записывает данные в предварительно созданный файл C:\filenew.txt;
сдвигает указатель расширенной памяти;
перебрасывает следующий блок, если есть еще данные...
В принципе, это все, что нужно знать о работе с расширенной памятью в DOS.
Материал в этой главе простой и понятный. Дополнительную информацию вы, как
обычно, найдете в файлах-приложениях.
Также не забывайте, что вам всегда готовы помочь наши эксперты на портале
профессионалов RFpro.ru.
Глава 31
Обзор дополнительных
возможностей оболочки
31.1. Оболочка Super Shell
Вот мы потихоньку и добрались до конца курса базового программирования на
ассемблере. Простейшие функции нашей оболочки уже написаны и многократно
изучены. Осталось только написать процедуры копирования файлов с использова-
нием XMS-памяти и запуска программ. Эти процедуры мы подробно рассматрива-
ли в главе 30. Изучить их и вставить в свой код труда не составит.
Процедуры удаления файлов, перемещения, переименования и пр. не нуждают-
ся в подробных объяснениях. Вы уже имеете неплохой опыт программирования на
ассемблере и можете самостоятельно разобрать перечисленные выше функции. Все
они работают очень просто, с использованием соответствующих функций преры-
вания
21h
(удаление, переименование) или комбинирования (последовательного
вызова) двух и более готовых подпрограмм (копирование + удаление = перемеще-
ние). Однако все процедуры работы с файлами в нашей оболочке связаны с одной
подпрограммой — поиском первого и/или последующих отмеченных пользовате-
лем файлов.
Общий принцип работы следующий:
1. Вызываем процедуру поиска первого отмеченного пользователем файла, кото-
рая возвращает его имя.
2. Если ни один файл не отмечен, то функция отмечает текущий файл, на который
указывает курсор, и возвращает имя этого файла только в случае, если ее вызов
происходит первый раз. В противном случае см. шаг 6.
3. После того как получено имя первого найденного файла, вызывается соответст-
вующая процедура (копирования, удаления, переименования и т. п.), в зависи-
мости от того, какую операцию собирается выполнить пользователь с выбран-
ным файлом.
4. После того как операция завершена (файл скопирован, удален и т. п.), вызывает-
ся функция снятия отметки этого файла.
5. Далее происходит поиск нового отмеченного файла (см. шаг 1).
6. Если отмеченных файлов больше нет, то функция выдает сообщение о том, что
ее работа закончена, текущий каталог перечитывается заново, и программа ждет
дальнейших указаний от пользователя.
Глава 31. Обзор дополнительных возможностей оболочки
297
Наша файловая оболочка будет обрабатывать следующие функции:
копирование файла с использованием XMS-памяти;
перемещение файла;
удаление файла;
запуск файлов COM, EXE и BAT через интерпретатор;
создание каталога;
удаление пустого каталога.
Опираясь на материал данной книги, вы без труда сможете самостоятельно реа-
лизовать следующие функции:
копирование каталогов с вложенными подкаталогами;
выполнение внутренних команд консоли (DIR, COPY и т. п.);
загрузку файла с любым расширением с предварительным запуском соответст-
вующей программы-обработчика этого расширения и передачей ему в команд-
ной строке имени загружаемого файла (например: prog.asm —
ml.exe prog.asm
/AT
; readme.txt —
notepad.exe readme.txt
и т. п.);
и многие другие по вашему усмотрению.
Наша же задача состояла в том, чтобы дать вам основы программирования, под-
готовить к написанию программ под Windows, научить использовать операторы
ассемблера, открыть возможности операционной системы MS-DOS, показать алго-
ритмы и принципы их работы. Вам достаточно будет иногда заглядывать в готовый
ассемблерный файл оболочки (впрочем, как и любых других программ, рассматри-
ваемых в этой книге), чтобы "вытащить" из него необходимые подпрограммы, про-
читать описания к ним, использовать в своих программах.
Как вы уже поняли, написание полноценной файловой оболочки для DOS тре-
бует дополнительных усилий. Тем более, что широко известный Norton Commander
не сразу начинался с версии 5.0.
31.1.1. Вызов внешних вспомогательных программ
Что же касается процедуры редактирования файлов, то можно сказать следую-
щее. Данная процедура довольно сложна и требует много времени для ее написа-
ния на чистом ассемблере. В настоящий момент существует множество мощных
внешних многофункциональных редакторов (например, тот же Hacker's View), кото-
рые вполне можно привязать к оболочке. Необходимо предоставить пользователю
возможность указать полный путь (или просто имя) к текстовому редактору, который
будет вызываться при нажатии, например, комбинации клавиш <F3>/<F4>, с переда-
чей в командной строке текущего файла. Один из алгоритмов редактирования файла
см. далее.
Аналогичным образом можно поступить и с архивами. Если, например, пользо-
ватель пытается посмотреть или запустить файл с расширением ZIP, RAR и т. п., то
нужно будет загрузить соответствующий архиватор и передать ему имя открывае-
мого или запускаемого файла. Пользователю оболочки необходимо будет указать
путь к архиватору и его имя, которые должны сохраняться в INI-файле (конфигу-
рационном файле) оболочки и при ее запуске автоматически считываться в память.
Часть III. Файловая оболочка, вирус, резидент
298
Многие архиваторы позволяют упаковывать файлы, список которых находится
в некотором временном файле, передаваемом им в командной строке с определен-
ными опциями. Например, RAR. Это можно использовать и в своих целях: если
пользователь собирается заархивировать отмеченные файлы, то прежде чем вы-
звать архиватор, оболочка должна сохранить список отмеченных пользователем
файлов в каком-нибудь своем, временном файле и передать эти параметры архива-
тору в командной строке. Поддерживает ли тот или иной архиватор необходимые
опции, можно посмотреть в его справочной информации.
31.1.2. Редактирование файла
Редактирование файла можно реализовать следующим образом. Отводятся два
сегмента, скажем, 64 Кбайта и 128 Кбайт (один должен быть в два раза больше
второго), в меньший из которых загружается файл, а в больший заносятся ссылки
(смещения) размером в слово на очередной символ (табл. 31.1).
Таблица 31.1. Редактирование файла. Вид изнутри
Сегмент с файлом (64 Кбайт)
На экране
Сегмент смещений (128 Кбайт)
Текст
Текст
0001 0002 0003 0004 0005 FFFF
В левой колонке таблицы (Сегмент с файлом) показано, что загружен файл
размером 5 байт ("Текст"), в средней (На экране) — то, как файл будет отобра-
жаться на экране, а в правой (Сегмент смещений) расположены 16-разрядные
смещения на каждый символ в сегменте с файлом. Символ "Т" следует записывать
на диск и выводить на экран первым, "е" — вторым, "к" — третьим и т. д. Послед-
нее число (
FFFFh
) сигнализирует о конце файла. Так как файл только что загружен
и еще не редактировался, то символы располагаются в памяти последовательно,
друг за другом.
Теперь допустим, что пользователь вставил между символами "к" и "с" символ
"ц". Содержимое памяти у нас должно измениться (табл. 31.2).
Таблица 31.2. Добавление одного символа в редактируемый файл
Сегмент с файлом (64 Кбайт) На экране Сегмент смещений (128 Кбайт)
Текстц
Текцст
0001 0002 0003 0006 0004 0005 FFFF
При сохранении же файла следует производить запись побайтно, получая необ-
ходимое смещение из колонки Сегмент смещений: первым записываем символ
"Т", вторым — "е", третьим — "к", четвертым — "ц" и т. д. Следует отметить, что
запись будет происходить довольно быстро, т. к. BIOS пишет данные не по байтам,
а сразу блоками.
Это один из самых простых и далеко не оптимальных алгоритмов. Вместо
вставки смещения можно было просто вставлять сам символ. Попробуйте сами