Codul mașinii

Codul mașinii ( codul orientat pe platformă ), limbajul mașinii  - un sistem de comenzi (un set de coduri de operare) ale unui anumit computer , care este interpretat direct de procesorul sau firmware -ul acestui computer. [unu]

Un program de calculator scris în limbajul mașinii constă din instrucțiuni de mașină , fiecare dintre acestea fiind reprezentată în codul mașinii sub forma unui așa-numit. opcode  - codul binar al unei singure operații din sistemul de comandă al mașinii. Pentru comoditatea de programare , în loc de codurile operaționale numerice, care sunt înțelese doar de procesor, se folosesc de obicei mnemonicile lor alfabetice condiționate . Un set de astfel de mnemonice, împreună cu unele caracteristici suplimentare (de exemplu, unele macrocomenzi, directive ), se numește limbaj de asamblare .

Fiecare model de procesor are propriul set de instrucțiuni, deși în multe modele aceste seturi de instrucțiuni se suprapun foarte mult. Se spune că procesorul A este compatibil cu procesorul B dacă procesorul A „înțelege” pe deplin codul de mașină al procesorului B. Dacă procesoarele A și B au un subset de instrucțiuni pentru care sunt compatibile reciproc, atunci se spune că sunt de aceeași „arhitectură” (au aceeași arhitectură de set de instrucțiuni ).

Instruirea mașinii

Fiecare instrucțiune de mașină efectuează o acțiune specifică, cum ar fi o operație asupra datelor (de exemplu, adăugarea sau copierea unui cuvânt de mașină într-un registru sau în memorie ) sau săritul la o altă bucată de cod (schimbarea ordinii de execuție; în acest caz, saltul poate fi necondiționat sau condiționat , în funcție de rezultatele instrucțiunilor anterioare). Orice program executabil constă dintr-o secvență de astfel de operațiuni ale mașinii atomice.

Operațiile scrise ca o singură instrucțiune de mașină pot fi împărțite în „simple” ( operații elementare ) și „complexe”. În plus, majoritatea procesoarelor moderne constau din „actuatoare” separate - unități de calcul care pot efectua doar un set limitat de operații simple. Când următoarea instrucțiune este executată, un bloc special al procesorului - decodorul - îl traduce (decodifică) într-o secvență de operații elementare înțelese de dispozitivele executive specifice.

Arhitectura setului de instrucțiuni al procesorului determină ce operații poate efectua și ce instrucțiuni de mașină corespund căror opcode numerice ( opcodes). Opcode-urile sunt de lungime constantă (pentru arhitecturi RISC -, MISC - ) și interval (pentru arhitecturi CISC ; de exemplu: pentru arhitectura x86 , comanda are o lungime de la 8 la 120 de biți).

Procesoarele superscalare moderne sunt capabile să execute mai multe instrucțiuni ale mașinii într-un singur ciclu de ceas .

Codul mașinii ca limbaj de programare

Codul mașinii poate fi văzut ca un limbaj de programare primitiv sau ca reprezentarea de cel mai jos nivel a programelor de calculator compilate sau asamblate . Deși este posibil să scrieți programe direct în codul mașinii, acest lucru se face acum rar din cauza greutății codului și a laboriozității gestionării manuale a resurselor procesorului, cu excepția situațiilor în care este necesară o optimizare extremă . Prin urmare, marea majoritate a programelor sunt scrise în limbi de nivel superior și traduse în codul mașinii de către compilatori . Codul de mașină este uneori denumit cod nativ ( numit și cod nativ ) atunci când se vorbește despre părți ale unei limbi sau  biblioteci specifice platformei . [2] 

Programele în limbaje interpretate (cum ar fi Basic sau Python ) nu sunt traduse în codul mașinii; în schimb, acestea sunt fie executate direct de interpretul de limbă, fie traduse în pseudocod ( bytecode ). Cu toate acestea, interpreții acestor limbi (care pot fi considerați procesoare) sunt în general reprezentați în codul mașinii.

Microcod

În unele arhitecturi de computer , suportul pentru codul mașinii este furnizat de un nivel chiar de nivel inferior de programe numit firmware . Acest lucru face posibilă furnizarea unei singure interfețe în limbaj mașină pentru întreaga linie sau familie de calculatoare, care pot avea diferențe structurale semnificative între ele și facilitează transferul de programe în codul mașinii între diferite modele de computer. Un exemplu al acestei abordări este familia de calculatoare IBM System/360 și succesorii acestora: în ciuda magistralelor diferite de la 8 la 64 de biți și mai mult, ele împărtășesc totuși o arhitectură comună la nivel de limbaj mașină.

