Эти две инструкции будут ассемблированы только если константа «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
» она позволяет остановить повторение при выполнении некоторого особого условия, например:s = x/2
repeat 100
if x/s = s
break
end if
s = (s+x/s)/2
end repeat
«while
end while
». Перед каждым повторением логическое выражение вычисляется и если его значение ложь, ассемблирование продолжается, начиная с первой строки после «end while
». Также в этом случае символ «%
» содержит номер текущего повторения. Директива «break
» может быть использована для остановки этого типа цикла так же, как с директивой «repeat
». Предыдущий пример может быть переписан с использованием «while
» вместо «repeat
» таким образом:s = x/2
while x/s
s
s = (s+x/s)/2
if % = 100
break
end if
end while