Машинен код — дефиниция, набор от инструкции и структура
Машинен код: ясна дефиниция, структура и набор от инструкции — опкодове, операнди и как асемблерът и компилаторите го превръщат в роден код за архитектурата.
Машинен код е компютърна програма, записана на нивото на машинен език, предназначена да бъде директно изпълнявана от процесора. Той използва набора от инструкции на определена компютърна архитектура и обикновено се представя като поредица от байтове (често показвани в двоичен код или в шестнадесетична форма). Машинният код е най-ниското ниво на софтуера и е зависим от хардуера: инструкции, кодирани за една архитектура, обикновено не работят на друга. Всички по-високо ниво езици се превеждат на машинен код (чрез асемблер, компилатор или JIT) или се интерпретират от софтуер, за да може процесорът да ги изпълнява.
Как е устроена една инструкция
Инструкцията указва на процесора каква операция да извърши. Всяка инструкция обикновено се състои от два основни компонента:
- опкод (код на операцията) — частта, която казва „какво“ да се направи (например добавяне, преместване, скок); този елемент е описван и в опкод.
- операнд(и) — данните или адресите, върху които се извършва операцията; могат да бъдат регистри, адреси на паметта, непосредствени стойности (immediate) и т.н. (операнд).
Операндите и начините за адресиране (addressing modes) са част от спецификацията на набора от инструкции. Някои инструкции имат фиксирана дължина (типично за RISC архитектури), а други — променлива (често при CISC архитектури като x86).
Набор от инструкции (ISA)
Наборът от инструкции (Instruction Set Architecture, ISA) е списък с всички опкодове и начина, по който те се кодират, какви типове операнди се поддържат и какво представлява програмният модел на процесора (регистри, адресно пространство, режимите на изпълнение). Този набор определя границите на това, което софтуерът може да прави директно с хардуера.
От асемблер и други езици до машинен код
Създателите на програми използват асемблерни програми (за ръчно писане на инструкции в удобна текстова форма) или компилатори (за автоматичен превод от език на по-високо ниво) да превърнат кода в машинен код. Компилират или асемблират се асемблерният код и други езици за програмиране, за да се получи изпълним двоичен файл, който може да бъде зареден и стартиран от операционната система.
Машинният код понякога се нарича роден код, защото е специфичен за дадената архитектура и работи „родно“ върху нея. Тази зависимост от хардуера означава, че един и същи двоичен файл не е преносим между различни ISA без рекомпилация или емулация.
Представяне и формати
- В паметта машинният код е просто последователност от байтове. За хората тези байтове често се показват в шестнадесетичен вид или като мнемонични инструкции чрез асемблер/дизасемблер.
- Изпълнимите файлове обикновено имат формати (например ELF, PE, Mach-O), които съдържат допълнителна структура: заглавия, таблици с адреси, символи, секции за данни и код и др.
- Ендийнсът (big-endian vs little-endian) и размерът на думата (word size, например 32- или 64-бита) влияят на това как данните и инструкциите се интерпретират от процесора.
Особености и практически бележки
- Някои процесори използват микрокод — вътрешен слой под машинния код — който превежда сложни инструкции в по-прости вътрешни операции.
- Режимът на изпълнение и защитните механизми (например NX/DEP — non-executable memory) контролират къде в паметта може да бъде изпълнен машинен код, което е важно за сигурността.
- Софтуерни инструменти като асемблери, дизасемблери и дебъгъри (debuggers) се използват за създаване, анализ и диагностика на машинен код.
- Има примерни техники като само-изместващ се код (self-modifying code) и големи оптимизации от компилаторите, които могат да генерират много сложен машинен код.
Машинен код срещу байткод и интерпретиран код
За разлика от машинния код, който е директно изпълним от процесора, някои среди използват междинни формати (например байткод при Java или .NET), които се изпълняват от виртуална машина или се превеждат динамично (JIT) в машинен код по време на изпълнение. Това дава по-голяма преносимост, но често с някаква цената по отношение на производителността спрямо родния машинен код.
Накратко: машинен код е най-ниското, хардуерно-специфично представяне на програма — низ от опкодове и операнди, които процесорът изпълнява. Разбирането на неговата структура и функциониране е ключово за работа с ниско-нивови технологии, оптимизация, отстраняване на грешки и сигурност.
Записване на машинен код
Машинният код може да бъде записан под различни форми:
- Използване на няколко превключвателя. Така се генерира последователност от 1 и 0. Това е използвано в ранните дни на компютрите. От 70-те години на миналия век вече не се използва.
- Използване на шестнайсетиченредактор. Това позволява използването на опкодове вместо номера на командата.
- Използване на асемблер. Асемблерните езици са по-прости от операционните кодове. Техният синтаксис е по-лесен за разбиране от машинния език, но по-труден от езиците от високо ниво. Асемблерът сам ще преведе изходния код в машинен код.
- Използването на език за програмиране от високо ниво позволява на програмите да използват код, който е по-лесен за четене и писане. Тези програми се превеждат в машинен код. Преводът може да се извърши на много етапи. Програмите на Java първо се оптимизират в байткод. След това се превеждат на машинен език, когато се използват.

