Иллюстрированный самоучитель по SVGA

Часто используемые в примерах имена

После директивы указывается значение, которое Макроассемблер присваивает переменной. В примере 2.11 переменным сразу присвоены конкретные значения, но на практике они формируются в процессе выполнения задачи. Например, код сегмента видеобуфера (значение переменной vbuff) обычно АОООb, но возможны исключения, поэтому его значение надо выбирать из массива info.

В конце каждой строки примера 2.11 расположен комментарий, поясняющий назначение переменных и директив. Признаком начала комментария является символ "точка с запятой". Обнаружив его, Макроассемблер просто пропускает весь текст до конца строки.

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

Следует отметить, что после директив описания типа может указываться не одно, а несколько значений, при этом Макроассемблер размещает эти значения в последовательно расположенных байтах, словах или двойных словах. Имя переменной в таком случае относится только к первому байту, слову или двойному слову. В отдельных случаях оно может вообще отсутствовать (см. пример 6.3). Существует специальный оператор повторения, который позволяет связать с именем переменной требуемое количество байтов, например:

Buffpal dd 256 DUP (0); резервирование и очистка памяти

В этом примере имя buff pal соответствует буферу размером в 256 двойных слов, содержимое которых принудительно очищается.

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

filspc db 'c:\tmp\current.pal', 00; описание спецификации файла

В этом примере описана спецификация файла current.pal, который находится на диске С в каталоге ТМР. Спецификация предназначена для процедуры BIOS, выполняющей открытие файла для чтения или записи, поэтому ее текст заканчивается пустым байтом.

Макросы PushReg и PopReg

Подпрограммы во время выполнения не должны изменять чужие или исходные данные. Для этого перед началом основных действий в стеке сохраняется содержимое используемых регистров или переменных, а перед выходом из подпрограммы восстанавливаются исходные значения сохраненных величин. Сохранение в стеке одной величины выполняет одна команда, это же относится и к восстановлению. Существует специальное средство, позволяющее сократить запись повторяющихся однотипных действий и сделать ее более наглядной. Таким средством являются макросы. Подчеркнем, что сокращается только исходный текст, а не количество команд в теле задачи.

Понятие макрос (macro) распространяется на макроопределение (macro definition) и макроподстановку или макровызов (macro substitution). Макроопределение описывает некую заготовку текста программы, а макровызов – способ ее использования. Макроопределение существует только в исходном тексте, оно модифицируется в зависимости от указанных при вызове параметров и в измененном виде включается в тело задачи на месте каждого макровызова.

Ниже приводится пример двух простых макроопределений (пример 2.12). Их вызовы уже использовались в примерах 2.8 и 2.9, и будут неоднократно встречаться во многих примерах. Первое из них PushReg предназначено для сохранения в стеке содержимого регистров, a PopReg – для восстановления из стека ранее сохраненных регистров.

Пример 2.12. Описание макроопределений PushReg и PopReg.

; Сохранение в стеке регистров, перечисленных в списке гeg
PushReg macro reg ; заголовок макроопределения
  irp r,<reg> ; начало оператора повторения
     
  push r заготовка повторяемой команды
  endm конец оператора повторения
endm   конец макроопределения
BO( :становление из стека регистров, перечисленных в списке reg.
PopReg macro reg заголовок макроопределения
  irp r,<reg> оператор повторения
  pop r заготовка повторяемой команды
  endm конец оператора повторения
endni   конец макроопределения
     

Макросы примера 2.12 различаются только заготовкой повторяемой команды. В одном случае это запись в стек, а в другом – выталкивание из него.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.