Системные программы для «ZX-Spectrum» 1992 г.

Gens-4 - макроопределения. Директивы. Команды условной трансляции.


2.5. МАКРООПРЕДЕЛЕНИЯ

Макроопределения позволяют вам писать более плотные, более значимые
ассемблерные программы, но они должны использоваться осторожно и не должны
конфликтовать с подпрограммами.

Макроопределение состоит из набора инструкций ассемблера вместе с именем
макроопределения. Когда это имя в последующем используется в поле кода
операции, то оно будет заменено на все инструкции ассемблера, составляющее это
макроопределение.

Так, макроопределение NSUB может быть определено следующим образом:

NSUB MАС
OR A

SВС HL, DE
ADD HL,DE
ENDM

Когда бы мы в дальнейшем ни применили NSUB как код операции, оно будет
генерировать три инструкции ассемблера: OR A; SBC HL,DE и ADD HL, DE.

Это спасет вас от лишнего печатания и сделает вашу программу легче для
понимания, но вы должны помнить, что при каждом появлении NSUB генерируется
объектный код, и, может быть эффективнее использовать CALL для вызова вместо
нее подпрограммы. Ниже мы приводим формат макроопределения и его вызов
вместе с некоторыми примерами. Изучайте их, пожалуйста, внимательно.

Макроопределение имеет следующую форму:

имя MАС

тело макроопределения
ENDM

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

"MAC" показывает начало макроопределения, а "ENDM" его конец.

Параметры макроопределения могут упоминаться внутри макроопределения
путем использования знака равенства, за которым следует номер параметра (0...31)
включительно. Таким образом, макроопределение

MOVE MАС

LD HL,=0

LD DE,=1

LD ВС,=2

LDIR
ENDM

имеет три параметра: адрес источника, адрес приемника и длину, загружает
нужные значения в HL,DE и ВС и затем выполняет инструкцию LDIR. Для того
чтобы вызвать макроопределение из тела вашей программы, просто используйте
его имя в поле команд. За именем макроопределения должны следовать
необходимые вам три параметра:

MOVE 16384,16385,4096

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

MOVE START, START+1, LENGTH

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

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

выражении, например:

HMC MAC

LD HL,=0*3600

LD DE,=1*60

ADD HL,DE

LD DE, =2

ADD HL,DE

ENDM

Это макроопределение имеет три параметра: часы, минуты, секунды.
Макроопределение вычисляет общее количество секунд, определяемое
параметрами, и помещает его в регистр HL. Вы можете его использовать
следующим образом:

HOURS EQU 2

MINUTES EQU 3 0

SECONDS EQU 12

START EQU 0

HMC HOURS, MINUTES, SECONDS
LD DE, START

ADD HL, DE ;HL - окончательное время

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

Во время ассемблирования, как только имя макроопределения встречается в
поле команды, ассемблируется его текст. Обычно этот текст тела
макроопределения не попадает в ассемблерный листинг и печатается только для
макроопределения. Однако вы можете усилить листинг расширением
макроопределения, используя команду ассемблера *М + , а, используя *М-,
запретить распечатывать текст макроопределения.

Если вы вышли за пределы пространства, отведенного под буфер макро, то
будет выдано сообщение и прервется ассемблирование. Используйте команду
редактора "С" для резервирования буфера больших размеров.

2.6. ДИРЕКТИВЫ/ АССЕМБЛЕРА

GENS4 распознает определенные псевдокоманды — так называемые
директивы ассемблера. Они не влияют на процессор Z80 при прогоне, т.е. не
декодируются а просто заставляют ассемблер выполнять определенные действия
во время трансляции. Эти действия определенным образом изменяют код,
генерируемый GENS4. Псевдокоманды ассемблера точно такие же, как и
выполняемые инструкции: они могут помещаться за меткой (необходимо для EQU)
и за ними может следовать комментарий.

Возможны директивы:

ORG (выражение) — устанавливает счетчик адресов равным значению
выражения.

Если ключи 2 и 16 оба не указаны и результат ORG попадает в область GENS4,
текстового файла или таблицы символов, то появляется выражение "BAD ORG!" и
прекращается трансляция, см. п.2.0. Для более детального ознакомления с тем, как
ключи 2 и 16 влияют на использование ORG см. команду "А" в разделе 3 для
некоторых предосторожностей в использование ORG, когда автоматически
сохраняется объективный код.

EQE (выражение) — этой директиве должна предшествовать метка. Значению
метки присваивается значение выражения. Выражение не должно содержать
имен, которым еще не присвоено значение. В противном случае ассемблер выдает

вам сообщение об ошибке — ERROR 13.

DEFB (выражение),(выражение)... — каждое выражение

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

