Содержание
Как большинство ассемблеров, каждая исходная строка 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 для
указания на то, операнд какого размера должен
участвовать в команде.