У Вікіпедії є статті про інші значення цього терміна: ASM.
Асе́мблер (англ.assembler) — комп'ютерна програма-транслятор, що призначена для генерації машинного (двійкового) коду з символьного представлення цього коду (мови асемблера). Наприклад, текстовий рядок CLI для архітектури x86 перетворюється асемблером у двійковий код 11111010. Крім власне трансляції, багато програм-асемблерів підтримують і іншу функціональність, корисну при розробці системного і прикладного програмного забезпечення, таку як вибір формату об'єктного модуля, генерація символьної інформації (наприклад, відлагоджувальної), різноманітні директиви на зразок EXTERN чи GLOBAL, макрокоманди тощо.
При трансляції з мов високого рівня асемблер нерідко використовується для виконання завершальної фази трансляції.
Історія
Один з перших асемблерів було створено Натаніелем Рочестером для машини IBM 701. Асемблер одразу полегшив працю першим програмістам: замість кодів машинних команд стало можливим писати програму у символьній (алфавітно-цифровій) формі, і найголовніше, відпала необхідність ручного перерахунку всіх адрес переходів при зміні програми. Асемблери 1950-х років, що мали назву автокодерів, були одними з перших, що надавали можливість означення і використання макрокоманд. Починаючи з 1960-1970-х років зростає важливість взаємодії і інтеграції програм і фрагментів мовою асемблера з модулями, написаними на мовах програмування високого рівня. До сьогодні такі програми, як асемблер і компонувальник є абсолютно необхідними інструментами при представленні нової архітектури комп'ютера чи процесора.
Базова трансляція
Найпростішим способом перетворення символьних рядків на машинні команди може бути пряма трансляція. Наприклад, з кожного наступного рядка тексту
moveax,0F00BADhjmpeax
асемблером для 32-розрядної архітектури x86 одразу може бути згенерований машинний код відповідної команди процесора і її аргументів (B8 AD 0B F0 00 FF E0). Якщо ж у програмі присутні команди безпосередньо переходу за мітками, алгоритм роботи асемблера ускладнюється: потрібні як мінімум два перегляди (або проходи) тексту програми. При першому перегляді здійснюється розподіл пам'яті і надання значень символічним іменам; при другому — формується об'єктний модуль. В процесі трансляції асемблер проводить повний синтаксичний аналіз початкової програми, забезпечуючи при цьому достатньо точну діагностику помилок за місцем і характером.
На додачу до базової трансляції, одним з найбільш вживаних механізмів програм-асемблерів є макроінструкції, починаючи з найпростішої заміни тексту, і до сучасних вбудованих макропроцесорів, з доволі складними можливостями підстановки і розкриття параметрів. Наприклад, асемблери NASM і YASM реалізують власний стек макропроцесора (директиви%push і %pop), можуть здійснювати зсув переданих макрокоманді параметрів на задану кількість (%rotate), повторювати емітування послідовності команд (%rep / %endrep), здійснювати умовну трансляцію (директиви %ifdef і подібні). Пакети макрокоманд для багатих на можливості асемблерів надають програмістам навіть механізм, наближені до структурного програмування, коли програма на мові асемблера виглядає так, немов би вона містить такі сутності, як процедури і функції, локальні змінні, структури даних з можливістю символічної адресації полів, інструкції-перемикачі і тому подібне.[1]
Асемблер NASM (а також майже повністю сумісний YASM) реалізує підтримку одразу кількох форматів об'єктних файлів. Така можливість надзвичайно корисна при крос-компіляції, коли, наприклад, на комп'ютері з операційною системою GNU/Linux потрібно отримати об'єктний файл у форматі PE для систем типу Microsoft Windows. Можливо також задати трансляцію безпосередньо у формат двійкового коду (bin), коли потрібна відповідність «один в один» між текстом програми і згенерованим кодом.
Надзвичайно корисною є підтримка локальних міток у процедурах. У великих програмах це дозволяє мати у кожній процедурі чи функції мітки на кшталт exit чи error, і асемблер коректно визначить адреси переходу на них в межах даної процедури.