Связывание программ на разных языках
Поскольку уже давно на языке ассемблера часто кодируют только фрагменты программ, их необходимо связывать с остальными частями программной системы, написанными на других языках программирования. Это достигается двумя основными способами:
На этапе компиляции — вставка в исходный код программы на языке высокого уровня ассемблерных фрагментов (англ. inline assembler) с помощью специальных директив языка. Способ удобен для несложных преобразований данных, но полноценного ассемблерного кода, с данными и подпрограммами, включая подпрограммы со множеством входов и выходов, не поддерживаемых языком высокого уровня, с его помощью сделать невозможно.
На этапе компоновки при раздельной компиляции. Для взаимодействия компонуемых модулей достаточно, чтобы импортируемые функции (определённые в одних модулях и используемые в других) поддерживали определённое соглашения вызова (англ. calling conventions). Написаны же отдельные модули могут быть на любых языках, в том числе и на языке ассемблера.
Синтаксис
Синтаксис языка ассемблера определяется системой команд конкретного процессора.
Набор команд
Типичными командами языка ассемблера являются (большинство примеров даны для Intel-синтаксиса архитектуры x86):
Команды пересылки данных (mov и др.)
Арифметические команды (add, sub, imul и др.)
Логические и побитовые операции (or, and, xor, shr и др.)
Команды управления ходом выполнения программы (jmp, loop, ret и др.)
Команды вызова прерываний (иногда относят к командам управления): int
Команды ввода/вывода в порты (in, out)
Для микроконтроллеров и микрокомпьютеров характерны также команды, выполняющие проверку и переход по условию, например:
cjne — перейти, если не равно
djnz — декрементировать, и если результат ненулевой, то перейти
cfsneq — сравнить, и если не равно, пропустить следующую команду
Инструкции
Типичный формат записи команд:
[метка:] мнемокод [операнды] [;комментарий]
где мнемокод — непосредственно мнемоника инструкции процессору. К ней могут быть добавлены префиксы (повторения, изменения типа адресации и пр.).
В качестве операндов могут выступать константы, адреса регистров, адреса в оперативной памяти и пр. Различия между синтаксисом Intel и AT&T касаются в основном порядка перечисления операндов и указания различных методов адресации.
Используемые мнемоники обычно одинаковы для всех процессоров одной архитектуры или семейства архитектур (среди широко известных — мнемоники процессоров и контроллеров x86, ARM, SPARC, PowerPC, M68k). Они описываются в спецификации процессоров.
Директивы
Программа на языке ассемблера может содержать директивы: инструкции, не переводящиеся непосредственно в машинные команды, а управляющие работой компилятора. Набор и синтаксис их значительно разнятся и зависят не от аппаратной платформы, а от используемого транслятора (порождая диалекты языков в пределах одного семейства архитектур). В качестве «джентльменского набора» директив можно выделить следующие:
определение данных (констант и переменных),
управление организацией программы в памяти и параметрами выходного файла,
задание режима работы компилятора,
всевозможные абстракции (то есть элементы языков высокого уровня) — от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования),
макросы.