Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ZX Spectrum для пользователей и программистов.doc
Скачиваний:
56
Добавлен:
28.09.2019
Размер:
1.92 Mб
Скачать

_________________________________________________________Метки

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

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

Метка может быть составлена из символов 0...9,A...Z,a...z, ,[,\,],#. Однако первым символом метки непременно должна быть буква. Некоторые примеры возможных меток:

L abel эти метки

LABEL различны

L ong_Label эти метки указывают

Long_L на одно и то же значение

Пример использования метки в программе:

;сложение 8-разрядного числа с 16-разрядным

ADD A,L ;сложение младших разрядов

LD L,A ;запись результата

JR NC,SKIP ;если в результате не возникло переполнение, то следующая инструкция будет пропущена, и управление передано строке с меткой

SKIP INC Н

_____________________________Счетчик адресов

В процессе трансляции счетчик адресов указывает адрес текущей команды и используется для присвоения значений меткам, операндам и т. п. Значение счетчика адресов обозначается символом $.

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

;сложение 8-разрядного числа с 16-разрядным

ADD A,L

LD L,A

JR NC,$+3 ;инструкция JR занимает два байта,

;a INC H - один, т. о. 2+1=3 байта

inc h

...

_______________________________________________Выражения

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

десятичная константа (38);

шестнадцатиричная константа (#26);

двоичная константа (%10110);

символьная константа ("$");

и операторы:

+ сложение;

— вычитание;

& логическое «И» (AND);

@ логическое «ИЛИ» (OR) ;

! логическое «исключающее-ИЛИ» (XOR);

* алгебраическое умножение;

/ алгебраическое деление;

? функция MOD: A?B=A-(INT(A/B))*B.

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

Примеры выражений (при условии, что метка TWIN имеет значение 2):

%01100101%0100 результат %110110;

#2BFF?#1040 результат #B7F;

1+2*3-4 результат 5;

#12А2+%111?256 результат #А9;

"А"-10+13 результат "D";

TWIN+12 результат 14.

При вычислении значений выражений значащими являются только младшие 16 бит числа (числа от 0 до 65535), например, число 114688 (#1С000) будет интерпретироваться как 49152 (#С000).

Если в результате умножения будет получено число больше 32767, GENS4 выдаст сообщение об ошибке *ERROR* 15 (переполнение). При делении на ноль появится сообщение *ERROR* 14. В остальных случаях переполнение игнорируется.

____________________________________Директивы ассемблера

Работая в GENS4, Вы получаете возможность, кроме стандартных команд микропроцессора Z80, использовать в программах и так называемые директивы ассемблера.

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

ORG <выражение>

Присвоить значение выражения счетчику адресов*.

EQU <выражение>

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

DEFB <выражение>[,<выражение>...]*

Последовательно разместить в памяти 8-разрядные значения выражений,

начиная с адреса, указанного счетчиком адресов.

DEFW <выражение>[,<выражение>...]

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

DEFS <выражение>

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

DEFM "string"

Записать символьную строку siring в память, начиная с адреса, указанного счетчиком адресов.

ENT <выражение>

Установить адрес запуска программы равным значению выражения. Программа будет запускаться по этому адресу командой редактора R.___________________________________________________

*)Если предполагается сохранить созданный объектный код на магнитном носителе средствами GENS4, то директива ORG не должна встречаться в программе более одного раза.

______________________________________Макроопределения

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

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

Если текст макроопределения не помещается в буфер, то выдается сообщение No Macro Space. Изменить размер буфера макроопределений можно с помощью команды редактора С. В дисковой версии размер буфера по умолчанию установлен равным нулю.

Макроопределение задается директивами ассемблера MAC и ENDM, первая из которых указывает на начало макроопределения, вторая — на конец, например:

;сложение 8-разрядного числа с 16-разрядным

ADDNUM MAC

ADD A,L

LD L,A тело

JR NC,$+3 макроопределения

INC H

ENDM

После включения в текст программы этого макроопределения для сложения аккумулятора с регистровой парой HL можно применять макрокоманду ADDNUM.

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

ИМЯ_МАКРООПРЕДЕЛЕНИЯ [параметр1 [....[.параметр 16]]]

В качестве параметров разрешается передавать только числовые значения.

В теле макроопределения параметр вызывается указанием его номера следования в макрокоманде, перед которым ставится знак =. При этом номер задается четырьмя младшими битами кода символа, расположенного сразу за знаком равенства. Например, ссылка на первый параметр может выглядеть как =0, =@ или =Р; на второй — =1, =А или =а. Обратите внимание, что ссылка на шестнадцатый параметр будет выглядеть как =?, =О или =о, а не =16, Правда, из-за ограничения длины строки 80-ю символами использовать все 16 параметров довольно затруднительно._______

*)Аргументы в квадратных скобках являются необязательными.

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

FILL MAC

LD HL,=0

LD DE,=0 + 1

LD BC,=1 - 1

LD (HL),=2

LDIR

ENDM

Это макроопределение вызывается, например, такой макрокомандой:

FILL 16384,22528-16384,%01011010

Учтите, что макроопределения не могут быть вложенными или рекурсивными. Не пытайтесь также в текст макроопределения включать строки с метками — ассемблер размножит эти метки столько раз, сколько раз будет вызвано макроопределение, что приведет к неминуемым ошибкам трансляции.

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

Разрешать или запрещать включение текста макроопределения в листинг ассемблирования можно командами ассемблера *М+ и *М— (см. ниже).