Машинен код като език за програмиране. Език на асемблера

Асемблерният език (или асемблер) е език за програмиране на ниско ниво за компютър или друг програмируем хардуер, в който има връзка между езика и архитектурата на инструкциите за машинен код. Всеки машинно ориентиран език (в професионална терминология - "колектор") се отнася до специфична компютърна архитектура. Напротив, повечето програмни езици на високо ниво са междуплатформени, но изискват интерпретация или компилация. Пакетно ориентираният код може също да бъде наречен символен език или набор от инструкции, изпълнявани директно от централния процесор на компютъра. Всяка програма, изпълнявана от процесора, се състои от серия от инструкции. Машинният код по дефиниция е най-ниското ниво на програмиране, видимо за програмиста.




Използване

За много операции един или повече операнди трябва да изградят пълна инструкция и много асемблери могат да приемат изрази на числа и константи, както и регистри и етикети операнди. Това освобождава специалиста при програмиране на езика на машинния код от досадно повтарящи се изчисления. В зависимост от архитектурата, тези елементи могат да бъдат комбинирани за специфични инструкции или режими на адресиране, използвайки смени или други данни, както и фиксирани адреси. Много "колектори" предлагат допълнителни механизми за улесняване на разработването на програмата, за контрол на процеса на създаване и поддържане на грешки.


Историческа перспектива

Първият език на асемблера е разработен през 1947 г. от Kathleen Booth за ARC2 в Лондонския университет Биркбек в процеса на работа с Джон фон Нойман и Херман Голдстин в Института за напреднали изследвания. SOAP (Symbolic Optimal Assembly Program) е езикът на асемблера за сглобяване на IBM 650 PC, създаден от Stan Poul през 1955 г. Исторически много софтуерни решения бяха написани на асемблер. Операционната система е написана изключително на този език преди въвеждането на Burroughs MCP (1961), която е написана на езика на изпълнителните системи за проблемно ориентиран език (ESPOL). Много търговски приложения са написани на машинно-ориентиран език, включително голямо количество мейнфрейм софтуер на IBM, създаден от ИТ гиганти. COBOL и FORTRAN в крайна сметка замениха голяма част от работата, въпреки че много големи организации са запазили инфраструктурата на асемблерните приложения през 90-те години.
Повечето ранни микрокомпютри се основават на ръчно кодиращ асемблер, включително повечето операционни системи и големи приложения. Това се дължи на факта, че тези машини са имали сериозни ограничения на ресурсите, зареждат индивидуалната памет и архитектурата на дисплея и осигуряват ограничени системни услуги с грешки. Може би по-важно е липсата на първокласни висококачествени компилатори на езика, подходящи за използване в микрокомпютър, което усложнява обучението на машинния код.

Обхват

Съставящите езици премахват по-голямата част от проблематичното, дълготрайно и трудоемко програмиране на модулите от първо поколение, необходими на най-ранните компютри. Това е всичкоосвобождава програмистите от процедурата под формата на запаметяване на цифрови кодове и изчисляване на адреси. В началните етапи, колектори са широко използвани за всички видове програмиране. Въпреки това, до края на 80-те години тяхното използване до голяма степен бе заменено от езици на по-високо ниво в търсене на увеличено програмиране на производителността. Днес езикът на асемблера се използва за директна манипулация на хардуера, достъп до специализирани инструкции за процесора или за решаване на критични проблеми с производителността. Типичните приложения са драйвери на устройства, вградени системи от ниско ниво и настройки в реално време. Примери за приложение
Типични примери за по-големи програми на езика на асемблерния език са операционните системи IBM PC DOS, компилаторът Turbo Pascal и ранните приложения като програмата за електронни таблици Lotus 1-2-3.
Машинно-ориентираният език е основният език за развитие на много популярни домашни компютри от 80-те и 90-те години (като MSX, Sinclair ZX Spectrum, Commodore 64 Commodore Amiga и Atari ST). Това се дължи на факта, че интерпретираните диалози BASIC на тези системи осигуряват ниска скорост на изпълнение, както и ограничени възможности за пълноценно използване на съществуващото оборудване. Някои системи дори имат интегрирана среда за разработка (IDE) с високо развити инструменти за отстраняване на грешки и макро обекти. Някои компилатори на Radio Shack TRS-80 и неговите наследници успяха да комбинират вграден източник на изграждане с програми на високо ниво. След компилация вграденият асемблер създаде вградения двоичен код.

