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



», использующийся внутри инструкции, эквивалентен номеру текущего повтора. Например, «>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

Блоки, определенные с использованием «>if», «>repeat» и «>while» могут быть вложены в любом порядке, однако и закрыты в обратном. Директива «break» всегда останавливает обработку бока, который был начат последним либо директивой «>repeat», либо «>while».

2.2.3 Адресные пространства

«>org» устанавливает адрес, по которому следующий за ней код должен появиться в памяти. За ней должно следовать числовое выражение, указывающее адрес. Эта директива начинает новое адресное пространство, следующий код сам по себе никуда не двигается, но все метки, определенные в нем и значение символа «>$» изменяются как если бы он был бы помещен по этому адресу. Тем не менее обязанность поместить во время выполнения код по правильному адресу лежит на программисте.