Asamblator (informatică)

Un asamblator (cunoscut și sub numele de asamblator ) este un program de calculator care traduce limbajul de asamblare în limbajul mașinii . Primul asamblator a fost scris de Nathaniel Rochester pentru un IBM 701 între 1948 și 1950 . Asamblatoarele sunt printre instrumentele utilizate de programatori .

Descriere

Tot mai multe programări la nivel de mașină - domeniul limbajului de asamblare - pot fi acum acoperite aproape complet de limbaje de programare la nivel înalt . Posibilitatea de a crea programe eficiente este compensată și de mentenabilitatea dificilă a programelor de asamblare. Pentru codul optim sunt necesare mai multe cunoștințe contextuale (de exemplu: utilizarea cache-ului, localitatea, utilizarea temporală etc.). Un exemplu în acest sens ar fi comanda SSE movntq , care, din lipsa cunoștințelor de context, nu poate fi utilizată de compilatoare sau poate fi utilizată doar foarte speculativ . Pe de altă parte, majoritatea compilatoarelor de limbaj la nivel înalt folosesc doar o mică parte din setul de instrucțiuni al procesorului (o caracteristică care a dus la dezvoltarea procesorelor RISC ), în timp ce programatorul de asamblare are setul complet de instrucțiuni disponibile, făcându-le mai eficiente în unele situații Pot folosi comenzi care nu sunt accesibile programatorului de limbaj pur la nivel înalt. Unele sisteme de programare pentru limbaje de programare la nivel înalt permit integrarea comenzilor în limbajul de asamblare în textul sursă folosind asamblorul inline . Aplicația poate fi apoi limitată la acele situații în care este necesar sau util să se programeze aproape de mașină din motive funcționale sau de eficiență . Trebuie remarcat faptul că diferite arhitecturi de procesor au limbaje de asamblare și mașini complet diferite, astfel încât este necesar un asamblator potrivit pentru arhitectura curentă și programele nu sunt portabile sau doar cu restricții mari . Asamblatoarele macro permit crearea de instrucțiuni parametrizabile . O instrucțiune macro este în general implementată în mai multe instrucțiuni mașină.

Diferențierea de compilatoarele de limbaj la nivel înalt

Asamblatoarele sunt întotdeauna specifice pentru unul sau câteva tipuri de procesoare. De exemplu, pentru arhitectura IA32 , limbajul de asamblare și limbajul de asamblare sunt complet diferite de cele pentru arhitectura MIPS . Unele compilatoare de limbaj la nivel înalt traduc mai întâi un program în limbaj de asamblare și apoi apelează un asamblator pentru a genera limbajul mașinii. În timp ce limbajele de nivel înalt sunt mai orientate către limbajul uman și, prin urmare, sunt relativ ușor de înțeles, limbajul de asamblare este strâns orientat spre mașină. În limbajul asamblării, codurile opționale și referința câmpurilor de date (cum ar fi add BETRAG,SUMME), așa-numitele mnemonice, corespund setului de instrucțiuni al procesorului respectiv ; înțelegerea sa este, prin urmare, o condiție prealabilă pentru asamblare. Pe de altă parte, într-un limbaj de nivel înalt, cu greu sau deloc nu trebuie să vă faceți griji cu privire la CPU-ul de bază. Cerințele complet diferite sunt făcute unui compilator pentru înregistrarea comportamentului de rulare al unui program, mai ales atunci când întâlnește funcții recursive sau când sunt generate cantități mari de cod sursă suplimentar (de exemplu, șabloane ) și, în unele cazuri, codul este deja executat în timpul compilării ( evaluarea funcției timp-compilare).

Deși simplificat și nu întotdeauna aplicabil, distincția este adesea văzută în faptul că un compilator convertește instrucțiunile individuale din textul sursă în mai multe instrucțiuni ale mașinii, în timp ce un asamblator folosește de obicei o mapare unu-la-unu.