Машинен код за манекени. Терминология

Асемблерната програма създава кодове на транзакции чрез превеждане на комбинации от мнемонични и синтактични правила за операции и режими на адресиране в техните цифрови еквиваленти. Това представяне обикновено включва операционния код, както и други контролни битове и данни. Асемблерът също така изчислява постоянни изрази и определя имената на символите за местата на паметта и други обекти.
Командите за машинно сглобяване могат също да изпълняват някои прости видове оптимизация, в зависимост от набора от команди. Един конкретен пример за това може да са популярните "колектори" x86 от различни доставчици. Повечето от тях могат да изпълняват заместващи команди в произволен брой пропуски, при поискване. Също така те могат да извършват проста прегрупиране или вмъкване на инструкции, като например някои RISC колектори, които могат да помогнат за оптимизиране на интелигентното планиране на команди, за да се използва максимално CPU конвейер. Подобно на ранните езици за програмиране като Fortran, Algol, Cobol и Lisp, колектори са на разположение от 1950-те години, както и първото поколение текстови компютърни интерфейси. Въпреки това, колектори дойдоха на първо място, тъй като те бяха много по-лесни за писане от компилаторите за езици на високо ниво. Това се дължи на факта, че всеки мнемоничен, както и режимите на адресиране и операндите на инструкциите се превеждат в цифрово представяне на всяка отделна инструкция без голям контекст или анализ. Съществуват и редица класове преводачи и полуавтоматични генератори на кодове със свойства, подобни на сглобени иподобно на високо ниво и високоскоростен код, може би е един от най-известните примери.

Брой преминавания

Съществуват два вида програмиране на асемблери, въз основа на броя на преминаванията през източника (по броя на опитите за четене) за създаване на обектен файл.
Еднопроходните асемблери преминават през изходния код веднъж. Всеки символ, използван за дефиниране на него, ще изисква грешки в края на обектния код.
Множествените асемблери създават таблици с всички символи и техните стойности в първите пасажи и след това прилагат таблицата в следните пасажи за генериране на кода. Първоначалната причина за използването на еднопроходни колектори е скоростта на събиране - често вторият проход изисква пренавиване и препрочитане на източника на програмата на лентата. По-късните компютри с огромно количество памет (особено за съхранение на дискове) имаха възможност да извършват цялата необходима обработка без повторно четене. Предимството на многопроходната система е, че липсата на грешки води до факта, че процесът на свързване (или изтеглянето на програмата, ако асемблерът директно създава изпълним код) минава по-бързо.

Какво е двоичен код? Програмата, написана на асемблерния език, се състои от поредица от мнемонични команди на процесора и мета-операторите (известни като директиви, псевдо-инструкции и псевдо-операции), коментари и данни. Инструкциите за асемблерния език обикновено се състоят от операция с мнемоничен код. Следва списък от данни, аргументи или параметри. Те сасе превеждат от асемблер в инструкциите на машинния език, които се зареждат в паметта и се изпълняват. Например, следната инструкция казва на x86 /IA-32 процесора да премести 8-битовата стойност в регистъра. Двоичният код за тази команда е 10110, последван от 3-битов идентификатор, за който се използва регистърът. Идентификаторът AL е 000, така че следният код зарежда AL регистъра с данни 01100001. Възниква въпросът: какво е двоичен код? Това е система за кодиране, използваща двоични цифри "0" и "1" за представяне на буква, цифра или друг символ на компютър или друго електронно устройство. Пример за машинен код: 1011000001100001.

Технически характеристики

