Асемблерен език е език за програмиране от ниско ниво, който е свързан с конкретен процесор и не може да бъде пренесен без значителни изменения към машина с различна компютърна архитектура и набор от инструкции. Това е в контраст с повечето езици за програмиране от високо ниво, които са съвместими с различни архитектури, но изискват превеждане или компилиране. Специализираният системен софтуер, който преобразува инструкциите от асемблерен език в машинен код, се нарича асемблер, а процесът на преобразуване е познат като асемблиране на кода.
За представянето на всяка процесорна операция или инструкция от ниско ниво в асемблерния език се използва мнемоника. Типичните операции изискват един или повече операнди, за да образуват цялостна инструкция и повечето асемблери за целта може да приемат като операнди етикети, символи и изрази, за да освободят програмиста от досадните изчисления на ръка. Макро-асемблерите съдържат улесняващи макрокоманди, така че инструкциите на асемблерен език се представят обобщено чрез едно име и това име да може да се използва за вмъкване в друг код. Много асемблери предоставят допълнителни инструменти за улесняване на разработката на програми, за контролиране на процеса на асемблиране и за подпомагане на дебъгването.
Вижте долу раздела с Терминология за информация относно непоследователната употреба на термините асемблерен език и асемблер
История Асемблерният език датира от въвеждането на програмируемия компютър. Първите асемблери са създадени от Катлийн Буут през 1947 за нуждите на ARC2General Considerations in the Design of an All Purpose Electronic Digital Computer by Andrew D. Booth and Kathleen H. V. Britten. 2nd. Edition. August 1947. и от Дейвид Уилър (David Wheeler) през 1948 за нуждите на EDSAC1985 Computer Pioneer Award „For assembly language programming.“. По онова време не се използва терминът „асемблер“, а „множество от базови команди“ () и „начални команди“ (). За първи път терминът „асемблер“ започва да се използва в по-късните отчети по EDSAC.
В началните етапи от развитието на програмирането е въведено понятието автокод – програмен език, чиито изрази по структура са подобни на командите и обработваните данни на конкретния машинен кодГОСТ 19781 – 83 Вычислительная техника. Терминология: Справочное пособие. Выпуск 1, М., Издательство стандартов, 1989, isbn=5-7050-0155-X. В днешно време терминът на практика не се използва.
Исторически погледнато, ако машинният код се приеме за първо поколение програмен език, то асемблерният език може да се разглежда като второ поколение. На свой ред, неговите недостатъци, например, сложността на разработване на големи програми, водят до появата на програмните езици от второ поколение – програмни езици от високо ниво (като Фортран, Лисп, Кобол, Паскал, C и други).
В началото на развитието на компютрите множество програми са написани на асемблерни езици. Натаниел Рочестър пише асемблера на IBM 701. SOAP (Оптимално Символно Сглобяваща Програма – Symbolic Optimal Assembly Program) (1955) асемблерът е написан от Стан Полей за IBM 650.
Операционните системи са били писани изцяло на асемблерен език до въвеждането на MCP от Burroughs Corporation (1961), написана на ESPOL (Executive Systems Problem Oriented Language), диалект на ALGOL. Много комерсиални приложения също са писани на асемблерни езици, включително голямо количество от софтуера за IBM мейнфрейм. В крайна сметка езиците COBOL, FORTRAN и PL/I изместват асемблерните езици, въпреки че редица големи организации ги задържат в голяма част от приложенията си и през 90-те.
Типични примери за големи програми на асемблерен език от това време са операционната система DOS за IBM PC и ранните приложения като програмата за електронни таблици Lotus 1-2-3. Дори през 90-те години, повечето конзолни видео игри се пишат на асемблерен език, включително повечето игри за Mega Drive/Genesis и Super Nintendo Entertainment System. Според някои хора запознати с производството, това е най-подходящият програмен език за извличане на най-доброто представяне от конзолата Sega Saturn, за която е пословично трудно да се разработи игра. Аркадната игра NBA Jam (1993) е друг пример.
Асемблерният език дълго време е основен език за разработка за много популярни домашни компютри от 80-те и 90-те (като Sinclair ZX Spectrum, Commodore 64, Commodore Amiga и Atari ST). Това се обяснява с факта, че интерпретираните диалекти на BASIC, използвани на тези системи, предлагат недостатъчна скорост на изпълнение и малко инструменти, за да се използва пълноценно наличният хардуер. Някои системи дори имат интегрирана среда за разработка (IDE) с много напреднало отстраняване на грешки и макро инструменти.
Синтаксис на асемблерния език Асемблерният език използва мнемоника, за да представи всяка машинна инструкция или код на ниско ниво, всяка директива, обикновено също всеки архитектурен регистър, флаг и т.н. Някои от мнемониките могат да бъдат вградени, други се дефинират от потребителя. Много операции изискват един или повече операнди, за да формират пълна инструкция. Повечето асемблери позволяват именувани константи, регистри и етикети за програмни и паметови позиции и могат да изчисляват изрази за операнди. По този начин програмистите са освободени от досадни повтарящи се изчисления и асемблерните програми са много по-четливи от машинния код. В зависимост от архитектурата, тези елементи могат също да бъдат комбинирани за специфични инструкции или режими на адресиране, като се използват отмествания или други данни, както и фиксирани адреси. Много асемблери предлагат допълнителни механизми за улесняване на разработването на програми, за контрол на процеса на асемблиране и за подпомагане на отстраняването на грешки.
Някои асемблери използват синтаксис с колони за специфичните полета; това е обичайно за машините с перфокарти през 50-те и началото на 60-те години. Други асемблери имат синтаксис в свободна форма, с полета, разделени с разделители, напр. пунктуация, интервал (white space). Трети са хибридни, например с поставяне на етикетите в специфична колона, а другите полета са отделени с разделители; това става по-често срещано през 60-те години.
IBM System/360 Всички асемблери на IBM за System/360 по подразбиране имат етикет в колона 1, полета, разделени с разделители в колони 2 – 71, индикатор за продължение в колона 72 и пореден номер в колони 73 – 80. Разделителят за етикет, код за операция, операнди и коментари е интервал, докато отделните операнди са разделени със запетаи и скоби.
Терминология Макроасемблерът е асемблер, който включва средство за обработка на макроси, така че част от кода да може да бъде представен с едно име и то да може да се вмъква в друг код. Отворен код се отнася до всеки вход на асемблер извън дефиницията на макроси. Кръстосан асемблер (вижте също кръстосан компилатор ) е асемблер, който се изпълнява на компютър или операционна система ( хост системата) от различен тип от системата, на която трябва да се изпълнява полученият код ( целевата система ). Кръстосаното сглобяване улеснява разработването на програми за системи, които нямат ресурсите да поддържат разработката на софтуер, като например вградена система или микроконтролер. В такъв случай полученият обектен код трябва да бъде прехвърлен към целевата система чрез памет само за четене (ROM, EPROM и т.н.), програматор (когато паметта само за четене е интегрирана в устройството, както при микроконтролерите), или връзка за данни, използваща или точно копие бит по бит на обектния код, или текстово представяне на този код (като Intel hex или Motorola S-record ). Асемблерът от високо ниво е програма, която предоставя езикови абстракции, по-често свързани с езиците на високо ниво, като разширени контролни структури ( IF/THEN/ELSE, DO CASE и т.н.) и абстрактни типове данни на високо ниво, включително структури/ записи, съюзи, класове и набори. Микроасемблерът е програма, която помага да се подготви фърмуер, за контролиране на ниско ниво на работа на компютър. Мета-асемблерът е „програма, която приема синтактичното и семантичното описание на асемблерния език и генерира асемблер за този език“ или която приема изходен файл на асемблер заедно с такова описание и асемблира изходния файл в съответствие с това описание. Асемблерите „Meta-Symbol“ за серията компютри SDS 9 и SDS Sigma са мета-асемблери. Използван като мета-асемблер, той позволява на потребителя с минимални усилия да създава свои програмни езици и да генерира средствата за обработката им Sperry Univac също предостави мета-асемблер за серията UNIVAC 1100/2200. вграден асемблер (или embedded assembler ) е код на асемблерен език, съдържащ се в програма на език от високо ниво. Той най-често се използва в системни програми, които се нуждаят от директен достъп до хардуера.
Ключови понятия Асемблер Програмата асемблер създава обектен код, като превежда комбинацията от мнемоника и синтаксис за операциите и режимите на адресиране в техните числени еквиваленти. Това представяне обикновено включва код на операция („operation code“), както и други контролни битове и данни. Асемблерът също изчислява константните изрази и дешфрира символните имена за места в паметта и други обекти. Използването на символни имена е ключова характеристика на асемблерите, като спестява досадни изчисления и ръчна актуализация на адресите след програмни модификации. Повечето асемблери също така включват макрокоманди за извършване на текстово заместване – например, за генериране на общи кратки последователности от инструкции като вградени, вместо извиквани подпрограми.
Някои асемблери може също да са в състояние да изпълняват някои прости типове оптимизации, специфични за набора от инструкции. Един конкретен пример са вездесъщите x86 асемблери от различни доставчици. Наричани „jump-sizing“, повечето от тях са в състояние при поискване да извършват замествания на инструкции на „скокове“ в произволен брой преминавания. Други могат дори да правят просто пренареждане или вмъкване на инструкции, като например някои асемблери за RISC архитектури, които могат да помогнат за оптимизиране на разумно планиране на инструкции, за да се използва възможно най-ефективно конвейера на процесора.
От 50-те години на XX век асемблерите се прилагат като първа стъпка над машинния език и преди езиците за програмиране на високо ниво като Fortran, Algol, COBOL и Lisp. Съществуват и няколко класа транслатори и полуавтоматични генератори на код със свойства, подобни както на асемблерните, така и на езиците от високо ниво, като Speedcode е може би един от по-известните примери.
За конкретен централен процесор или набор от инструкции може да има няколко асемблера с различен синтаксис. Например, инструкция за добавяне на данни от паметта към регистър в процесор от семейство x86 може да бъде add eax,[ebx] в оригиналния синтаксис на Intel, докато същото ще бъде addl (%ebx),%eax в синтаксиса AT&T, използван от GNU Assembler. Въпреки различния запис, различните синтактични форми обикновено генерират един и същ цифров машинен код. Един асемблер може също да има различни режими, за да поддържа вариации в синтактичните форми, както и в техните точни семантични интерпретации (като FASM синтаксис, TASM синтаксис, идеален режим и т.н., в специалния случай на x86 асемблерно програмиране).
Брой преходи Има два вида асемблери въз основа на това колко преминавания през изходния код са необходими (колко пъти асемблерът го чете), за да създаде обектния файл.
Асемблерите с един ход обработват изходния код само веднъж. За символи, използвани преди да бъдат дефинирани, асемблерът ще излъчи „errata“ след евентуалната дефиниция, казвайки на линкера или товарача да поправи местата, където са били използвани все още недефинираните символи. Многоходовите асемблери създават таблица с всички символи и техните стойности в първите преминавания, след което използват таблицата в следващите преминавания, за да генерират код.