Sarcini de asamblare

  • Implementarea mnemonicilor de comandă în instrucțiunea unui limbaj de asamblare - de exemplu codul de comandă "CLI" în codul de comandă "11111010" ('FA' hexazecimal) a unui limbaj de mașină
  • Conversia mnemonică a datelor în reprezentarea lor binară - de exemplu „SUMA” în adresă = 4711 și lungime = 8
  • Managementul constantelor
  • Gestionarea adreselor de comenzi sau date
  • Calculul constantelor fixate la momentul compilării mov eax, 4 * 5 + 6 * 7 + OFFSET ProgrammStart
  • Ignorarea comentariilor în timpul generării codului
  • Includeți alte fișiere de coduri ale programului
  • Interpretează și transformă codul macro
  • Traducere condiționată
  • Pachet de date conexe (de exemplu, date numai în citire)
  • Respingerea instrucțiunilor nu este permisă pentru acest procesor sau mod
  • Integrarea informațiilor de depanare sau a altor metadate
  • Crearea listelor de traduceri
  • Generarea codului mașinii, dacă este necesar ca fișiere obiect pentru procesele de traducere în două etape cu linkere și posibilitatea de a integra alte părți ale programului (de exemplu, subrutine ) din biblioteci

Forme speciale

Asamblator transversal

Un asamblator încrucișat este o formă specială de asamblare care rulează pe o platformă computer H (gazdă) și generează codul mașinii pentru o altă platformă computer T (țintă). Acest lucru îl face un compilator special încrucișat . Asamblatoarele încrucișate sunt utilizate în principal astăzi în dezvoltarea sistemelor încorporate pentru a crea coduri rapide și compacte pentru microcontrolere și DSP-uri . Un exemplu este ASEM-51 , care rulează pe platformele gazdă MS-DOS , Windows și Linux . Acesta generează cod pentru familia de microcontrolere MCS-51 de la Intel (platformă țintă).

Dezasamblator

Un program pentru traducerea limbajului mașinii înapoi în limbajul de asamblare se numește dezasamblator . Această traducere înapoi este posibilă pentru că - spre deosebire de limbile de nivel înalt  - există o relație unu-la-unu între limbajul de asamblare simplu și limbajul mașinii. Cu toate acestea, identificatorii și comentariile nu pot fi restaurate deoarece sunt pierdute în timpul asamblării. Majoritatea limbajelor de asamblare sunt completate de funcționalități macro, astfel încât această mapare directă este posibilă doar parțial.

Monitor de limbaj automat

Pe unele platforme există o versiune foarte simplă a unui asamblator, combinată cu capacitatea de a testa și analiza interactiv programe, numită monitor de limbaj mașină .

Producători și produse

Microsoft Macro Assembler ( MASM ), Borland Turbo Assembler (TASM) și Netwide Assembler (NASM) sunt utilizate pe scară largă pentru familia de procesoare x86 și procesoare compatibile (de exemplu, Pentium Intel sau Athlon AMD ) . Asamblatorul plat ( FASM ) oferă, de asemenea, multe caracteristici de care are nevoie un asamblator modern. În cele din urmă, Yasm este o rescriere din NASM sub licență BSD . În plus față de asamblatoarele care cunosc sintaxa Intel , există și cei care pot asambla codul asamblătorului în sintaxa AT&T , cum ar fi asamblatorul GNU (GAS), care este utilizat în principal sub Linux . De la versiunea 2.10, GAS acceptă și sintaxa Intel prin directiva .intel_syntax . Pe IBM - mainframe ( System z ) este High Level Assembler folosit Hercules - utilizatorii trebuie fie să fie depășiți asamblorul de asamblare F, fie utilizează asamblatorul moștenit Tachyon , care rulează sub Linux pentru z / Series . Pentru familia de microcontrolere MCS-51 de la Intel, primul reprezentant al acestuia a fost 8051 , există macro-asamblorul ASEM-51 gratuit. Astăzi există deja sute de 8051 derivate de la peste 50 de producători de semiconductori .

Link-uri web

Wikibooks: Programare asamblare pentru procesoare x86  - materiale de învățare și predare

Dovezi individuale

  1. DIN  44300.
  2. Peter Calingaert: asamblator, compilatoare și traducere de programe. Computer Science Press, Potomac, MD, 1979. ISBN 0-914894-23-4 . Pp. 186-187
  3. Ram Narayam: asamblori Linux: o comparație între GAS și NASM . 17 octombrie 2007. Adus pe 2 iulie 2008.
  4. Randall Hyde: Care asamblator este cel mai bun? . Adus la 18 mai 2008.
  5. GNU Assembler News, v2.1 acceptă sintaxa Intel . 4 aprilie 2008. Adus pe 2 iulie 2008.