Конвертирането на езика на сглобяване в машинния код е задача за сглобяване. Обратният процес се осъществява с помощта на разглобяващо устройство. За разлика от езиците на високо ниво, има едно-към-едно съответствие между множество прости оператори на сглобяване и инструкции за машинен език. Въпреки това, в някои случаи асемблерът може да осигури псевдо-инструкции (макроси). Те се отнасят за няколко инструкции за машинен език, за да осигурят най-често необходимата функционалност. Повечето пълнофункционални асемблери също така предоставят богато макро съдържание, което се използва от доставчици и програмисти за генериране на по-сложни кодове и поредици от данни.
Всяка компютърна архитектура има свой собствен машинен език. Компютрите се различават по брой и видове операции, които поддържат, в различни размери и брой регистри, както и при представянето на данни в хранилището. В товадокато повечето компютри с общо предназначение могат да изпълняват почти същата функционалност, начините, по които те се различават. Съответните асемблерни езици отразяват тези различия. Множество набори от мнемонични или синтактични сборки могат да съществуват за един набор от команди, обикновено създадени в различни програми. В тези случаи най-популярната, по правило, е тази, която се предоставя от производителя и се използва в неговата документация.

Език на дизайна

Съществува голямо разнообразие в начина, по който авторите на колектори класифицират приложенията и номенклатурата, която използват. В частност, някои описват всичко, което се различава от машината или разширяването на мнемониката като псевдо-операция. Основният речник на колекцията се състои от система от команди - трите основни вида инструкции, които се използват за определяне на програмните операции:
  • мнемоничен код на оператора;
  • определяне на данни;
  • Ръководство за колекционера.
  • Мнемоничен опкод и разширен мнемоничен

    Инструкциите, написани на асемблерния език, са елементарни, за разлика от езиците на високо ниво. Обикновено мнемоничните (случайни символи) са символ за една изпълнима код инструкция. Всяка команда обикновено се състои от операционен код плюс нула или повече операнди. Повечето команди се отнасят до една или две стойности. Разширените мнемоники най-често се използват за специализирани наръчници с инструкции за цели, които не са очевидни от името на ръководството. Например, много процесори нямат изрична NOP инструкция, но иматвградени алгоритми, които се използват за тази цел.
    Много колектори поддържат елементарни вградени макроси, които могат да генерират две или повече машинни инструкции.

    Директиви за данните

    Има указания, използвани за идентифициране на елементи за съхраняване на данни и променливи. Те определят вида на данните, дължината и подравняването. Тези инструкции могат да определят наличието на информация за външни програми (събирани отделно) или само за приложение, което има определен раздел за данни. Някои монтажници ги определят като псевдо-оператори.

    Директиви за монтаж

    Правилата за сглобяване, наричани още псевдокодове или псевдо-операции, са команди, предоставени от асемблера, и го насочват към операции, различни от инструкциите за монтаж. Директивите засягат работата на асемблера и могат да засегнат обектния код, таблицата със символи, списъка на файловете и стойността на параметрите на вътрешния асемблер. Понякога терминът pseudocode е запазен за директиви, които генерират код на обект. Имената на псевдо-операциите често започват от една точка, различна от командните машини. Друга често срещана употреба на псевдо-операции е запазването на областите за съхранение на данни за време на изпълнение и евентуално инициализиране на тяхното съдържание до известни стойности.

    Самодокументиран код

    Асемблерите на символи позволяват на програмистите да свързват произволни имена (етикети или символи) с клетки от паметта и различни константи. Често всяка постоянна променлива и променлива се присвояват със собствено име,така че инструкциите могат да се отнасят до тези местоположения по име, като по този начин улесняват самодокументиращия код. В изпълним код, името на всяка подпрограма съответства на неговата входна точка, така че всички повиквания на подпрограмата могат да използват нейното име. В рамките на подпрограмите се задават GOTO етикети. Много колектори поддържат местни символи, които са лексично различни от обикновените. Асемблери като NASM осигуряват гъвкаво управление на символите, което позволява на програмистите да управляват различни пространства от имена, автоматично да изчисляват компенсации в структурите на данните и да присвояват тагове, които се отнасят до литерални стойности или резултат от прости изчисления, извършени от асемблера. Бързите команди също могат да се използват за инициализиране на константи и променливи с подвижни адреси. Езиците на асемблера, както повечето други компютърни езици, ви позволяват да добавяте коментари към изходния код на програмата, които ще бъдат игнорирани по време на процеса на изграждане. Съдебните коментари са важни в езиковите програми за асемблери, тъй като определянето и определянето на поредица от двоични машинни команди е трудно да се определи. "Неуправляван" (без коментари) език на асемблер, създаден от компилатори или разглобяващи, е труден за четене, когато е необходимо да се правят промени.

    Свързани публикации