Flat Assembler 1.64. Мануал программера - страница 6

стр.

» со следующим за ней логическим выражением, определяющим дополнительное условие, начинает следующий блок инструкций, который ассемблируется, если предыдущие условия не выполняются, а данное дополнительное условие выполняется. Опциональная директива «>else» начинает блок инструкций, которые ассемблируются, если не выполняется ни одно из условий. «>end if» заканчивает последний блок инструкций.

Вы должны помнить, что директива «>if» обрабатывается на стадии ассемблирования и поэтому не влияет на директивы препроцессора, такие как определения символьных констант и макроинструкции — когда ассемблер распознает директиву «>if», весь препроцессинг уже закончен.

Логическое выражение состоит из логических значений и логических операторов. Логические операторы выглядят так: «>~» для логического отрицания, «>&» для логического И, «>|» для логического ИЛИ. Отрицание имеет высший приоритет. Логическое значение может быть числовым выражением, оно будет считаться ложным в случае равенства нулю, иначе оно будет истинным. Для создания логического значения можно сравнить два числовых выражения, используя один из следующих операторов: «>=» (равно), «><» (меньше), «>>» (больше), «><=» (меньше или равно), «>>=» (больше или равно), «><>» (не равно).

«>used» со следующим за ним символом имени, это логическое значение, которое проверяет, использовался ли где-нибудь данный символ (он возвращает правильный результат даже если символ используется только после этой проверки). За оператором «>defined» может следовать любое выражение, обычно это только одно символьное имя; этот оператор проверяет, содержит ли данное выражение исключительно символы, определенные в коде, и доступные из текущей позиции.

Следующий простой пример использует константу «>count» которая должна быть определена где-то в коде:

>if count>0

> mov cx,count

> rep movsb

>end if

Эти две инструкции будут ассемблированы только если константа «>count» больше нуля. Следующий пример показывает более комплексную условную структуру:

>if count & ~ count mod 4

> mov cx,count/4

> rep movsd

>else if count>4

> mov cx,count/4

> rep movsd

> mov cx,count mod 4

> rep movsb

>else

> mov cx,count

> rep movsb

>end if

Первый блок инструкций ассеблируется, если константа «count» не равна нулю и кратна четырем, если это условие не выполняется, оценивается второе логическое условие, следующее за «>else if», и если оно верно, ассемблируется второй блок инструкций, иначе ассемблируется последний блок, который следует за строкой, содержащей только «>else».

Также есть операторы, которые позволяют сравнивать значения, которые представляют собой последовательности символов. «>eq» проверяет такие значения на тождественность. Оператор «>in» проверяет, принадлежит ли данное значение к списку значений, следующему за оператором. Список должен быть заключен между символами «><» и «>>», а его члены должны быть разделены запятыми. Символы считаются одинаковыми, если они имеют одно и то же значение для ассемблера — например, «>pword» и «>fword» для ассемблера одинаковы поэтому не различаются вышеуказанными операторами. Так же «>16 eq 10h» является истиной, однако «>16 eq 10+4» нет.

Оператор «>eqtype» имеют ли сравниваемые значения одинаковую структуру, и принадлежат ли структурные элементы одному типу. Различаемые типы включают в себя числовые выражения, строки, заключенные в кавычки, значения с плавающей точкой, адресные выражения (выражения в квадратных скобках или предваренные оператором «>ptr»), мнемоники инструкций, регистры, операторы размера, операторы перехода и операторы типа кода. И каждый из специальных символов, действующих как разделители, такой как запятая или двоеточие, это отдельный тип сам по себе. Например, два значения, каждое из которых состоит из имени регистра и числового выражения, разделенных запятой, будут распознаны как один тип, независимо от вида регистра и сложности числового выражения; за исключением строк, заключенных в кавычки и значений с плавающей точкой, которые относятся к специальным видом числовых выражений и распознаются как разные типы. Поэтому условие «>eax,16 eqtype fs,3+7