Инструкции на языке ассемблера разделяются разрывами строк, т.е. одна инструкция располагается на одной строке. Если строка содержит точку с запятой, за исключением запятой внутри кавычек, то остальная часть этой строки рассматривается как комментарий и компилятор игнорирует его. Если строка заканчивается символом «\» (хотя за ней могут следовать точка с запятой и комментарий), то следующая строка ее является продолжением.
Каждая строка в исходном коде является последовательностью элементов, которые могут быть одного из трех типов. Первый тип – специальные символьные знаки, которые являются отдельным элементами, даже если написаны слитно с другими элементами. К символьным знакам относятся: + - * / = < > ( ) [ ] { } : , | & ~ # `. Последовательность других знаков, отделенная от других элементов либо пробелами, либо символьным знаком, является символом. Если первый знак такого символа начинается с одинарной или двойной кавычки, то он объединяет любую последовательность знаков, следующую за ним, даже специальные, в строку, которая должна заканчиваться тем же символом, что и начиналась (одинарной или двойной кавычкой). Однако при наличии двух одинаковых кавычек подряд (без какого-либо другого знака между ними), они будут включены в строку в качестве одинарной кавычки. Символы, за исключением символьных знаков и строк, могут быть использованы в качестве имен, которые также называют символами имен.
Каждая инструкция состоит из мнемоники и нескольких операндов, разделенных запятыми. Операндом может быть регистр, непосредственное значение или адрес в памяти, ему может предшествовать оператор размера, определяющий или изменяющий его размер (таблица 1.1). Названия доступных регистров можно найти в таблице 1.2, их размеры не могут быть изменены. Непосредственное значение может быть любым числовым выражением.
Таблица 1.1 Размер операторов
Таблица 1.2 Регистры
Если операнд является данными в памяти, то адрес этих данных (также любое числовое выражение, но оно может содержать и регистры) должен быть заключен в квадратные скобки, либо ему должен предшествовать оператор ptr. Например, инструкция mov eax,3 скопирует непосредственное значения 3 в регистр eax, инструкция mov eax,[7] поместит 32-битное значение, расположенное по адресу 7 в регистр eax, а инструкция mov [7],3 скопирует непосредственное значение 3 в байт по адресу 7, эта инструкция также может быть записана в форме mov byte ptr 7,3. Чтобы определить, какой сегментный регистр должен использоваться при адресации, имя сегментного регистра с двоеточием следует расположить перед значением адреса (внутри квадратных скобок или после оператора ptr).