Новини високих технологій
» » Машинний код як мова програмування. Мова асемблера

Машинний код як мова програмування. Мова асемблера

25-10-2017, 12:05
2 977
Мова збірки (або асемблера) являє собою низькорівневий програмування мовою для комп'ютера або іншого програмованого обладнання, в якому існує кореляція між мовою та інструкцією машинного коду архітектури. Кожен машинно-орієнтована мова (у професійній термінології — «збирач») відноситься до конкретної комп'ютерної архітектурі. Навпаки, більшість високорівневих мов програмування кроссплатформенны, але вимагають інтерпретації або компіляції. Платформно-орієнтований код також можна назвати символічною мовою або набором інструкцій, виконуваних безпосередньо центральним процесором комп'ютера. Кожна програма, що виконується процесором, складається з серії інструкцій. Машинний код за визначенням є найнижчим рівнем програмування, видимим для програміста.



Використання

Для багатьох операцій потрібно один або декілька операндів, здатних побудувати повну інструкцію, і багато ассемблеры можуть приймати вирази чисел і константи, а також регістри і мітки в якості операндів. Це звільняє спеціаліста при програмуванні на мові машинного коду від утомливих повторюваних обчислень. В залежності від архітектури ці елементи також можуть бути об'єднані для конкретних інструкцій або режимів адресації з використанням зсувів або інших даних, а також фіксованих адрес. Багато «збирачі» пропонують додаткові механізми для полегшення розробки програми, контролю процесу складання та підтримки налагодження.


Історична перспектива

Перший асемблерний мова був розроблений в 1947 році Кетлін Бут для ARC2 в Биркбекском лондонському університеті у процесі роботи з Джоном фон Нейманом і Германом Голдстином в Інституті перспективних досліджень. SOAP (Symbolic Optimal Assembly Program) була мовою асемблера для ПК IBM 650 створеного Стэном Поул у 1955 році. Історично багато програмні рішення були написані на асемблері. ОС писалися виключно цією мовою до введення Burroughs MCP (1961), який був написаний на мові Executive Systems Problem Oriented Language (ESPOL). Багато комерційні додатки були написані на машинно-орієнтованій мові, в тому числі велика кількість програмного забезпечення мейнфреймів IBM, створеного ІТ-гігантами. COBOL і FORTRAN в зрештою витіснили більшу частину напрацювань, хоча багато великі організації зберегли асемблерні прикладні інфраструктури в 1990-х роках.
Більшість ранніх мікрокомп'ютерів ґрунтувалися на мові асемблера з ручною кодуванням, включаючи більшість ОС і масштабних програм. Це пов'язано з тим, що ці машини мали серйозні обмеження ресурсів, навантажували індивідуальну пам'ять і архітектуру дисплеїв і надавали обмежені системні служби з помилками. Можливо, більш важливим було відсутність першокласних високорівневих компіляторів мови, придатних для використання в мікрокомп'ютері, що ускладнювало навчання машинного коду.

Область застосування

Мови складання усувають більшу частину проблемного, тривалого і трудомісткого програмування на ассемблерах першого покоління, необхідного на самих ранніх комп'ютерах. Це звільняє програмістів від рутини у вигляді запам'ятовування числових кодів і обчислення адрес. На початкових етапах «збирачі» широко використовувалися для усіх різновидів програмування. Однак до кінця 1980-х рр. їх застосування значною мірою було витіснене мовами більш високого рівня в пошуках підвищення продуктивності програмування. Сьогодні мова асемблера раніше використовується для прямої апаратної маніпуляції, доступу до спеціалізованих інструкцій процесора або для вирішення критичних проблем з продуктивністю. Типовою областю застосування є драйвери пристроїв, низькорівневі вбудовані системи і параметри реального часу.

Зразки застосування

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

Машинний код для чайників. Термінологія

