GENS4
АССЕМБЛЕР
Из множества ассемблеров и дизассемблеров, существующих для
ZX Spectrum, в Союзе наиболее популярен пакет фирмы Hisoft —
DEVPAC4 (ассемблер GENS4 и отладчик MONS4). Этому способствова-
ли не только несомненные достоинства пакета, но и появление его
версий, работающих с дисководом в среде TR-DOS.
Ассемблер GENS4 отличают следующие положительные свойства:
— относительно небольшой объем занимаемой самим транслятором
памяти — около 1ОК;
— перемещаемость;
— наличие встроенного редактора;
— возможность работы в 51-символьном текстовом режиме;
— наличие макрокоманд и директив условной трансляции;
— возможность подгрузим исходных файлов с кассеты или диска в
процессе трансляции, что позволяет обрабатывать файлы практи-
чески неограниченного размера;
— высокая скорость трансляции;
— возможность записи на диск объектных файлов в процессе трансля-
ции, что позволяет получать программы, занимающие всю доступную
память.
Мы предлагаем Вам описание исходной версии GENS4, а также
версии, адаптированной одним из авторов этой книги для работы с
дисководом в системе TR-DOS. Выяснить, с каким накопителем работает
конкретная модификация GENS4, можно в процессе трансляции. Рас-
сматриваемая версия выводит на экран следующее сообщение:
1990 МО A B-Disk version
Различные варианты GENS4 отличаются также количеством сим-
волов в экранной строке: существуют версии с 51-символьной строкой
и с 32-символьной. Имена этих модификаций для работы с магнитофо-
ном соответственно GENS4-51 и GENS4. Дисковая версия известна
только 51-символьная, чаще всего она встречается с именем GENS4B.
ЗАГРУЗКА GENS4
Ассемблер GENS4 является перемещаемой программой, то есть он
может быть загружен и запущен с произвольного адреса. Как правило,
наиболее удобно располагать GENS4 с адреса около 25000 — в этом случае
Вам предоставляется наибольший объем памяти для текста редактируемой
программы и рабочих таблиц (текстовый файл и таблицы размещаются
непосредственно за GENS4). Максимальный адрес, с которого может быть
загружен GENS4 — около 54000.
Для загрузки GENS4 с ленты выполните один из следующих опера-
торов:
LOAD ""CODE ХХХХХ
LOAD "namef,CODE ХХХХХ
Здесь и ниже ХХХХХ — десятичный адрес, с которого Вы хотите
загрузить GENS4, a name — имя версии.
Для загрузки с диска войдите в TR-DOS (RANDOMIZE USR 15616) и
выполните оператор
LOAD "GENS4B"CODE ХХХХХ
Чтобы предотвратить возможные коллизии с интерпретатором Бейси-
ка, перед загрузкой GENS4 полезно выполнить оператор
CLEAR ХХХХХ-1
Запускается GENS4 оператором RANDOMIZE USR ХХХХХ, который исполь-
зуется также и для перезапуска ассемблера после выхода из него в Бейсик.
Для загрузки и запуска часто применяют программу-загрузчяк на Бей-
сике. Один из ее вариантов приведен в конце описания GENS4.
После запуска GENS4 на экране появляется список команд редактора
и подсказка в виде символа >.
ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ GENS4
Текст рабочей программы на языке ассемблер вводится в GENS4 либо
непосредственно с клавиатуры (команда редактора I), либо подгружается с
магнитного носителя (команда G). Программа состоит из пронумерованных
с произвольным шагом строк, в которые записаны инструкции (команды)
языка, метки, комментарии. Кроме команд процессора Z80, представленных
в стандартной мнемонике (см. «Система команд Z80»), при написании
программ используются специальные инструкции GENS4: директивы ассем-
блера, команды условной трансляции, макрокоманды, команды ассемблера.
Набор, загрузка, редактирование, сохранение и другие операции пад тек-
стом ассемблерной программы осуществляются в строчном редакторе.
Для получения объектного кода* ассемблерный текст необходимо
оттранслировать (проассемблировать) с помощью команды редактора а. Во
время трансляции GENS4 выдает сообщения о найденных ошибках, которые
исправляются затем в строчном редакторе. После создания объектного кода
его можно сохранить на магнитном носителе (команды ассемблера О или А),
а также выполнить, не выходя из GENS4 (команда R).
А теперь обо всем подробно.
Формат строки ассемблера
Строка исходного текста программы для GENS4 имеет следующий формат:
номер метка мнемоника операнды комментарий
35 START LD HLfLABEL ;загрузка регистра
*) На самом деле GENS4 производит не объектный, а непосредственно
исполняемый код.
Номер строки определяет место расположения строки в тексте ассем-
блерной программы и необходим только для работы строчного редактора.
При наборе строки переход к следующему полю формата осуществ-
ляется нажатием клавиш табуляции (Caps Shift/8) или пробела (Space).
Строчный редактор автоматически заменяет пробел на табуляцию. Коммен-
тарии отделяются символом «точка с запятой» (;) и могут располагаться,
начиная с любого поля. Длина строки программы не может превышать 80
символов.
Метки
Метка — это имя, присваиваемое строке текста программы. Она исполь-
зуется для указания адреса передачи управления или для определения констант.
Метка может содержать любое количество символов, но значащими
являются только первые шесть, которые, во избежание конфликтных ситуа-
ций, не должны совпадать с первыми шестью символами других меток. В
качестве меток нельзя использовать зарезервированные слова (см. соответ-
ствующий раздел в конце описания GENS4).
Метка может быть составлена из символов 0...9, A...Z, а...г, , [, , J, #.
Однако первым символом метки непременно должна быть буква. Йекоторые
примеры возможных меток:
Label эти метки
LABEL ^ различны
Long_Label ^ эти метки указывают
LongJ. 4—^ на одно и то же значение
Пример использования метки в программе:
;сложение 8-разрядного числа с 16-разрядным
ADD A,L ; сложение младших разрядов
LD L,A ; запись результата
JR NC,SKiP ; если в результате не
; возникло переполнение,
; то следующая
; инструкция будет пропущена,
; и управление передано
; строке с меткой SKIP
INC Н
SKIP
__Счетчик адресов
В процессе трансляции счетчик адресов указывает адрес текущей
команды и используется для присвоения значений меткам, операндам и т. п.
Значение счетчика адресов обозначается символом $.
С применением счетчика адресов предыдущий пример можно пере-
писать без использования метки:
^сложение 8-разрядного числа с 16-разрядным
ADD A,L
LD L,A
JR NC,$+3 ; инструкция JR занимает два байта,
; a INC H - один, т. о. 2+1=3 байта
INC Н
Выражения
В поле операндов могут записываться как отдельные операнды, так и
выражения, которыми задается последовательность алгебраических и логических
операций над константами, метками, счетчиком адресов. В выражения,
обрабатываемые GENS4, можно включать следующие константы (с примерами):
десятичная константа (38);
шестнадцатеричная константа (#26);
двоичная константа (%10110);
символьная константа ("$").'
и операторы:
+ сложение;
— вычитание;
& логическое «И» (AND);
@ логическое «ИЛИ» (OR) ;
I логическое «исключающее ИЛИ» (XOR);
* алгебраическое умножение;
/ алгебраическое деление;
? функция MOD: A?B=A-(INT(A/B))*B.
В выражениях нельзя использовать скобки, так как они являются
признаком метода адресации. Вычисление значения выражения произво-
дится слева направо — приоритет операторов не соблюдается. При записи
выражений допускается использование пробелов.
Примеры выражений (при условии, что метка TWIN имеет значение 2):
%0110010!%0100 результат %110110;
#2BFF?#t040 результат #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 <1выр&жение>
Присвоить значение выражения счетчику адресов*.
*) Если предполагается сохранить созданный объектный код на магнитном
носителе средствами GENS4, то директива ORG не должна встречаться в
программе более одного раза.
EQU <выражение>
Присвоить значение выражения метке, которой обозначена данная стро-
ка. Выражение не должно содержать не определенных ранее меток, в
противном случае будет выдано сообщение об ошибке * ERROR* 13.
DEFB <»ыраж€жм®>[г<шмраж*шш>.. .]*
Последовательно разместить в памяти 8-разрядные значения выражений,
начиная с адреса, указанного счетчиком адресов.
DEFW <выражение>[,<выражен ие>...]
Последовательно разместить в памяти 16-разрядные значения выражений,
начиная с адреса, указанного счетчиком адресов.
DEFS <выражение>
Зарезервировать область памяти длиной, равной значению выражения, начи-
ная с адреса, указанного счетчиком адресов. Содержимое выделенной области
не определяется.
DEFM "string"
Записать символьную строку string в память, начиная с адреса, указанного
счетчиком адресов.'
ENT <1ыражвнив>
Установить адрес запуска программы равным значению выражения.
Программа будет запускаться по этому адресу командой редактора R.
Макроопределения
Если в Вашей программе одна и та же последовательность инструкций
ассемблера используется несколько раз, то нет необходимости каждый раз
ее переписывать. Достаточно при первом появлении в тексте этой последо-
вательности выделить ее соответствующими директивами и присвоить имя
(метку), а в дальнейшем вместо других включений записывать в поле
мнемоник эту метку. Такая последовательность инструкций называется
макроопределением, метка — макрокомандой„
Во время трансляции текст макроопределения заносится в специально
предназначенный для этого буфер и в последующем вставляется в исходный
текст программы на место строки с макрокомандой.
Если текст макроопределения не помещается в буфер5 то выдается
сообщение No Macro Space. Изменить размер буфера макроопределений
можно с помощью команды редактора С. В дисковой версии размер буфера
по умолчанию установлен равным нулю.
Макроопределение задается директивами ассемблера MAC и ENDM,
первая из которых указывает на начало макроопределения, вторая — на
конец, например:
;оюжение Поразрядного числа с 16-раэрядным
ADDNUM
;оюжение Поразрядного числа с 16-раэрядным
ADDNUM
MAC |
|
ADD |
A,L |
LD |
L,A |
JR |
NC,$+3 |
INC |
H |
ENDM |
|
тело
макроопределения
*) Аргументы в квадратных скобках являются необязательными.
После включения в текст программы этого макроопределения для
сложения аккумулятора с регистровой парой HL можно применять макроко-
манду ADDNUM.
В макроопределение можно включать до 16 параметров, которым
присваивается значение следующих за макрокомандой выражений:
ИМЯ^МАКРООПРЕДЕЛЕНИЯ [параметр! [,...[.параметр! 6]]]
В качестве параметров разрешается передавать только числовые зна-
чения.
В теле макроопределения параметр вызывается указанием его номера
следования в макрокоманде, перед которым ставится знак При этом номер
задается четырьмя младшими битами кода символа, расположенного сразу
за знаком равенства. Например, ссылка на первый параметр может выгля-
деть как -0, или -Р; на второй — -I, или =а. Обратите внимание, что
ссылка на шестнадцатый параметр будет выглядеть как ~G или sso, а не
я1в. Правда, из-за ограничения длины строки 80-ю символами использовать
все 16 параметров довольно затруднительно.
В следующем примере задано макроопределение, заполняющее об-
ласть памяти некоторым значением и имеющее три параметра: адрес начала
области, длину и значение байта-заполнителя:
FILL MAC
LD HL,=0
LD DE,=0 + 1
LD BCf=s? - 1
LD (HL),=2
LDIR
ENDM
Это макроопределение вызывается, например, такой макрокомандой:
FILL 16384,22528-16384,%01011010
Учтите, что макроопределения не могут быть вложенными или рекур-
сивными. Не пытайтесь также в текст макроопределения включать строки с
метками — ассемблер размножит эти метки столько раз, сколько раз будет
вызвано макроопределение, что приведет к неминуемым ошибкам трансля-
ции.
Если для Вас более значимым является минимизация объема програм-
мы, а не удобства» предоставляемые макроопределениями, то вместо них
лучше пользоваться подпрограммами. Однако обратите внимание, что ис-
пользование макроопределений может несколько увеличить скорость работы
программы.
Разрешать или запрещать включение текста макроопределения в
листинг ассемблирования можно командами ассемблера *М+ и *М— (см.
ниже).
Команды условной трансляции
Иногда бывает необходимо, в зависимости от выполнения тех или
иных условий, получать различные варианты объектного кода программы.
Работая в GBNS4. Вы сможете добиться этого, используя команды условной
трансляции IF, ELSE и ШО . С их помощью можно устанавливать или
сбрасывать флаг разрешения трансляции, чем соответственно разрешать или
запрещать ассемблирование фрагментов текста программы.
IF <выражение>
Сбросить флаг разрешения трансляции при нулевом значении выражения
— следующие за командой строки программы не ассемблировать*. Если
значение выражения отлично от нуля, то ассемблирование продолжить
нормально.
ELSE
Инвертировать флаг разрешения трансляции. Если перед появлением ELSE
ассемблирование было разрешено, то запретить его, и наоборот.
END
Установить флаг разрешения трансляции. После этой команды ранее
прерванное ассемблирование продолжается нормально.
Вложенность команд условной трансляции не допускается.
Обратите внимание, что флаг разрешения трансляции по заверше-
нию первого прохода ассемблирования не восстанавливается, и если в конце
программы он был сброшен, то на втором проходе могут возникнуть самые
удивительные эффекты. Поэтому пользоваться условной трансляцией необ-
ходимо с вниманием (полезно, например, завершать программу командой
END).
Комаадр»! ассемблера
В исходный текст программы можно вставить так называемые коман-
ды ассемблера, которые в ходе трансляции будут управлять выводом листинга
ассемблирования.
Команды ассемблера записываются в поле метки и не должны содер-
жать разделителей (табуляций). В командах *Н и *F операнд необходимо
отделить пробелом.
*Е
Вставить в листинг три пустые строки. Полезно использовать для разде-
ления программных модулей.
*Н string
Напечатать заголовок. В листинг включается строка string. Она будет
выводиться также после каждого выполнения команды .
♦S
Приостановить выдачу листинга ассемблирования. Продолжить трансля-
цию можно, нажав любую клавишу.
*L+
Разрешить выдачу листинга.
*L-
Запретить выдачу листинга.
*D+
Выводить значение счетчика адресов » десятичном виде.
+D—
Выводить значение счетчика адресов в шестнадцатеричном гиде.
*) Обратите внимание, что проверка синтаксиса программы осуществляет-
ся и при запрещенной трансляции.
Выводить сокращенный листинг ассемблирования. Строки сокращенного
листинга не содержат объектного кода. Таким образомг они укорачива-
ются на 9 символов, что делает листинг более удобным для чтения.
Команда используется преимущественно в 32-символьной версии
GENS4.
Выводить полный листинг ассемблирования.
Разрешить распечатку текста макроопределений.
Запретить распечатку текста макроопределений,
♦f ffiename
Включить в процесс трансляции фрагмент программы, записанный на ленте
или диске. Из файла с указанным именем считываются и ассемблируются
блоки текста. Использование команды ♦F позволяет значительно сократить
объем текстового файла, находящегося в памяти, и, следовательно, дает
возможность создавать объектный код, занимающий почти всю доступ-
ную память. При работе с магнитофоном файл необходимо предваритель-
но записать на ленту с помощью команды редактора Т.
СТРОЧНЫЙ РЕДАКТОР
Встроенный в GENS4 строчный редактор позволяет вводить и редакти-
ровать текст программы на языке ассемблера. Управление редактором осуще-
ствляется с помощью команд редактора, которые вводятся на подсказку > и
имеют следующий формат:
C[N1].[N2].[S1],[S2]
где С — собственно команда;
N1, N2 -— числа в пределах от 1 до 65535 включительно;
SI, S2 — строки, состоящие не более чем из 20 символов.
Команды редактора, могут вводиться как в верхнем, так и в нижнем
регистрах клавиатуры. Если в числовом параметре будет встречен нечисло-
вой символ, не являющийся разделителем, то текст командной строки,
начиная с этого места и до конца строки, будет проигнорирован.
Редактор запоминает введенные параметры и может затем использо-
. вать их для некоторых команд в качестве значений, устанавливаемых по
умолчанию.
Если введена некорректная командная строка, например:
РР1,20000, G.WINDOWS
то команда выполнена не будет, а редактор сделает Вам замечание: Pardon?.
Исправьте ошибку и введите команду правильно:
Pi,20000, G.WINDOWS
КОМАНДЫ РЕДАКТОРА
Команды редактора вводятся нажатием клавиши с соответствующей ла-
тинской буквой, которая в названии команды выделена полужирным шрифтом.
Вставь строк
insert [N][,M]*
Автоматически генерировать строки, начиная со строки N и шагом М.
После ввода команды Бы можете производить последовательный набор
текста программы. Отказаться от генерации строк можно, нажав клавишу
Edit (Caps Shift/i). Если в процессе ввода программы номер строки
превысит 32767, то генерация строк прекратится.
Строку также можно вставить в программу, введя на подсказку > ее номер
^ и через пробел — тексг.
Вывод листинга программы
List [N][,M]
Вывести на экран листинг программы со строки N по строку М включи-
тельно. По умолчанию N равно 1, М — 32767. Листинг выводится по
страницам. Переход к следующей странице происходит по нажатию
любой клавиши, кроме Edit, нажатие которой прервет выдачу листинга
и вернет управление редактору.
Konfigure list М
Установить количество строк в странице листинга.
Write text [N][,M]
Распечатать на принтере текст программы со строки N по М включительно.
Если N и М не указаны, то будет распечатана вся программа.
Рецактироаание текста ассемблерной программы
reNumber [N][,M]
Перенумеровать строки программы, начиная с первой строки, которой
присваивается номер N, с шагом М. Если в результате выполнения
команды номер какой-либо строки может превысить 32767, то команда
не выполняется.
Delete N,M
Удалить строки от N до М включительно. Если М меньше N, или определено,
менее двух аргументов, то команда игнорируется.
Отдельная строка может быть удалена просто введением ее номера.
Move [N][,M]
Копировать строку с номером N в строку с номером М. Если строки с
номером N не существует, то команда игнорируется. Если строка с номером
М существует, ее содержимое заменяется содержимым строки N.
Аккуратно используйте эту команду — старайтесь не вызывать ее без
аргументов.
Find [N][,M][,Fs][,Ss]
Найти стринг (строку текста) Ps в программе, начиная со строки N и до
строки М. Если такая строка найдена, то она отображается на экране и
GENS4 переходит в режим редактирования строки, причем курсор уста-
*) Аргументы в квадратных скобках являются необязательными, при их
пропуске, как правило, используется значение параметра по умолчанию.
навлнвается на начало найденного стринга. В режиме редактирования
можно заменить стринг Fs на стринг Ss (см. команду редактора Е).
Edit N
Редактировать строку с номером N. Вызванная на редакцию строка
копируется в буфер и отображается на экране вместе с номером. Редак-
тирование происходит в буфере, поэтому исходная строка не изменяется
и в любой момент может быть восстановлена. При отсутствии строки с
номером N команда игнорируется. Редактирование осуществляется с
помощью следующих подкоманд (клавиш):
SPACE — переместить курсор на одну позицию вправо;
CAPS SHIFT/I — переместить курсор на одну позицию влево;
CAPS SHIFT/8 - переместить курсор на следующую позицию табуляции;
List - отобразить на экране текущее состояние строки;
Kill — удалить символ в указанной курсором позиции;
Zap — удалить все символы, начиная с указанного курсором и до конца строки;
Find — найти следующее появление в тексте программы стринга, ранее
определенного командой редактора F;
Swap — заменить найденный стринг Fs на стринг Ss, ранее определенный
командой редактора F, и искать следующее появление стринга Fs;
Insert - перейти в режим «вставка». Выход из режима осуществляется
нажатием Enter:
eXpand — переместить курсор в конец строки и включить режим «вставка»;
Change — перейти в режим «замена». Выход из режима осуществляется
нажатием Enter:
Quit - прервать редактирование строки: вызванную на редактирование стро-
ку записать в программу в исходном виде, все изменения игнорировать;
Reload - перезагрузить буфер редактирования: вызванную на редактиро-
вание строку перезаписать в буфер в исходном виде, все измене-
ния игнорировать;
ENTER — завершить редактирование строки: поместить отредактирован-
ную строку из буфера в текст программы.
Работа с дисководом и магнитофоном
Текст программы и объектный код можно сохранить как на магнитной
ленте, так и на дискете, Тип накопителя задается форматом имени файла.
При работе с дисководом вторым символом в имени должен стоять знак дво-
еточия (:). Если знак двоеточия отсутствует в имени файла, то в качестве
носителя будет использоваться магнитная лента. Формат имени файла для
дисковых устройств:
где X — номер устройства (1...4, что соответствует дисководам "A"..."D").
Напомним, что имена файлов для магнитофона должны содержать не
более 10 символов, для дисковода — не более 8.
Get text [„3]
Загрузить с магнитного носителя программу из файла с именем S. Если
стринг S пустой, с магнитофона будет счнтываться первый встреченный
файл. Если в памяти уже находится программа, то загружаемый файл будет
присоединен к ней. Строки полученной программы будут перенумерова-
ны, начиная с номера 1 и с шагом 1.
Put text [N][,M][,S]
Записать на магнитный носитель программу со строки N до М включитель-
но в файл с именем, заданным стрингом S. По умолчанию используются
аргументы, установленные предыдущей командой.
Примеры.
Записать строки с номерами от 20 до 400 включительно на магнито-
фон в файл с именем MAINPROG:
P20,400,MAINPRGG
Записать всю программу на дисковод "В" в файл с именем MIRACLE:
PI,32767,2:MIRACLE
Если при записи на диск файл с указанным именем уже существует, то
(в зависимости от версии GENS4) будет выведен запрос:
Overwrite (Y/N)? (Переписать (Да/Нет)?)
или
File exists Delete (Y/N)? (Файл найден Удалить (Да/Нет)?)
Для удаления существующего файла и записи нового нажмите Y; для
отмены операции — любую другую клавишу.
Таре for include [N][,M][,S]
Записать программу в специальном формате* Записать на магнитную ленту в
файл с именем S фрагмент программы со строки N по М в специальном
формате для последующего включения в процесс трансляции по команде
ассемблера *F. Файл разбивается на блоки, длина которых равна размеру
входного буфера (см. команду редактора С).
Object save [,,S]
Записать на магнитный носитель объектный код в файл с именем S
(записывается код, созданный после последней директивы ORG). Если
объектный код не создан, команда будет проигнорирована.