Assembler — язык программирования низкого уровня, представляющий собой формат записи машинных команд, удобный для восприятия человеком.
Команды языка ассемблера один в один соответствуют командам процессора и, фактически, представляют собой удобную символьную форму записи (мнемокод) команд и их аргументов. Также язык ассемблера обеспечивает базовые программные абстракции: связывание частей программы и данных через метки с символьными именами и директивы.
Директивы ассемблера позволяют включать в программу блоки данных (описанные явно или считанные из файла); повторить определённый фрагмент указанное число раз; компилировать фрагмент по условию; задавать адрес исполнения фрагмента, менять значения меток в процессе компиляции; использовать макроопределения с параметрами и др.
Каждая модель процессора, в принципе, имеет свой набор команд и соответствующий ему язык (или диалект) ассемблера.
Достоинства и недостатки
- минимальное количество избыточного кода (использование меньшего количества команд и обращений в память). Как следствие — большая скорость и меньший размер программы
- большие объемы кода, большое число дополнительных мелких задач
- плохая читабельность кода, трудность поддержки (отладка, добавление возможностей)
- трудность реализации парадигм программирования и любых других сколько-нибудь сложных конвенций, сложность совместной разработки
- меньшее количество доступных библиотек, их малая совместимость
- непосредственный доступ к аппаратуре: портам ввода-вывода, особым регистрам процессора
- возможность написания самомодифицирующегося кода (т.е. метапрограммирования, причем без необходимости программного интерпретатора)
- максимальная «подгонка» для нужной платформы (использование специальных инструкций, технических особенностей «железа»)
- непереносимость на другие платформы (кроме двоично совместимых).