« 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
», например:
repeat 8
mov byte [bx],%
inc bx
end repeat
Сгенерированный код сохраняет байты со значениями от одного до восьми в памяти, адресованной регистром BX.
Количество повторений может быть равным нулю, и в таком случае инструкции не будут ассемболироваться вовсе.
« break
» позволяет остановить повторение раньше и продолжить ассемблирование с первой строки после « end repeat
». В сочетании с директивой « if
» она позволяет остановить повторение при выполнении некоторого особого условия, например:
Читать дальше