5.КОМАНДЫ, УПРАВЛЯЮЩИЕ ЛИСТИНГОМ ТРАНСЛЯЦИИ.
Эти команды находятся в поле метки, не имеют аргументов и всегда начинаются со знака *. Они работают на
втором проходе ассемблирования, изменяя формат вывода листинга на экран или принтер, запрещая и снова разрешая
вывод, реализуя паузу в нужном программисту месте,все это - прямо по ходу трансляции.
*L+ - включает листинг.
*L- - подавляет листинг.
*IF+ - разрешает выдачу строк блоков условной трансляции даже, если трансляция была выключена одной из
директив условной трансляции.
*IF- - исключает из листинга строки блоков условной трансляции, если трансляция была выключена.
i
*А+ - включает в формат вывода строки листинга адрес соответствующей этой строке команды Z80 или бло-
ка данных ( текущее значение программного счетчика ).
*А- - исключает из формата вывода строки текущее значение программного счетчика.
*С+ - включает в формат вывода строки поле данных (код оттранслированной команды Z80 или блок дан-
ных). Длина этого поля может.быть изменена директивой управления листингом (.CODE выражение) по
ходу трансляции и ключом /сос1ечисло на все время трансляции.
*С- - исключает из формата вывода строки поле данных.
*N+ - включает в формат вывода строки ее номер во входном текстовом файле.
*N- - исключает номер из формата вывода строки.
л '
*Т+ - включает в формат вывода строки текст из входного файла.
*Т- - исключает текст из формата вывода строки.
*Н+ - приводит к установке 16-ричного формата вывода адреса инструкций или блоков данных в листинге.
*D- - то же самое. Команда введена для совместимости с GENS4.
*D+ - приводит к установке 10-ричного формата вывода адреса инструкции или блока данных.
*0+ - приводит к установке 8-ричного формата вывода адреса инструкции или блока данных.
*S - при встрече этой команды транслятор переходит в режим ожидания нажатия любой клавиши, давая
возможность лучше рассмотреть листинг. SS А приводит к прекращению трансляции.
Работает только при включенном листинге. Во избежание лишних остановок при выводе на принтер,
для отмены действия этих команд пользуйтесь ключом /-stop.
6.СООБЩЕНИЯ ОБ ОШИБКАХ ТРАНСЛЯЦИИ И РЕАКЦИЯ АССЕМБЛЕРА НА НИХ.
6.1.Ошибки, связанные с невозможностью начать трансляцию.
При возникновении таких ошибок происходит выход в IS'DOS с кодом соответствующей ошибки.
23 - Использован неизвестный ключ в командной строке.
31 - Имя входного файла не введено или имя в командной строке содержит недопустимые символы или символы маски.
51 - Файл ассемблера as.com испорчен.
130 - Не хватает рабочей области памяти для загрузки и работы.
131 - Не инсталлирован драйвер принтера в режиме вывода листинга на принтер.
6.2.Ошибки, возникающие во время трансляции.
Таблица 3 представляет все ошибки трансляции, номера которых выдаются в листинг вместе со всеми его обычными
полями. Показано, ошибки с какими номерами возникают на первом, а какие на втором проходе ассемблирования, и в
каком поле ассемблерной строки возможно ее появление на данном проходе.
Ошибки с номерами 10,14,15,50,51 принято считать несерьезными. Возникновение таких ошибок на первом проходе
трансляции не приводит к запрещению генерации объектного файла, чего нельзя сказать об остальных ошибках
трансляции первого прохода.
Далее последует подробное описание ошибок трансляции.
6.2.1.Ошибки со смыслом, близким к ошибкам трансляции в GENS4.
Error* 2 - мнемоника не распознана.
Error* 4 - метка или константа определена больше одного раза.
Error* 5 - встретился недопустимый знак ASCII в выражении.
Error* 7 - встретился недопустимый знак языка в поле метки или операции.
Error* 9 - недопустимое использование регистров Z80.
Error* 10 - численное значение выражения выходит за рамки допустимого для данной команды или директивы.
Транслятор полагает выражение равным числу 0 и продолжает трансляцию строки.
Error* 13 - ссылка из директивы EQU на не определенный вообще, за все время трансляции символ (в том числе и
на внешний).
Эта ошибка возникает не в строке, где стоит EQU, а лишь на втором проходе, при трансляции
строк команд Z80 или директив DEFW и DEFB, содержащих символы, определенные через такие EQU.
Error* 14 - деление на ноль.В этом случае деление действует как обратная знаковая функция и результатом будет
+1 для отрицательного делимого и -1 для положительного и нулевого.
Error* 15 - переполнение операции умножения.
Транслятор отбрасывает старшую, не поместившуюся в два байта, часть числа и продолжает вычис-
ление. При этом возможна не предусмотренная смена знака, и программист должен сам принимать ре-
шение о ее допустимости. Например, после следующего определения символа BUFF1:
BUFFI EQU #2700*6 недопустимо его использование как некой положительной длины буфера в вы-
ражении типа BUFF2 EQU BUFFI/2, t.k.BUFFI будет интерпретирован транслятором как отрицательная
величина,#А200= -#5Е00, в результате чего BUFF2 получит значение #D100=-#2F00, что никак не рав-
но #2700*3=#5100.
С другой стороны, выражение BUFF1 может использоваться в смысле положительной величины, если с
ним не производится операций деления или умножения,например:
BUFF1-1 ,будет верно как для положительной, так и для отрицательной интерпретации BUFFI , а
для случая: -1*BUFF1 верна лишь отрицательная интерпретация данного значения BUFF1(#2700*6);
6.2.2.Синтаксические ошибки, новые для GENS4 стандарта.
Error* 20 - метка начинается с цифры.
Error* 21 - неверное использование знака ":".
Error* 22 - использование русских букв как допустимых знаков языка запрещено.(Это не касается случаев их ис-
пользования в аргументе DEFM и в выражениях в конструкции с кавычками).
Error* 23 - такая команда управления листингом отсутствует в ассемблере.
Error* 24 - идентификатор с такой мнемоникой в поле операции недопустим. (Этот идентификатор зарезервирован
под регистр Z80 или команду управления листингом).
Error* 25 - встретился нецифровой знак в числе.
Error* 26 - ошибка в выражении, в конструкции "*" или "**", где * - любой допустимый знак ASCII или аль-
терн.кодировки ГОСТа (не допустимая длина такой конструкции).
Error* 27 - данный оператор возведения в степень в выражении - недопустим.
Error* 28 - непонятная запятая в поле операнда.
Error* 29 - отсутствует поле операнда, хотя мнемоника поля операции требует его наличия.
Error* 30 - присутствует поле операнда, хотя и мнемоника поля операции не предполагает его наличия.
Error* 31 - аргументы в поле операнда, не подходят мнемонике поля операции, а также в случае расположения ре-
гистра в аргументе команды Z80 не на первом месте, например:
SET 7,(shift+IX)
вместо стандартного
SET 7,(IX+shift)
Error* 32 - превышение допустимого числа аргументов (52) в директиве.
Error* 33 - отсутствует или не правильно построено выражение (не соблюдена инфиксная скобочная форма записи).
6.2.3.Новые ошибки, связанные с вычислением выражений.
В случае ошибок, начинающихся с номера 40, транслятор прекращает вычисление выражения которое теперь ос-
тается не определенным, равным произвольному числу, и переходит к новой строке. Результат трансляции в этом
случае видно в строке листинга в поле данных(кодов Z80), независимо от текущего режима выдачи листинга.
*Еггог* 40 - переполнение буфера калькулятора. Возникает только, если выражение будет содержать > 256/4 опера-
торов.
*Еггог* 41 - переполнение буфера EQU ссылок. Возникает только, если число не вычисленных за первый проход
констант определенных через EQU в какой-либо цепочке ссылок достигнет числа > 55.
*Еггог* 42 - вычисленное значение выражения не является абсолютным числом, что не допустимо для данной дирек-
тивы.
*Еггог* 43 - недопустимый аргумент оператора 2".
*Еггог* 44 - переполнение буфера числа, при считывании его из выражения. Транслятор прекращает вычисление вы-
ражения которое теперь остается не определенным, равным произвольному числу.
*Еггог* 45 - запрещенная ссылка из директивы EQU на определяемый ей же символ.
Такая ссылка разрешена, если она случается в строке ,где и находится этот самый символ, нап-
ример:
SYMB EQU SYMB+1 "
В этом случае символ SYMB сначала определяется как метка, и затем ее относительный адрес исполь-
зуется для ее же переопределения с помощью директивы EQU (как происходит и в GENS4).
Но в случае:
FULL EQU EMPTY+200
• • •
EMPTY EQU FULL-300 ,
в строке с командой Z80 или директивами DEFB,DEFW, где используется определение EMPTY или FULL,
возникнет сообщение об ошибке 45, что предупредит возникновение неоднозначности определения сим-
волов.
В случае ошибок, начинающихся с номера 50, транслятор продолжает вычислять выражение, округляя переполнив-
шееся значение или полагая неопределенное равным 0. В некоторых случаях сообщения об ошибках этого разряда
можно рассматривать как "ВНИМАНИЕ!",если требуется выполнить определенные арифметические действия, например,
умножение чисел без знака диапазона до 65536, вычислить знак терма с помощью деления на ноль или в случае,
когда определенная метка в Вашей программе временно не используется.
Из ошибок в стандарте GENS4 к этому разряду относятся: 10, 14, 15.