Програма асемблера створює коди операцій шляхом перекладу комбінацій мнемоніки та синтаксичних правил для операцій і режимів адресації в їх числові еквіваленти. Це уявлення зазвичай включає в себе код операції, а також інші керуючі біти і дані. Асемблер також вираховує постійні вирази і визначає символьні імена для місць пам'яті і інших об'єктів.
Машинні коди команд асемблера також можуть виконувати деякі прості типи оптимізації, залежить від набору команд. Одним з конкретних прикладів цього можуть бути популярні «збирачі» x86 від різних постачальників. Більшість з них можуть виконувати заміни команд переходу в будь-якій кількості проходів, за запитом. Також здатні виконувати просту перегрупування або вставку інструкцій, таких як деякі збирачі для архітектури RISC, які можуть допомогти оптимізувати розумне планування команд, щоб максимально ефективно використовувати конвеєр CPU. Подібно раннім мов програмування, таким як Fortran, Algol, Cobol і Lisp, збирачі були доступні з 1950-х років, як і перші покоління текстових комп'ютерних інтерфейсів. Однак спочатку з'явилися збирачі, оскільки їх набагато простіше писати, ніж компілятори для високорівневих мов. Це пов'язано з тим, що кожна мнемоніка, а також режими адресації і операнди інструкцій транслюються в числові представлення кожної конкретної інструкції без великого контексту або аналізу. Також був ряд класів перекладачів та напівавтоматичних генераторів коду з властивостями, аналогічними як зборках, так і мов високого рівня, причому швидкісний код, можливо, є одним з найбільш відомих прикладів.

Кількість проходів

Існує два види програмування на асемблері, засновані на кількості проходів через джерело (за кількістю спроб прочитання) для створення об'єктного файлу.
Однопрохідні ассемблеры проходять через вихідний код один раз. Будь-який символ, використовуваний до його визначення, зажадає errata в кінці об'єктного коду.
Багатопрохідні ассемблеры створюють таблиці з усіма символами та їх значеннями в перших проходах, а потім застосовують таблицю в наступних проходах для генерації коду. Первісною причиною використання однопрохідних збирачів була швидкість збирання — часто другий прохід вимагав перемотування і перечитування джерела програми на стрічку. Більш пізні комп'ютери з набагато великими обсягами пам'яті (особливо для зберігання дисків) мали простір для виконання всієї необхідної обробки без повторного читання. Перевага многопроходного асемблера полягає в тому, що відсутність помилок призводить до того, що процес зв'язування (або завантаження програми, якщо асемблер безпосередньо створює виконуваний код) проходить швидше.

Що таке двійковий код?

Програма, написана на мові асемблера, складається з ряду мнемонічних команд процесора і мета-операторів (відомих як директиви, псевдо-інструкції і псевдооперации), коментарі і дані. Інструкції з мови асемблера зазвичай складаються з мнемоніки коду операції. За нею слідує список даних, аргументів чи параметрів. Вони переводяться ассемблером в інструкції машинного мови, які завантажуються в пам'ять і виконуються. Наприклад, наведена нижче інструкція повідомляє процесора x86/IA-32 перемістити 8-бітове значення в регістр. Двійковий код для цієї команди — 10110 за яким слідує 3-бітний ідентифікатор, для якого використовується регістр. Ідентифікатором AL є 000 тому наступний код завантажує регістр AL з даними 01100001. Виникає питання: що таке двійковий код? Це система кодування з використанням двійкових цифр «0» і «1» для подання букви, цифри або іншого символу на комп'ютері або іншому електронному пристрої. Приклад машинного коду: 1011000001100001.

Технічні особливості

Перетворення мови збірки в машинний код — це завдання асемблера. Зворотний процес виконується з допомогою дизассемблера. На відміну від мов високого рівня існує взаємно однозначна відповідність між множиною простих операторів складання та інструкціями машинної мови. Однак у деяких випадках асемблер може надавати псевдоинструкции (макроси). Вони поширюються на кілька інструкцій машинного мови для забезпечення зазвичай необхідної функціональності. Більшість повнофункціональних асемблерів також надають багатий макромови, яка використовується постачальниками і програмістами для генерації більш складних кодів і послідовностей даних.
Кожна комп'ютерна архітектура має свій власний машинний мову. Комп'ютери відрізняються кількістю і типами операцій, які вони підтримують, в різних розмірах і числі регістрів, а також у подання даних у сховище. У той час як більшість ПК загального призначення здатні виконувати практично ту ж функціональність, способи, якими вони це роблять, розрізняються. Відповідні мови асемблера відображають ці відмінності. Безліч наборів мнемоніки або синтаксису на асемблері можуть існувати для одного набору команд, зазвичай створюваного в різних програмах. У цих випадках найбільш популярним є, як правило, той, який надається виробником і використовується в його документації.

Мова дизайну

