13. Переменные-флаги Система представляет в распоряжение пользователя три предопределенные переменные-флага:
ZF - флаг ноля;
NF - флаг отрицательного значения;
CF - флаг переноса.
Можно сказать, что эти переменные описаны неявным образом как REG ZF[1],NF[1],CF[1]. Операции языка MCL могут изменить значение каждого из флагов. Рассмотрим назначение каждого флага более подробно.
Флаг ноля: ZF.
Если результат операции равен нолю, то этот флаг устанавливается в 1, в противном случае - 0. Все без исключения операции изменяют значение этого флага.
Флаг отрицательного значения: NF.
Если старший (знаковый) бит результата операции равен единице, то этот флаг устанавливается в 1, в противном случае - в 0. При определении значения этого флага учитывается длина операндов выполняемой операции. Все без исключения операции изменяют значение этого флага.
Флаг переноса: CF.
Этот флаг устанавливается в 1, если при выполнении операции сложения или вычитания возникает перенос из старшего разряда результата. В противном случае этот флаг устанавливается в 0. При определении значения этого флага учитывается длина операндов выполняемой операции. Логические операции (<, >, =, <>, >=, <=, AND, OR, XOR, NOT) безусловно устанавливают этот флаг в 0. Операции сдвига помещают в этот флаг значение последнего "выдвигаемого" разряда. Замечание:
следует четко понимать, что значение флагов изменяют именно операции, а оператор присваивания никакого влияния на флаги не оказывает. Т.e при выполнении оператора RA:=RB; значения флагов изменены не будут (поскольку не выполнялась ни одна операция), а при выполнении оператора M[I+1]:=0; значения флагов могут быть изменены, так как при вычислении индекса выполняется операция +.
14. Общие замечания При написании программ на языке MCL рекомендуется следующая структура построения программы: {Описание переменных} VAR ... REG ... MEM ... STRUCT ...
{Тело главной программы} ...
END {Конец главной программы}
SUB1: {Подпрограмма 1} ...
RETURN { Конец подпрограммы 1}
... {Определение других подпрограмм}
SUBN: {Подпрограмма N} ...
RETURN {Конец подпрограммы N} То есть, сначала описываются все переменные. После описания переменных располагаются операторы основной программы, которые завершаются оператором END. А затем идут операторы используемых подпрограмм. Безусловно, такая структура построения программ не является догмой, но она является наиболее простой для восприятия, и способствует большей ясности программы.
15. Сообщения об ошибках интерпретатора языка MCL В случае обнаружения шибки, интерпретация программы прекращается и выдается сообщение вида: ! ERROR ! в строке номер: <номер строки программы в которой обнаружена ошибка>
<строка программы в которой обнаружена ошибка>
<сообщение об ошибке> Ниже приведен полный список сообщений об ошибках, распознаваемых интерпретатором языка MCL. При необходимости даются дополнительные пояснения.
Синтаксическая ошибка - неизвестный символ.
При интерпретации программы встретился неизвестный интерпретатору символ.
Слишком длинное имя.
Превышена максимальная длина идентификатора (16 символов).
Слишком длинное число.
Превышена максимальная длина числа (32 символа).
Нет закрывающей кавычки в строке.
В строке вывода оператора WRITE(LN) не найдена закрывающая кавычка. Строка вывода не может содержать символ перевода каретки.
Не найден конец комментария.
Не найден символ '}', ограничивающий комментарий.
Слишком много меток.
В программе используется слишком много меток. Максимальное число меток, которое может быть использовано в программе - 100.
Повторное определение меток.
В программе используются метки с одинаковыми именами. Все метки должны иметь уникальные имена.
Неопределенная метка.
В программе используется ссылка на неопределенную метку.
Слишком много вложенных циклов.
В программе используется слишком глубокое вложение циклов. Максимальный уровень вложенности циклов - 16.
Слишком много вложенных вызовов ПП.
В программе используется слишком глубокое вложение вызовов подпрограмм. Максимальный уровень вложенности вызовов подпрограмм - 16.
Команда NEXT без команды FOR.
Команда RETURN без команды GOSUB.
Слишком много переменных.
В программе используется слишком много переменных. Максимальное число переменных в программе - 100.
Повторное определение переменной.
Попытка описать переменную, имя которой совпадает с именем уже описанной переменной. Все переменные должны иметь уникальные имена.
Неопределенная переменная.
В программе используются обращения к неописанным переменным.
Неверный размер памяти.
Про описании переменной типа "память" используется слишком большое значение числа ячеек. Максимально допустимое значение числа ячеек - 1024.
Неверная разрядность регистра.
При описании переменной типа регистр, структура или память используется слишком большое значение разрядности регистра. Максимально допустимое значение разрядности регистра - 32.
Неверный размер полей структуры.
При описании переменной типа структура суммарный размер полей структуры больше размера самой переменной.
Слишком большой индекс.
При обращении к переменной типа "память" значение индекса ячейки памяти превышает количество ячеек указанное при описании переменной.
Неверное использование индекса или имени поля.
Попытка использовать индекс или имя поля при обращении к простой переменной или регистру.
Неопределенное имя поля.
При обращении к переменной типа структура используется неопределенное имя поля.
Диапазон превышает размеры переменной.
При обращении к диапазону переменной указанный размер диапазона превышает размер переменной.
Некорректное выражение.
Слишком сложное выражение.
Слишком много операндов в выражении.
Непарная скобка.
Неверный тип управляющей переменной цикла.
Управляющая переменная цикла не может быть переменной типа "память". Неверный спецификатор формата.
Допустимы значения B,D,H. Неверная длина поля в спецификаторе формата.
Допустимы значения 1..32.
Требуется "THEN".
Требуется имя переменной памяти.
Требуется имя простой переменной (типа VAR,REG или STRUCT).
Требуется ".." или "," или "]".
Требуется "..".
Требуется ":=".
Требуется "TO".
Требуется "," или ";".
Требуется "[".
Требуется "]".
Требуются идентификатор или команда.
Требуется ":" или ":=".
Требуется ";".
Требуется идентификатор.
Требуется константа.
Требуется индекс.
|