Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Программирование

Добавлен: 16.02.2019

Просмотров: 29198

Скачиваний: 1689

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

Часть 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 Кбайт файла в основную память; 

 

перебрасывает прочитанный блок в расширенную память; 

 

сдвигает  указатель,  задающий,  куда  помещать  следующую  порцию  данных  
в расширенную память; 


background image

Глава 30. Работа с расширенной памятью 

295 

 

если не достигнут конец файла, то читает следующий блок. И так до тех пор, 
пока не будет достигнут конец файла. 

2.  После  того  как  файл  целиком  загружен  в  память,  программа  начинает  записы-

вать прочитанные данные в файл C:\filenew.txt: 

 

перебрасывает 64 Кбайт из расширенной памяти в основную; 

 

записывает данные в предварительно созданный файл C:\filenew.txt; 

 

сдвигает указатель расширенной памяти; 

 

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

В принципе, это все, что нужно знать о работе с расширенной памятью в DOS. 

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

Также  не  забывайте,  что  вам  всегда  готовы помочь наши эксперты на портале 

профессионалов RFpro.ru.  

 


background image

 

 

 

Глава 31 

 

Обзор дополнительных  
возможностей оболочки 

31.1. Оболочка Super Shell 

Вот мы потихоньку и добрались до конца курса базового программирования на 

ассемблере.  Простейшие  функции  нашей  оболочки  уже  написаны  и  многократно 
изучены. Осталось только написать процедуры копирования файлов с использова-
нием XMS-памяти и запуска программ. Эти процедуры мы подробно рассматрива-
ли в главе 30. Изучить их и вставить в свой код труда не составит. 

Процедуры удаления файлов, перемещения, переименования и пр. не нуждают-

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

21h

  (удаление,  переименование)  или  комбинирования  (последовательного 

вызова) двух и более готовых подпрограмм (копирование + удаление = перемеще-
ние). Однако все процедуры работы с файлами в нашей оболочке связаны с одной 
подпрограммой —  поиском  первого  и/или  последующих  отмеченных  пользовате-
лем файлов. 

Общий принцип работы следующий: 

1.  Вызываем  процедуру  поиска  первого  отмеченного  пользователем  файла,  кото-

рая возвращает его имя. 

2.  Если ни один файл не отмечен, то функция отмечает текущий файл, на который 

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

3.  После того как получено имя первого найденного файла, вызывается соответст-

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

4.  После того как операция завершена (файл скопирован, удален и т. п.), вызывает-

ся функция снятия отметки этого файла. 

5.  Далее происходит поиск нового отмеченного файла (см. шаг 1). 
6.  Если отмеченных файлов больше нет, то функция выдает сообщение о том, что 

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


background image

Глава 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-файле (конфигу-
рационном файле) оболочки и при ее запуске автоматически считываться в память. 


background image

 

Часть 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 пишет данные не по байтам, 
а сразу блоками. 

Это  один  из  самых  простых  и  далеко  не  оптимальных  алгоритмов.  Вместо 

вставки  смещения  можно  было  просто  вставлять  сам  символ.  Попробуйте  сами