Ця стаття про систему команд в цілому; про інструкції див: Код операції.

Машинний код (платформенно-орієнтований код), машинний мова - система команд (набір кодів операцій) конкретної обчислювальної машини, яка інтерпретується безпосередньо процесором або мікропрограмами цієї обчислювальної машини. [1]

Кожна інструкція виконує певну (звичайне елементарне) дію, таке як операція з даними (наприклад, додавання або копіювання; в регістрі або в пам'яті) або перехід до іншого ділянці коду (зміна порядку виконання; при цьому перехід може бути безумовним або умовним, залежним від результатів попередніх інструкцій). Кожна исполнимости програма складається з послідовності таких атомарних інструкцій.

Машинний код можна розглядати як примітивний мова програмування або як найнижчий рівень представлення скомпільованих або ассемблірованних комп'ютерних програм. Хоча цілком можливо створювати програми прямо в машинному коді, зараз це робиться рідко в силу громіздкості коду і трудомісткості управління ресурсами процесора, за винятком ситуацій, коли потрібно екстремальна оптимізація. Тому переважна більшість програм пишеться на мовах більш високого рівня і транслюється в машинний код компіляторами. Машинний код іноді називають нативним кодом (також власним або рідним кодом - від англ. native code ), Коли говорять про платформо-залежних частинах мови або бібліотек. [2]

Програми на інтерпретованих мовах (таких як Бейсік або Python) не транслюються в машинний код, замість цього вони або виконуються безпосередньо інтерпретатором, або транслюються в псевдокод ( байт-код). Однак інтерпретатори цих мов (які самі можна розглядати як процесори) як правило представлені в машинному коді.

Кожна модель процесора має свій власний набір команд, хоча в багатьох моделях ці набори команд сильно перекриваються. Кажуть, що процесор A сумісний з процесором B, якщо процесор A повністю "розуміє" машинний код процесора B. Якщо процесор A знає декілька команд, яких не розуміє процесор B, то B несумісний з A.

Раніше процесори просто виконували інструкції одну за одною, але нові суперскалярні процесори здатні виконувати декілька інструкцій за раз.

Також інструкції бувають постійної довжини (у RISC -, MISC -архітектур) і діапазонною (у CISC -архітектур; наприклад, для архітектури x86 команда має довжину від 8 до 120 бітів).


1. Мікрокод

У деяких комп'ютерних архітектурах підтримка машинного коду реалізується ще більш низькорівневим шаром програм, званих мікропрограмами, що дозволяє забезпечити єдиний інтерфейс машинної мови у всієї лінійки або сімейства комп'ютерів, які можуть мати значні структурні відмінність між собою. Це робиться для полегшення перенесення програм у машинному коді між різними моделями комп'ютерів. Прикладом цього є сімейство комп'ютерів IBM System/360 і їх наступників: незважаючи на різні шини шириною від 8 до 64 біт і вище, тим не менш у них загальна архітектура на рівні машинної мови.

Використання шару мікрокоду для реалізації емулятора дозволяє комп'ютеру представляти архітектуру абсолютно іншого комп'ютера. У лінійці System/360 це використовувалося для перенесення програм з більш ранніх машин IBM на нове сімейство - наприклад, емулятор IBM 1401/1440/1460 на IBM S/360 model 40.


2. Абсолютний і позиційно-незалежний код

Абсолютний код ( англ. absolute code ) - Програмний код, придатний для прямого виконання процесором [1], тобто код, який не потребує додаткової обробки (наприклад, дозволу посилань між різними частинами коду або прив'язки до адрес в пам'яті, звичайно виконуваної завантажувачем програм). Прикладами абсолютного коду є виконані файли у форматі . COM і завантажувач ОС, наявний у MBR. Часто абсолютний код розуміється в більш вузькому сенсі як позиційно-залежний код (тобто код, прив'язаний до певними адресами пам'яті).

Позиційно-незалежний код ( англ. position-independent code ) - Програма, яка може бути розміщена в будь-якій області пам'яті, так як всі посилання на комірки пам'яті в ній відносні (наприклад, щодо лічильника команд). Таку програму можна перемістити в іншу область пам'яті в будь-який момент, на відміну від переміщуваної програми, яка хоча і може бути завантажена в яку область пам'яті, але після завантаження повинна залишатися на тому ж місці. [1]

Можливість створення позиційно-незалежного коду залежить від архітектури та системи команд цільової платформи. Наприклад, якщо у всіх інструкціях переходу в системі команд повинні вказуватися абсолютні адреси, то код, що вимагає переходів, практично неможливо зробити позиційно-незалежним. В архітектурі x86 безпосередня адресація в інструкціях роботи з даними представлена ​​тільки абсолютними адресами, але оскільки адреси даних вважаються відносно сегментного регістра, який можна поміняти в будь-який момент, це дозволяє створювати позиційно-незалежний код зі своїми осередками пам'яті для даних. Крім того, деякі обмеження набору команд можуть зніматися за допомогою самомодифицирующихся коду або нетривіальних послідовностей інструкцій.


3. Програма "Hello, world!"

Програма " Hello, world! "для процесора архітектури x86 (ОС DOS, висновок за допомогою BIOS Int 10h (англ.) виглядає наступним чином (у шістнадцятковому представленні по байтних):

BB 11 січень B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
Коментарі до програми

Дана програма працює при її розміщенні по зміщенню 100 16. Окремі інструкції виділені кольором:

  • BB 11 січень , B9 0D 00 , B4 0E , 8A 07 - Команди присвоєння значень регістрів.
  • 43 - інкремент регістра BX.
  • CD 10 , CD 20 - Виклик програмних переривань 16 жовтня і 20 16.
  • E2 F9 - Команда для організації циклу.
  • Малиновим показані дані (рядок "Hello, world!").

Той же код асемблерні команди :

 XXXX: 0100  mov bx, 0111h  ; Помістити в bx зсув рядка HW XXXX: 0103  mov cx, 000Dh  ; Помістити в cx довжину рядка HW XXXX: 0106  mov ah, 0Eh  ; Помістити в ah номер функції переривання 10h XXXX: 0108  mov al, [bx]  ; Помістити в al значення комірки пам'яті, адреса якої знаходиться в bx XXXX: 010A  inc bx  ; Перейти до наступного байту рядки (збільшити зсув на 1) XXXX: 010B  int 10h  ; Виклик переривання 10h XXXX: 010D  loop 0108  ; Якщо cx ≠ 0, то зменшити cx на 1 і перейти за адресою 0108 XXXX: 010F  int 20h  ; Переривання 20h: завершити програму XXXX: 0111  HW db 'Hello, World!'  ; Рядок, яку потрібно надрукувати 

Примітки

  1. 1 2 3 Тлумачний словник по обчислювальним системам = Dictionary of Computing / Под ред. В. Іллінгуорта та ін: Пер. з англ. А. К. Белоцкого та ін; Під ред. Є. К. Масловського. - М .: Машинобудування, 1990. - 560 с. - 70 000 (дод,) прим. - ISBN 5-217-00617-X (СРСР), ISBN 0-19-853913-4 (Великобританія)
  2. Kate Gregory. Managed, Unmanaged, Native: What Kind of Code Is This? - www.developer.com/net/cplus/print.php/2197621 (28 квітня 2003). Читальний - www.webcitation.org/68313Lm0E з першоджерела 30 Травень 2012.


Інформатика Це заготовка статті по інформатиці. Ви можете допомогти проекту, виправивши або дописавши її.