Існує велика ступінь різноманітності в тому, як автори збирачів класифікують заяви і номенклатуру, які вони використовують. Зокрема, деякі описують все, що відрізняється від машинного або розширеної мнемоніки, як псевдооперацию. Базовий словник збірки складається з системи команд — трьох основних різновидів інструкцій, які використовуються для визначення програмних операцій: мнемоніка опкода; визначення даних; директиви збирача.

Мнемоніка опкода і розширена мнемоніка

Інструкції, написані на мові асемблера, елементарні, на відміну від високорівневих мов. Як правило, мнемоніка (довільні символи) є символьним позначенням для однієї виконуваної інструкції коду. Кожна команда зазвичай складається з коду операції плюс нуль або більше операндів. Більшість команд відносяться до одного або двох значень. Розширена мнемоніка найчастіше застосовується для спеціалізованої експлуатації інструкцій для цілей, не очевидних з назви мануала. Наприклад, багато процесори не мають явної інструкції NOP, але мають вбудовані алгоритми, які використовуються для цієї мети.
Багато збирачі підтримують елементарні вбудовані макрокоманди, здатні згенерувати два або більше машинних інструкцій.

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

Існують інструкції, використовувані для визначення елементів для зберігання даних і змінних. Вони визначають тип даних, довжину і вирівнювання. Ці інструкції можуть визначати доступність інформації для зовнішніх програм (зібраних окремо) або тільки для програми, у якій визначено розділ даних. Деякі ассемблеры визначають їх як псевдооператоры.

Директиви складання

Директиви складальника, також звані псевдокодами або псевдооперациями, є командами, наданими асемблера, і направляють його на виконання операцій, відмінних від інструкцій по збірці. Директиви впливають на роботу асемблера і можуть впливати на об'єктний код, символьну таблицю, файл лістингу та значення параметрів внутрішнього асемблера. Іноді термін псевдокода зарезервований для директив, які генерують об'єктний код. Імена псевдооперацій часто починаються з крапки, щоб відрізнятися від машинних команд. Іншим поширеним використанням псевдооперацій є резервування областей зберігання даних для часу виконання і, можливо, ініціалізація їх вмісту до відомих значень.

Самодокументирующийся код

Символьні ассемблеры дозволяють програмістам пов'язувати довільні імена (мітки або символи) з комірками пам'яті і різними константами. Найчастіше кожної постійною величиною і змінної присвоюється власне ім'я, тому інструкції можуть посилатися на ці місця розташування по імені, тим самим сприяючи самодокументирующему кодом. У виконуваному коді ім'я будь підпрограми співвідноситься з її точкою входу, тому будь-які виклики підпрограми можуть використовувати її ім'я. Всередині підпрограм призначаються мітки GOTO. Багато збирачі підтримують локальні символи, які лексично відрізняються від звичайних символів. Ассемблеры типу NASM забезпечують гнучке управління символами, дозволяючи програмістам управляти різними просторами імен, автоматично обчислювати зміщення в структурах даних і призначати мітки, які посилаються на литеральные значення або результат простих обчислень, виконуваних ассемблером. Ярлики також можуть використовуватися для ініціалізації констант і змінних з допомогою переміщуються адрес. Мови асемблера, як і більшість інших мов комп'ютера, дозволяють додавати коментарі до вихідного коду програми, які будуть ігноруватися під час процесу складання. Судове коментування має важливе значення в програмах асемблерного мови, оскільки визначення та призначення послідовності двійкових машинних команд важко визначити. «Необроблений» (без коментарів) мова асемблера, створений компіляторами або дизассемблерами, досить складно прочитати, коли необхідно внести зміни.
Цікаво по темі
Чому в Instagram не працює хештег?
Чому в Instagram не працює хештег?
Останнім часом інтернет-користувачі зіткнулися з такою проблемою, що в Instagram не працюють хештегі. Побоювання деяких юзерів щодо відключення цієї
RISC-архітектура процесора
RISC-архітектура процесора
RISC-архітектура — комп'ютер з зменшеним набором інструкцій. Є типом мікропроцесорної архітектури, яка використовує невеликий оптимізований набір
Що таке програмування? Мови програмування. Комп'ютерне програмування
Що таке програмування? Мови програмування. Комп'ютерне програмування
В період появи перших комп'ютерних систем гостро постало питання того, як «навчити» машину сприймати ...
Список мов програмування за популярністю
Список мов програмування за популярністю
Програмування – це ціла наука, що дозволяє створювати комп'ютерні програми. Вона включає в себе величезну ...