Utilizarea unui strat de microcod pentru a implementa un emulator permite unui computer să reprezinte arhitectura unui computer complet diferit. În linia System/360, aceasta a fost folosită pentru a porta programe de pe mașinile IBM anterioare către noua familie - de exemplu, emulatorul IBM 1401/1440/1460 pe IBM S/360 model 40.

Cod absolut și independent de poziție

Cod absolut ( cod absolut în engleză  ) - cod de program potrivit pentru execuția directă de către procesor [1] , adică cod care nu necesită procesare suplimentară (de exemplu, rezolvarea legăturilor dintre diferite părți ale codului sau legarea de adrese din memorie, efectuată de obicei de încărcătorul de programe ). Exemple de cod absolut sunt fișierele executabile în format .COM și un încărcător de sistem de operare situat în MBR . Adesea, codul absolut este înțeles într-un sens mai restrâns ca cod dependent de poziție (adică cod legat de adrese de memorie specifice).

Codul independent de poziție este un program  care poate fi plasat în orice zonă de memorie, deoarece toate referințele la celulele de memorie din acesta sunt relative (de exemplu, relativ la contorul de program ). Un astfel de program poate fi mutat în altă zonă de memorie în orice moment, spre deosebire de un program relocabil , care, deși poate fi încărcat în orice zonă de memorie, trebuie să rămână în același loc după încărcare. [unu]

Capacitatea de a crea cod independent de poziție depinde de arhitectura și setul de instrucțiuni ale platformei țintă. De exemplu, dacă toate instrucțiunile de salt dintr-un set de instrucțiuni trebuie să specifice adrese absolute, atunci codul care necesită sărituri este aproape imposibil de făcut independent de poziție. În arhitectura x86 , adresarea directă în instrucțiunile de date este reprezentată doar de adrese absolute, dar deoarece adresele de date sunt considerate relativ la registrul de segment , care poate fi schimbat în orice moment, acest lucru vă permite să creați cod independent de poziție cu propria memorie. locații pentru date. În plus, unele restricții ale setului de instrucțiuni pot fi ridicate cu cod auto-modificabil sau secvențe de instrucțiuni non-triviale.

Programul „Bună, lume!”

Bună lume! » pentru un procesor x86 ( MS DOS , ieșire folosind întreruperea BIOS int 10h) este după cum urmează (în notație hexazecimală ):

BB 11 01 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

Acest program funcționează când este plasat la offset 100 16 . Instrucțiunile individuale sunt evidențiate cu culoare:

Același cod în comenzile de asamblare :

XXXX:0100 mov bx, 0111h  ; pune în bx offset-ul șirului HW XXXX:0103 mov cx, 000Dh  ; pune in cx lungimea sirului HW XXXX:0106 mov ah, 0Eh  ; introduceți ah funcția de întrerupere numărul 10h XXXX:0108 mov al, [bx]  ; introduceți în toată valoarea locației de memorie a cărei adresă este în bx XXXX:010A inc cutie  ; treceți la următorul octet al șirului (incrementare compensată cu 1) XXXX:010B int 10h  ; întrerupe apelul 10h XXXX:010D bucla 0108  ; micșorați cx cu 1 și dacă rezultat≠0, treceți la adresa 0108 XXXX:010F int 20h  ; întrerupere 20h: termina programul XXXX:0111 HW db „Bună, lume!”  ; șirul de tipărit

Vezi și

Note

  1. 1 2 3 Dicţionar explicativ de sisteme de calcul = Dicţionar de calcul / Ed. V. Illingworth şi alţii: Per. din engleza. A. K. Belotsky și alții; Ed. E. K. Maslovsky. - M . : Mashinostroenie, 1990. - 560 p. - 70.000 de exemplare (suplimentare).  - ISBN 5-217-00617-X (URSS), ISBN 0-19-853913-4 (Marea Britanie).
  2. Kate Gregory. Gestionat, negestionat, nativ: ce fel de cod este acesta? (28 aprilie 2003). Preluat la 27 martie 2012. Arhivat din original la 30 mai 2012.