Содержание
Как большинство ассемблеров, каждая исходная строка NASM содержит (если это не макрос, препроцессорная или ассемблерная директива: см. Глава 4), некоторую комбинацию четырех полей
метка: инструкция операнды ; комментарий
Как обычно, большинство этих полей необязательны; допускается присутствие или отсутствие любой комбинации метки, инструкции и комментарий. Конечно, необходимость поля операндов определяется присутствием и природой поля инструкций.
В NASM используется наклонная черта влево (\) как символ продолжения строки; если строка заканчивается наклонной чертой влево, то следующая будет рассматриватся как часть строки законченной наклонной чертой влево.
NASM не
накладывает ограничений на количество пробелов
в строке: метки могут иметь пробелы вначале, а
инструкции могут не иметь никаких пробелов и т.п.
Двоеточие после метки также необязательно (Это
означает, что если вы хотите поместить в строку
инструкцию lodsb
, а введете lodab
, строка останется корректной, но
вместо инструкции будет объявлена метка.
Выявить данные опечатки отчасти можно, введя в
строке запуска NASM ключ -w+orphan-labels
— в этом случае
при обнаружении метки без заключительного
двоеточия будет выдаваться предупреждение).
Допустимыми символами в
метках являются буквы, цифры, знаки _
, $
, #
,
@
, ~
, .
и ?
. Допустимые символы
в начале метки (первый символ метки) — только
буквы, точка (.
) (со специальным
значением: см. Раздел 2.9), знак подчеркивания
(_
) и вопросительный знак (?
). В идентификаторе может также
присутствовать префикс $
для
указания того, что это действительно
идентификатор, а не зарезервированное слово;
таким образом, если некоторый компонуемый вами
модуль описывает символ eax
, вы
можете в коде NASM (для указания того, что это не
регистр) сослаться на него так: $eax
.
Поле
инструкций может содержать любые процессорные
инструкции: поддерживаются инструкции Pentium и P6,
FPU, MMX, а также некоторые недокументированные
инструкции. Перед инструкциями могут
присутствовать префиксы LOCK
,
REP
, REPE/REPZ
или
REPNE/REPNZ
, используемые по их
обычному предназначению. Поддерживаются
префиксы размера адреса и операнда A16
, A32
, O16
и O32
. В качестве префикса инструкции вы
можете использовать также обозначение
сегментного регистра: код es mov
[bx],ax
эквивалентен коду mov
[es:bx],ax
. Мы рекомендуем использовать
последний синтаксис, т.к. он согласуется с
другими синтаксическими особенностями языка,
однако для инструкций, не имеющих операндов
(например, LODSB
) и требующих в
некоторых случаях замены сегмента, на данный момент не
существует никакого синтаксического способа
обойти конструкцию es lodsb
.
Инструкции не требуется использовать
префиксы: префиксы, такие как CS
,
A32
, LOCK
или REPE
могут присутствовать в строке
самостоятельно и при этом NASM будет генерировать
соответствующие префикс-байты.
В дополнение к инструкциям процессора, NASM поддерживает также несколько псевдо-инструкций, описанных в Раздел 2.2.
Операнды
инструкций могут принимать несколько форм: они
могут быть регистрами (например, AX
, BP
, EBX
,
CR0
: NASM не использует синтаксис в
стиле gas, где имена
регистров должны предваряться знаком %
), эффективными адресами (см. Раздел 2.3),
константами (Раздел 2.5) или выражениями (Раздел 2.6).
Для инструкций сопроцессора NASM допускает различные формы синтаксиса: вы можете использовать двух-операндную форму, поддерживаемую MASMом, а также чисто NASMовскую одно-операндную форму Например, вы можете написать:
fadd st1 ; это значит st0 := st0 + st1 fadd st0, st1 ; это то же самое fadd st1, st0 ; это значит st1 := st1 + st0 fadd to st1 ; это то же самое
Почти любая инструкция сопроцессора,
ссылающаяся на содержимое памяти, должна
использовать один из префиксов DWORD
, QWORD
,
TWORD
, DDQWORD
, или OWORD
для
указания на то, операнд какого размера должен
участвовать в команде.