Преден панел на ранен миникомпютър с превключватели за въвеждане на машинен код
Типични инструкции на машинния код
В един набор от инструкции обикновено се намират много видове инструкции:
- Аритметични операции: Събиране, изваждане, умножение, деление.
- Логически операции: Конюнкция, дизюнкция, отрицание.
- Операции, действащи върху единични битове: Преместване на битовете наляво или надясно.
- Операции, действащи върху паметта: копиране на стойност от един регистър в друг.
- Операции за сравняване на две стойности: по-голямо от, по-малко от, равно.
- Операции, които комбинират други операции: събиране, сравняване и копиране, ако са равни на някаква стойност (като една операция), прескачане до някаква точка в програмата, ако регистърът е нула.
- Операции, които действат върху потока на програмата: прескачане на някакъв адрес.
- Операции за преобразуване на типове данни: напр. преобразуване на 32-битово цяло число в 64-битово цяло число, преобразуване на стойност с плаваща запетая в цяло число (чрез съкращаване).
Много съвременни процесори използват микрокод за някои от командите. По-сложните команди обикновено го използват. Това често се прави при CISC архитектурите.
Инструкции
Всеки процесор или фамилия процесори има собствен набор от инструкции. Инструкциите са модели от битове, които съответстват на различни команди, които могат да бъдат подадени на машината. По този начин наборът от инструкции е специфичен за даден клас процесори, използващи (предимно) една и съща архитектура.
По-новите модели процесори често включват всички инструкции на предшественика си и могат да добавят допълнителни инструкции. Понякога по-новият дизайн прекратява или променя значението на даден код на инструкция (обикновено защото той е необходим за нови цели), което засяга съвместимостта на кода; дори почти напълно съвместими процесори могат да показват малко по-различно поведение за някои инструкции, но това рядко е проблем.
Системите могат да се различават и по други детайли, като например разположението на паметта, операционните системи или периферните устройства. Тъй като една програма обикновено разчита на такива фактори, различните системи обикновено не изпълняват един и същ машинен код, дори когато се използва един и същ тип процесор.
Повечето инструкции имат едно или повече полета за опкод. Те определят основния тип на инструкцията. Други полета могат да посочват типа на операндите, режима на адресиране и т.н. Може да има и специални инструкции, които се съдържат в самия опкод. Тези инструкции се наричат незабавни.
Проектите на процесори могат да се различават и по други начини. Различните инструкции могат да имат различна дължина. Също така те могат да имат еднаква дължина. Ако всички инструкции имат еднаква дължина, това може да опрости дизайна.
Пример
Архитектурата MIPS има инструкции с дължина 32 бита. Този раздел съдържа примери за код. Общият тип на инструкцията е в полето op (операция). Това са най-горните 6 бита. Инструкциите от тип J (скок) и I (незабавно действие) са изцяло дадени от op. Инструкциите от тип R (регистър) включват полето funct. То определя точната операция на кода. Полетата, използвани в тези типове, са:
6 5 5 5 5 6 бита [ op | rs | rt | rd |shamt| funct] R-тип [ op | rs | rt | address/immediate] I-тип [ op | target address ] J-типrs, rt и rd показват операндите на регистъра. shamt дава стойността на преместването. Полетата address или immediate съдържат директно операнд.
Пример: добавете регистрите 1 и 2. Поставете резултата в регистър 6. Той е кодиран:
[ op | rs | rt | rd |shamt| funct] 0 1 2 6 0 32 десетично 000000 00001 00010 00110 00000 100000 двоичноЗареждане на стойност в регистър 8. Вземете я от клетката на паметта 68 клетки след мястото, посочено в регистър 3:
[ op | rs | rt | address/immediate] 35 3 8 68 десетично 100011 00011 01000 00000 00001 000100 двоичноПреминаване към адреса 1024:
[ op | target address ] 2 1024 decimal 000010 00000 00000 00000 10000 000000 binaryСвързани страници
- Двоична бройна система
- Квантови компютри
- Набор от инструкции
- Компютър с намален набор инструкции
Въпроси и отговори
В: Какво е машинен код?
О: Машинният код е компютърна програма, написана на машинен език, използваща набора от инструкции на конкретна компютърна архитектура и обикновено се записва в двоичен вид.
В: Кое е най-ниското ниво на софтуера?
О: Машинният код е най-ниското ниво на софтуера.
В: Как се изпълняват други езици за програмиране от компютрите?
О: Другите езици за програмиране се превеждат в машинен код, който компютърът може да изпълнява.
В: От какво се състои една инструкция в машинния код?
О: Инструкцията в машинния код се състои от опкод (код на операцията) и операнд(и). Операндите обикновено са адреси на паметта или данни.
В: Какво представлява наборът от инструкции?
О: Наборът от инструкции е списък на операционните кодове, достъпни за компютъра.
В: Какво правят създателите на програми с кода?
О: Създателите на програми превръщат кода в друг език или машинен код.
В: Какво е другото име на машинния код?
О.: Машинният код понякога се нарича "native code" (роден код) и се използва, когато говорим за неща, които работят само на някои компютри.
обискирам