Логическое выражение состоит из логических значений и логических операторов. Логические операторы выглядят так: «~
» для логического отрицания, «&
» для логического И, «|
» для логического ИЛИ. Отрицание имеет высший приоритет. Логическое значение может быть числовым выражением, оно будет считаться ложным в случае равенства нулю, иначе оно будет истинным. Для создания логического значения можно сравнить два числовых выражения, используя один из следующих операторов: «=
» (равно), «<
» (меньше), «>
» (больше), «<=
» (меньше или равно), «>=
» (больше или равно), «<>
» (не равно).
«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
» является истиной, но «eax,16 eqtype eax,1.6
» — ложь.
2.2.2 Повторение блоков инструкций
«times
» повторяет одну инструкцию указанное количество раз. За ней должно следовать числовое выражение, определяющее количество повторений, и инструкция, которую нужно повторять (опционально для того, чтобы отделить число и инструкцию, можно использовать двоеточие). Специальный символ «%
», использующийся внутри инструкции, эквивалентен номеру текущего повтора. Например, «times 5 db %
» определит пять байтов со значениями 1, 2, 3, 4, 5. Поддерживается также рекурсивное использование директивы «times
», например, «times 3 times % db %
» определит шесть байтов со значениями 1, 1, 2, 1, 2, 3.
«repeat
» повторяет целый блок инструкций. За ней должно следовать числовое выражение, определяющее количество повторений. Инструкции для повторения предполагаются на следующих строках, а заканчиваться блок должен директивой «end repeat
», например: