Блоки, определенные с использованием «if
repeat
» и «while
» могут быть вложены в любом порядке, однако и закрыты в обратном. Директива «break» всегда останавливает обработку бока, который был начат последним либо директивой «repeat
», либо «while
».2.2.3 Адресные пространства
«org
$
» изменяются как если бы он был бы помещен по этому адресу. Тем не менее обязанность поместить во время выполнения код по правильному адресу лежит на программисте.«load
from
» и числовое выражение, определяющее валидный адрес в текущем адресном пространстве. Оператор размера здесь имеет необычное значение — он определяет, сколько байтов (до 8) должно быть загружено из двоичного значения константы. Если оператор размера не определен, загружается один байт (таким образом значение оказывается в пределах от 0 до 255). Загруженные данные не могут превосходить текущее смещение.«store
at
» и числовое выражение, указывающее валидный адрес в текущем адресном пространстве кода. По этому адресу будет сохранено задаваемое значение. Это директива для продвинутого применения и её следует использовать осторожно.Обе директивы «load
store
» ограничены оперированием только в пределах текущего адресного пространства. Символ «$$
» всегда равен базовому адресу в текущем адресном пространстве, а символ «$
» — это адрес текущей позиции в нём, то есть эти два значения определяют границы действия директив «load
» и «store
».Сочетая директивы «load
store
» можно делать вещи, такие как шифрование некоторого из уже сгенерированного кода. Например, для шифрования всего кода, сгенерированного в текущем адресном пространстве вы можете использовать такой блок директив:repeat $-$$
load a byte from $$+%-1
store byte a xor c at $$+%-1
end repeat
и каждый байт коза будет проксорен со значением, определенным константой «c
«virtual
at
» и числовое выражение, определяющее адрес виртуальных данных, иначе будет использован текущий адрес, что равносильно директиве «virtual at $
». Инструкции определяемых данных должны быть расположены на следующих строках и заканчиваться директивой «end virtual
». Блок виртуальных инструкций сам по себе независимое адресное пространство, и после того, как оно заканчивается, восстанавливается контекст предыдущего адресного пространства.Директива «virtual
GDTR dp?
virtual at GDTR
GDT_limit dw?
GDT_address dd?
end virtual
Здесь определяются две части 48-битной переменной по адресу «GDTR
Директива также может быть использована для определения меток некоторых структур, адресованных регистром, например:
virtual at bx
LDT_limit dw?
LDT_address dd?
end virtual
С таким определением инструкция «mov ax,[LDT_limit]
mov ax,[bx]
».Также может быть полезно объявление инструкций и значений данных внутри виртуально блока, так как директиву «load
virtual at 0
xor eax,eax
and edx,eax
load zeroq dword from 0
end virtual
Этот кусок кода определяет константу «zeroq