DEFW (выражение),(выражение)... — дополняет СЛОВО (2

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

DEFS (выражение) — увеличивается счетчик адресов на значение выражения.
Эквивалент разрезервирования области памяти размером, равным значению
выражения.

DEFM "S" — определяет, последовательность N байтов памяти будет равна
представлению строки "S" в коде ASCII, где N — длина строки. Теоретически, длина
строки может быть от 1 до 255 включительно, но практически она ограничена
длиной строки, которую можно ввести редактором. Первый символ в поле

(II  п п

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

ENT (выражение) —эта директива никак не влияет на генерируемый
объектный код она просто используется для определения адреса, на который
осуществляется переход по команде редактора '^".Выражение ENT устанавливает
этот адрес равным значению выражения. Используется совместно с командой
редактора "R" (см. раздел 3). Для выполнимого адреса нет умолчания.

2.7. КОМАНДЫ! УСЛОВНОЙ ТРАНСЛЯЦИИ

Команды условной трансляции обеспечивают программисту возможность
включения или не включения определенных секции исходного текста в процесс
ассемблирования. Это возможно при использовании команд IF, ELSE,END.

IF (выражение) —эта команда оценивает выражение.

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

ELSE — эта команда просто переключает ассемблирование.

Если перед появлением ELSE было ассемблирование, то в последующем оно
выключается и наоборот.

END — просто включается ассемблирование.

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

2.8. КОМАНДЫ!АССЕМБЛЕРА

Команды ассемблера подобно директивам ассемблера не влияют на работу
ассемблера Z80 т.к. они не декодируются в объектные коды. Однако, в отличие от
директив ассемблера, они не влияют на объектный код, производимый
ассемблером — команды ассемблера просто модифицируют формат листинга.
Команда ассемблера — это строка исходного текста, которая начинается с символа

Надпись после звездочки определяет тип команды и должна быть выполнена
заглавными буквами. Ограничением строки может быть любой текст. Исключение

LT-ч п I II II II Т-»

и D, предполагающие знаки + или - после команды. В
распоряжении программиста имеются следующие команды:

* Е — выдает три пустые строки на экран или принтер — это полезно для
разделения модулей.

*HS — выдает строку "S" -заголовок, который будет печататься после каждого
вывода "*Е". *Н автоматически выполняет *Е.

*S — указывает, что с данной строки листинг должен быть остановлен. Листинг
может быть продолжен нажатием любой клавиши. Полезно для чтения адресов в
середине листинга.

ПРИМЕЧАНИЕ; если *S появляется после *L-, то листинг не останавливается.

*L+ — прекращается листинг и печать, начиная с данной строки.

*L--начинает листинг и печать, начиная с данной строки.

*D + — указывает, что значение счетчика адресов в начале каждой строки
должно выдаваться в десятичном виде вместо обычного 16-ичного,

*D- — возвращение к использованию шестнадцатиричного вида значения
счетчика адресов в начале каждой строки.

*C- — укорачивает листинг ассемблера, начиная со следующей строки Листинг
характеризуется тем, что он не содержит объектного кода, генерируемого текущей
строкой — это укорачивает строку листинга на 9 символов и делает строку
ассемблера более удобной для дисплея с 32-мя символами в строке, что Улучшает
читаемость.

*C + — возвращает к полному листингу, как описано в разделе 2.0.

*M + — включает печать макроопределения.

*M- — выключает печать макроопределения.

*F<имя файла> — это очень мощная команда, позволяющая вам
ассемблировать текст с ленты или дисковода — этот текст читается с ленты или
дисковода в буфер, блокируется там на время и затем ассемблируется из этого
буфера; это позволяет создавать объектный код большого размера, только если
исходный ассемблируемый текст не занимает много места в памяти. Имя
текстового файла (до 10 символов), который вы желаете проассемблировать таким
образом не обязательно должно быть определено и ему должен предшествовать
пробел. Если файл находится на кассете, то вы указываете это, набивая перед
именем файла номер привода с двоеточием:

*F 2:TEST -для файла на микроприводе N2;

*F TEST -для файла на ленте.

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

II •—1—1 fl llr»H /—' «-> 1 V/ V/

редактора "Т", а не "Р" — это необходимо, так как текстовый файл, содержащийся
на ленте, должен быть преобразован в блоки с достаточным размером межблочных
интервалов, что позволяет ассемблировать текущий блок перед тем, как
следующий начнет грузиться с ленты. Размер блока, используемого данной

V / V II •—1—1 II  II /—1 II

командой (и командой редактора Т ), устанавливается с помощью редактора С
(см. следующий раздел). Возможность выбора размера этого буфера позволяет вам
оптимизировать отношение размерскорость для любых выводов текстов с ленты.
Например, если вы не собираетесь использовать команду "F" во время
ассемблирования, то полезно будет определить размер буфера равным 1 для
минимизации пространства, занимаемого GENS4 и минимизации рабочего
пространства. Где бы ни встретил ассемблер команду "F", он определит, откуда
нужно считывать файлы, с дискеты или с ленты. Это происходит на обоих
просмотрах, так как на каждом просмотре необходимо сканировать текст если
считывается лента, то на ней ищется файл с требуемым именем или первый файл.
Если имя файла во время его поиска на ленте не соответствует заданному, то
выдается сообщение: "FOUND FILE" и поиск продолжается, в другом случае
выдается сообщение: "USING FILE", файл загружается блок за блоком и
обрабатывается. Подробнее ознакомиться с "F" вам поможет пример приложения
3.

Остальные команды ассемблера обрабатываются только на втором просмотре.
Если ассемблирование было прервано одной из команд условной трансляции, то и
работа любой команды ассемблера также прерывается.

ЗАМЕЧАНИЕ; описанные возможности не годятся для систем DISCIPLE, OPUS
и PLUS 3, DEVPAC 4. Быстрее и легче вместо ленты использовать диск. Следствием
этого является то, что в этих версиях команда "С" не позволяет вам определить
размер буфера загрузки и команда "Т" не существует




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Pro-обзор - insanity#9 review: "Этот номер хотя и не был изначально ожидаем мною как скандальный, но после выхода таковым стал. Лично я остался если не избитым до смерти, то по крайней мере покалеченным"
Intro - Contents.
Погребок - Пиво - древнейший благородный хмельной напиток. Рецептура его практически не изменилась за тысячелетия.
Художественная литература - Фредерик Браун: "Письмо Фениксу"
Дела сисопские - ZXNet под бой курантов...

В этот день...   3 мая