Flat Assembler 1.64. Мануал программера - страница 4
Метка может быть обработана как константа со значением, равным смещению помеченного кода или данных. Например, если вы определяете данные, используя помеченную директиву «>char db 224
», для того, чтобы поместить адрес начала этих данных в регистр BX, вам нужно использовать инструкцию «>mov bx,char
», а для того, чтобы поместить в регистр DL значение байта, на который ссылается «>char
», нужно использовать «>mov dl,[char]
» (или «>mov dl,ptr char
»). Если вы попытаетесь ассемблировать «>mov ax,[char]
», FASM выдаст ошибку, так как он сравнивает размеры операндов, которые должны быть равны. Вы можете принудительно проассемблировать эту инструкцию, изменяя размер операнда: «>mov ax, word [char]
», но помните, что эта инструкция прочитает два байта, начинающихся с адреса «>char
», тогда как он был определен как один байт.
Последний и самый гибкий способ задания меток — это использование директивы «>label
». За этой директивой должно следовать имя метки, далее, опционально, размер оператора (может предваряться двоеточием), и далее, также опционально, оператор «>at
» и числовое выражение, определяющее адрес, на который данная метка должна ссылаться. Например, «>label wchar word at char
» определяет новую метку для 16-битных данных по адресу «>char
». Теперь инструкция «>mov ax,[wchar]
» после компиляции будет выглядеть так же, как «>mov ax,word [char]
». Если адрес не указан, директива «>label
» будет ссылаться на текущий адрес. Таким образом, «>mov [wchar],57568
» скопирует два байта, тогда как «>mov [char],224
» скопирует один байт на тот же адрес.
Метка, имя которой начинается с точки, обрабатывается как локальная, и её имя прикрепляется к имени последней глобальной метки (с названием, начинающемся с чего угодно, кроме точки) для создания полного имени этой метки. Так, вы можете использовать короткое имя (начинающееся с точки) где угодно перед следующей глобальной меткой, а в других местах вам придется пользоваться полным именем. Метки, начинающиеся с двух точек — исключения. Они имеют свойства глобальных, но не создают новый префикс для локальных меток.
«>@@
» обозначает анонимную метку, вы можете определить её множество раз. Символ «>@b
» (или эквивалент «>@r
») ссылается на ближайшую предшествующую анонимную метку, а символ «>@f
» ссылается на ближайшую после неё анонимною метку. Эти специальные символы нечувствительны к регистру.
1.2.4 Числовые выражения
В предыдущих примерах все числовые выражения были обычными числами, константами или метками. Но они могут быть более сложными, использовать арифметические или логические операторы для вычисления во время компиляции. Все эти операторы с их значениями приоритета перечислены в таблице 1.4.
Операции с высшим приоритетом выполняются первыми, однако вы, конечно, можете изменить такой образ действий, заключив некоторые части выражения в скобочки. «>+
», «>-
", «>*
» и «>/
» — это стандартные арифметические операции, «>mod
» вычисляет остаток от деления нацело. «>and
», «>or
», «>xor
», «>shl
», «>shr
» и «>not
» совершают те же логические операции, что и инструкции ассемблера с такими же названиями. «>rva
» характерна только для формата вывода PE и производит превращение адреса в RVA.
Числа в выражениях по умолчанию обрабатываются как десятичные, двоичные числа должны иметь «>b
» в конце, восьмеричные числа должны заканчиваться на букву «>o
», шестнадцатеричные цифры должны начинаться символами «>0x
» (как в языке C), или символом «>$
» (как в языке Pascal) или должны заканчиваться буквой «>h
». Также заключенная в кавычки строка при включении в выражение будет конвертирована в число — первый символ станет минимальным значащим байтом числа. Числовые выражения, используемые как значения адреса, могут также содержать любой из общих регистров, используемых для адресации, они могут быть сложены или умножены на подходящие значения так, как это позволено в инструкциях архитектуры x86.
Также есть несколько специальных символов, которые могут быть использованы в числовом выражении. Первое — это «>$
», которое всегда равно значению текущего смещения, тогда как «