|
длина имени файла
3 file_nlen_0 db ? ;действит.длина имени файла
3 file_name_0 db 50 dup (?) ;буфер имени файла
3 file_hand_1 dw ? ;заголовок файла
3 file_nmax_1 db 49 ;макс. длина имени файла
3 file_nlen_1 db ? ;действит.длина имени файла
3 file_name_1 db 50 dup (?) ;буфер имени файла
------------------------------------------------------------------
В добавление к директиве REPT мы также использовали счетчик.
Счетчик - это переменная, имеющая цифровое значение. |
файловый менеджер |
|
|
Так как его
значение может меняться, он должен быть определен при помощи опе-
ратора присваивания (=). (В MASM для определения переменных, име-
ющих статические значения, используется оператор equ (прирав-
нять), в то время как для определения переменных, чьи значения
могут изменяться, применяется знак равенства (=).) Счетчик, при-
меняемый в макро file_head, называется fcnt (счетчик файла).
Счетчик fcnt увеличивается на 1 при каждом проходе file_head. |
домашняя бухгалтерия |
|
{img3} |
резервное копирование баз данных |
|
Но
почему метки находятся в file_head2, file_hand_0 и т.д., а не в
file_hand_fcnt? Каким образом имя fcnt заменяется на свое значе-
ние? Ответ заключается в операторе "%",стоящем в вызове
file_head2 перед fcnt. Знак процента предписывает замену символа
на его значение. |
утилиты резервного копирования |
|
|
winrar, panda activescan, winrar, win rar, резервное копирование файлов, .
avast 4 professional
|
Это макро может быть
усовершенствовано. Что необходимо сообщить программе пофайлового
копирования, если мы хотим одновременно обрабатывать два файла?
Нам следует дважды вызвать file_head (описатель файла):
file_head 1 ;1-ый блок файла
file_head 2 ;2-ой блок файла
Вместо этого, используя директиву REPT (повторить), мы можем
написать file_head так, чтобы он определял столько блоков, сколь-
ко необходимо. Такой макрос приведен в Листинге 1-3.
Листинг 1-3. Описание блока доступа к файлу
------------------------------------------------------------
fcnt = 0 ;определить и иниц-ать символ
file_head2 MACRO fnum
file_hand_&fnum dw ? ;заголовок файла
file_nmax_&fnum db 49 ;макс.длина имени файла
file_nlen_&fnum db ? ;действ.длина имени файла
file_name_&fnum db 50 dup (?) ;буфер имени файла
ENDM
file_head MACRO fnum
REPT fnum ;повторить блок "fnum" раз
file_head2 %fcnt ;создать блок #"fcnt"
fcnt = fcnt + 1
ENDM ;закончить блок повторения
ENDM ;закончить макро file_head
-------------------------------------------------------------
Как показано в Листинге 1-4, при вызове макро file_head оно, в
свою очередь, дважды вызывает макро file_head2, используя каждый
раз новое значение fnum. Конечно, это макрорасширение со значени-
ем статуса листинга, установленного по умолчанию, не показывает
явно обращения к file_head2. Однако результат работы REPT мы мо-
жем видеть по двум созданным блокам управления файлами. Заметим,
- 1-11 -
что директива REPT должна заканчиваться строкой ENDM, равно как и
директива MACRO. Вcе блоки повторения должны заканчиваться ENDM
(конец макро). Аналогично ENDM должно появляться в конце каждого
макроопределения.
Листинг 1-4. Макрорасширение блока описания доступа к файлу
-----------------------------------------------------------------
file_head 2
3 file_hand_0 dw ? ;заголовок файла
3 file_nmax_0 db 49 ;макс.
|
|
|