Mihiztadura-lengoaia

thumb
**Mihiztadura-lengoaia** ( eta ***ASM*** laburdura) edo **mihiztatzailea** informatikako behe-mailako programazio-lengoaia sinbolikoa da. 

Lengoaia honetan idatzitako agindu bakoitzetik makina-lengoaiako agindu bakarra sortzen da gero. Prozesadorearen oinarrizko agindu mota bakoitza (makina-lengoaiako agindu bakoitza)  izen mnemotekniko baten bidez adierazten da, ez kode bitarrean makina-lengoaian bezala; zenbakiak digitu hamartarrekin idazten dira, ez kode bitarrean makina-lengoaian bezala. Mihiztadura-lengoaiazko aginduen eta makina-kodezko aginduen arteko korrespondentzia zuzena da, ia erabatekoa. Hala, prozesadore-arkitektura bakoitzak bere mihiztadura-lengoaia du, goi-mailako programazio-lengoaia gehienek ez bezala. Goi mailako lengoaia horiek hainbat arkitekturaren artean eramangarriak izan ohi dira, baina, interpretatu edo konpilatu egin behar dira.

Mihiztatzaile izeneko programa bat erabiltzen da mihiztadura-lengoaiaren sententziak ordenagailuaren makina-kodera itzultzeko. Mihiztatzaileak erraz itzultzen ditu aginduen izen mnemonikoak makina-lengoaiako aginduetara (kode bitarrean), eta berdin aginduetan azaltzen diren datuekin. Hori goi-mailako lengoaiekin kontrastean dago, non agindu bakoitzerako gehienetan makina-ĺengoaiazko agindu asko sortuko dira konpilazioan.

Mihiztatzaile sofistikatu askok mekanismo gehigarriak eskaintzen dituzte programak errazago garatzeko, mihiztatze-prozesua kontrolatzeko eta arazketa-laguntza emateko. Mihiztatzaile moderno gehienek makroak definitzeko erraztasuna eskaintzen dute (beherago deskribatua), eta makro mihiztatzaile deitzen zaie.

Historikoki, softwarearen garapeneko hasierako urteetan erabili zen mihiztadura-lengoaia, batez ere. Artean goi-mailako lengoaia indartsurik ez zegoenean eta konputagailuen baliabideak oso mugatuak izaten zirenean. Gaur egun, maiz erabiltzen da giro akademikoan eta ikerketetan, batez ere hardwarea zuzenean manipulatu behar denean, errendimendu handia behar denean edo baliabide kontrolatuak eta murriztuak erabili behar direnean. Gailu-kontrolagailuen garapenean (ingelesez, *device drivers*) eta sistema eragileen garapenean ere erabiltzen da, makina-aginduetara zuzenean sartu behar delako. Gailu programagarri askok (mikrokontrolatzaileak, esaterako) oraindik mihiztatzailea erabiltzea dute aldaketak egiteko modu bakarra.

## Historia 
Mihiztadura-lengoaiaren kode baten lehen bertsioa 1947ko *Coding for A.R.C.* obran dago, Kathleen Booth eta Andrew Donald Booth bikote matematikariak sortua.

Mihiztadura-lengoaiak, bigarren belaunaldiko lengoaiatzat hartzen direnak, 1950eko hamarkadan sortu ziren. Lehen belaunaldiko lengoaiekin konparatuta zuten erraztasuna begi-bistakoa zen. Ez zen gauza bera gogoratzea *10110000 01100001* (makina-lengoaiaz) eta *MOV AL*, 0x61 (mihiztadura-lengoaia).

Hasieran, mihiztadura-lengoaiatik makina-lengoaiarako itzulpena eskuz egin behar zen, baina laster agertu ziren itzulpen-programak (neurri batean, itzultzea oso mekanikoa eta erraza zelako). Aurrerago, lengoaia bi horietan programatzea eia guztiz baztertuta geratu zen hirugarren belaunaldiko lengoaiak ageri zirelako, programen konplexutasuna eta makinaren arkitekturaren menpekotasuna murrizten baitzuten.

Eragozpen nagusiak hauek ziren:

* Programa zenbat eta handiagoa izan, orduan eta handiagoa da konplexutasuna.
* Prozesadorearen arkitekturaren mende dago.

Haren abantaila nagusia egikaritze-eraginkortasuna da.

Mihiztadura-lengoaiak 1950ean garatu ziren lehen aldiz, bigarren belaunaldiko programazio-lengoaia gisa aipatu zirenean. Adibidez, SOAP (*Symbolic Optimal Assembly program*) 1957ko IBM 650 konputagailuaren mihiztadura-lengoaia zen. Mihiztadura-lengoaiek asko murriztu zituzten huts egiteko joera eta lehen belaunaldiko lengoaiekin programatzeko denbora, lehen ordenagailuekin behar baitzen, eta programatzaileak zenbaki-kodeen eta helbide-kalkuluen aspergarrietatik askatu zituzten. Denbora batez asko erabili ziren mota guztietako programazioetarako. Hala ere, 1980ko hamarkadan (1990koan mikrokonputagailuen kasuan), goi mailako lengoaiek ordeztu zituzten, programazioan produktibitate hobea lortzen baitzen.

Gaur egun, mihiztadura-lengoaiak nagusiki programa konpiladoreek kudeatzen eta sortzen dituzten arren, oraindik erabiltzen dira hardwarea zuzenean manipulatu behar denean, prozesadorearen agindu espezializatuetarako sarbidea emateko edo jarduera kritikoko arazoak konpontzeko. Ohiko erabilerak gailu, maila txikiko sistema txertatu eta denbora errealeko sistemetako kontroladoreak eta *driverrak* dira.

Historikoki, programa asko idatzi dira mihiztadura-lengoaiaz. Sistema eragileak mihiztadura-lengoaiaz soilik idatzi ziren, 1970ean eta 1980aren hasieran C programazio-lengoaia guztiz onartua izan zen  arte. Gainera, aplikazio komertzial asko mihiztadura-lengoaiaz idatzi ziren, IBMren mainframe-etarako korporazio handiek idatzitako software kopuru handi bat barne.
* **Mikromihiztatzaile** bat programa bat da, *firmware* izeneko mikroprograma bat prestatzen laguntzen duena, ordenagailu baten behe-mailako funtzionamendua kontrolatzeko.
* **Meta-mihiztatzaile** bat "mihiztadura-lengoaia baten deskribapen sintaktikoa eta semantikoa onartzen duen eta horrekin lengoaia horretarako mihiztatzaile bat sortzen duen programa" da,  edo mihiztadura- lengoaiazko iturburu-fitxategi bat onartzen du deskribapen sintaktiko-semantiko horrekin batera, eta deskribapen horren arabera muntatzen du iturburu-fitxategia azkenean makina-lengoaiazko objektu programa lortzeko. SDS 9 serieko eta SDS Sigma-serieko konputagailuetarako  "Metad-Symbol" mihiztatzaileak  meta-mihiztatzaileak dira. Sperry Univac-ek ere UNIVAC 1100/2200 serierako meta-mihiztatzaile bat eman zuen.
* **Lineako mihiztatzaile** bat (**inline mihiztatzaile** edo **mihiztatzaile txertatu**, ere bai) mihiztatze-kode bat da, goi-mailako hizkuntza-programa batean txertatuta dagoena. Horrelakoak hardwarerako zuzeneko sarbidea behar duten sistema-programetan erabiltzen dira gehienetan.

## Funtsezko kontzeptuak 
#### Mihiztatzailea 
Mihiztatzaile-programa batek objektu-kodea sortzen du, mnesika- eta sintaxi-konbinazioak itzuliz, eragiketa eta norabide-moduetarako, zenbaki-balioetan. Adierazpen horrek, normalean, operazio-kode bat ("opcode") eta beste kontrol-bit eta datu batzuk ditu. Mihiztatzaileak ere adierazpen konstanteak kalkulatzen ditu, eta izen sinbolikoak ebazten ditu memoriako eta bestelako erakundeetarako. Erreferentzia sinbolikoak erabiltzea mihiztatzaileen funtsezko ezaugarria da, programa aldatu ondoren kalkulu aspergarriak eta eskuzko helbideen eguneratzeak saihestuz. Mihiztatzaile gehienek badituzte, halaber, testu-ordezkapena – e.g. egiteko instalazio makroak, jarraibide-sekuentzia labur komunak (inline, adibidez) sortzeko, azpirrutina deritzenen ordez.

Zenbait mihiztatzailek ere egin ditzakete instrukzio-ekipoaren berariazko optimizazio-mota sinple batzuk. Horren adibide zehatz bat hornitzaile batzuen x86 mihiztatzaile nonahikoak izan daitezke. Dimentsionatzean, horietako gehienek komando-instrukzioko ordezkapenak egin ditzakete (jauzi luzeak, jauzi labur edo erlatiboen ordez) edozein emanalditan, hala eskatuta. Beste batzuek, gainera, jarraibideak berrantolatu edo txerta ditzakete, hala nola RISC arkitekturetarako mihiztatzaile batzuk, PUZaren hodia ahalik eta modurik eraginkorrenean ustiatzeko zentzuzko jarraibideen programazioa optimizatzen lagun dezaketenak.

Mihiztatzaileak hasieratik daude eskuragarri, makinaren lengoaiaren gainetik eta goi-mailako programazio-lengoaien aurretik, hala nola Fortran, Algol, COBOL eta Lisp. Zenbait itzultzaile-mota eta kode erdiautomatikoen sorgailu ere izan dira, muntaketako eta goi-mailako hizkuntzen antzeko ezaugarriak dituztenak, eta Speedcode da adibiderik ezagunenetako bat.

CPU jakin baterako sintaxi desberdina duten zenbait mihiztatzaile egon daitezke, edo jarraibideen multzoaren arkitektura. Adibidez, x86 familia-prozesadore batean erregistro bati memoria-datuak gehitzeko instrukzio batek eax,[ebx] gehi lezake *Intelen* jatorrizko sintaxian; hori, berriz, addl (%ebx),%eax GNU mihiztatzaileak erabiltzen duen AT&T sintaxian. Itxura desberdinak izan arren, forma sintaktikoek zenbakizko makinaren kode bera sortzen dute. Mihiztatzaile bakar batek modu desberdinak izan ditzake forma sintaktikoen aldaketak eta interpretazio semantiko zehatzak (adibidez, FASMsyntax, TASMsyntax, modu ideala, etab., x86 muntaketa-programazioaren kasu berezian) bultzatzeko.

#### Ziklo kopurua 
Bi mihiztatzaile mota daude, iturritik zenbat pasatzen diren oinarri dutenak (zenbat aldiz irakurtzen duen mihiztatzaileak iturria) objektuaren artxiboa sortzeko.

* **Urrats** bateko mihiztatzaileek iturburu-kodea behin prozesatzen dute.  Definitu aurretik erabilitako ikurren kasuan, mihiztatzaileak "errata" emango du azken definizioaren ondoren, eta oraindik definitu gabeko ikurrak non erabili diren esango dio linkerrari edo kargagailuari.
* Urrats anitzeko mihiztatzaileek taula bat sortzen dute, lehenengo emanaldietan sinbolo guztiak eta haien balioak dituena, eta, ondoren, taula erabiltzen dute kodea sortzeko.

Bi kasuetan, mihiztatzaileak hasierako urratsetan jarraibide bakoitzaren tamaina zehaztu behar du, ondorengo ikurren helbideak kalkulatzeko. Horrek esan nahi du, baldin eta ondoren zehaztutako eragigai bati dagokion eragiketa baten tamaina eragigaiaren motaren edo distantziaren araberakoa bada, mihiztatzaileak zenbatespen ezkorra egingo duela lehenengo eragiketarekin dagoenean, eta, beharrezkoa bada, bat edo gehiagorekin lotuko duela. "eragiketarik gabeko" jarraibideak, atzeko pasabide batean edo akatsetan. Peephole optimizazioa duen mihiztatzaile batean, helbideak birkalkula daitezke paseen artean, kode ezkorra helburuaren distantzia zehatzera egokitutako kode batekin ordezteko.

Urrats bateko mihiztatzaileak erabiltzeko arrazoi nagusia memoriaren tamaina eta muntaketa-abiadura izan ziren - sarritan, bigarren urrats batek eskatzen du sinboloen taula memorian gordetzea (zuzeneko erreferentziak erabiltzeko), programaren iturria zintan biribiltzea eta berriz irakurtzea, edo paper zulatuko txartel- edo zinta-estalki bat berriz irakurtzea. Memoria askoz handiagoak zituzten atzeko ordenagailuek (bereziki diskoen biltegiratzeak), irakurketa hori gabe beharrezko prozesamendu guztia egiteko lekua zuten. Mihiztatzaile multipasoaren abantaila da erratarik ez izateak lotura-prozesua (edo programaren karga, mihiztatzaileak zuzenean kode exekutagarria sortzen badu) azkarragoa izatea eragiten duela.

**Adibidea**: hurrengo kode-zatian, urrats baten mihiztatzaile batek S2 aitorpena mihiztatzean BKWD atzeko erreferentziaren norabidea zehaztu lezake, baina ezin izango luke FWD aurreko erreferentziaren helbidea zehaztu S1 adarraren deklarazioa mihiztatzean; izan ere, FWD mugagabea izan daiteke. Bi paseko mihiztatzaile batek bi helbideak 1. pasean zehaztuko lituzke; beraz, 2. pasean kodea sortzean ezagutuko lirateke.
```
S1 B FWD
...
FWD EQU *
...
BKWD EQU *
...
S2 B BKWD
```

#### Goi-mailako mihiztatzaileak 
Goi-mailako mihiztatzaile sofistikatuenek hizkuntzaren abstrakzioak eskaintzen dituzte, hala nola:

* Goi-mailako prozeduren/funtzioen adierazpenak eta eskaerak
* Kontrol-egitura aurreratuak (IF/THEN/ELSE, SWITCH)
* Goi-mailako datu abstraktu motak, egiturak/erregistroak, sindikatuak, klaseak eta multzoak barne
* Makroaren prozesamendu sofistikatua (hala ere, ohiko mihiztagailuetan erabilgarri dago denboren amaieratik, IBM 700 serietik eta IBM 7000 serietik, eta 1960tik aurrera IBM System/360 (S/360), besteak beste.
* Programazio objektiboaren ezaugarriak, hala nola motak, objektuak, abstrakzioa, polimorfismoa eta herentzia.

#### Mihiztadura-lengoaia 
Mihiztadura-lengoaiaz idatzitako programa batean prozesadore-aginduei dagozkien hainbat mnemoniko eta meta-agindu agertzen dira (eragiketak, zuzentarauak (directives), sasi-aginduak, eta sasi-eragiketak), iruzkinak eta datuak. Mihiztatadura-lengoaietan agertzen diren aginduak, oro har, opcode mnemonic bat (agindu baten kodea) eta eragigai bat izaten dira. Eragigaia zenbait datu, argumentu edo parametro dituen zerrenda bat izan daiteke. Agindu batzuetan "inplizitu" egon daitezke eragigaiak; instrukzio horrek ez du eskatzen eragigairik. Programa mihiztatzaileak agindu horietako bakoitza memorian kargatu eta exekutatu daitekeen makina-lengoaiako agindu bihurtzen du .
```nasm
MOV EAX, [EBX]	  ; Move the 4 bytes in memory at the address contained in EBX into EAX
MOV [ESI+EAX], CL ; Move the contents of CL into the byte at address ESI+EAX
MOV DS, DX        ; Move the contents of DX into segment register DS
```
Kasu bakoitzean, mihiztatzaileak diferente itzultzen du  MOV mnemonikoa 88-8C, 8E, A0-A3, B0-BF, C6 edo C7 eragiketa-kodearekin batera azaltzen direnean, eta programatzaileak normalean ez du zertan jakin eta gogoratu nola egin hori.

## Lengoaiaren diseinua 
Konputagailuaren arkitekturaren arabera makina-lengoaia desberdina denez gero mihiztadura-lengoaia ere desberdinak izango dira. Historikoki *IBM System/360* sistemarena izan zen hedatuena, baina hori aldatzen joan da eta gaur egun ohikoenak  ARM, MIPS, Intel x86 eta RISC dira. 

Edozein kasutan lengoaia horiek ezaugarri komunak dituzte diseinuaren ikuspuntutik.

### Formatua 
Idatzi beharreko sententziak edo aginduak hiru motakoak dira:

* Aginduak: exekutatzera joango diren sententziak dira, eta besteak beste eragiketa-kode bat dute agindua adierazteko.
* Datuen definizioa edo erazagupena: aginduetan parte hartzen dituzten datuak modu sinbolikoan (etiketa batez) defini daitezke, gero aginduak irakurgarriagoak izan daitezen.
* Mihiztatze-direktibak: mihiztatze-prozesua gidatzeko sententziak dira, mihiztatzailearen lana modulatzeko.

Aginduak izango dira programaren lerro nagusiak, eta bertan agertu ohi diren elementuak ondokoak izan daitezke:

* Eragiketa-kodea: exekutatu beharreko eragiketa zehazten du: aritmetikoa, logikoak, konparaketa, jauzia...
* Eragigaiak: eragiketan parte hartzen duten elementuak dira. Eragiketa gehienetan datuak dira (erregistro orokorrak, memoriako posizioak, konstante zenbakizkoak edo alfabetikoak, datuetako etiketak... Batzuetan, Jauzietan batez ere, programaren posizio bat izan daiteke.
* Etiketa: aginduei izen sinboliko bat esleitzeko modua da eta aginduaren ezkerraldean zehaztu ohi da. Aginduetako etiketa horiek Jauzietan erabili ohi dira.

### Adibideak 
Intel x86 lengoaian oinarritutako lehen adibideak
 MOV AL, 1h        ; Kargatu AL erregistroan 1 balioa
 MOV CL, 2h        ; Kargatu CL erregistroan 2 balioa
 MOV DL, 3h        ; Kargatu DL erregistroan 3 balioa
Erregistroak eta konstanteez gain eragigai sofistikatuagoak erabil daitezke
 MOV EAX, [EBX]	  ; Eraman EAXra EBXn gordetako helbideko 4 byteak, memoriakoak
 MOV [ESI+EAX], CL ; Eraman ESI+EAX helbidera CL erregistroaren edukia  

### Mihiztatzaile motak 
Hiru mihiztatzaile mota bereiz ditzakegu:

* **Oinarrizko mihiztatzailea**. Oso maila baxukoak dira, eta funtsean beraien lana instrukzio, parametro eta helbideak ezartzeko moduei izen sinbolikoak ezartzea da. Gainera, zuzentarau batzuk ezagutzen ditu non mihiztatzailearen zenbait parametroen funtzionamendua adierazten den.

* **Mihiztatzaile modularra** edo **makro-mihiztatzailea**. Oinarrizko mihiztatzaileen ondorengoak, oso hedatuak izan ziren 50. eta 60. hamarkadetan, maila altuko lengoaia zabaldua izan aurretik. Mihiztatzaile batek egin dezakeen guztia egiteaz gain, zuzentarau batzuk dauzka bere baitan makroinstrukzioak definitu eta gauzatzeko.

* **32 bit-eko mihiztatzaile modularra** edo **maila altuko mihiztatzailea**. 32 bits zituzten prozesatzaileen arkitektura berrien sorrera erantzuna emanez sortu ziren. Beraietako askok atzera egiteko gaitasuna dute eta 16 bits-eko estruktura duten programekin ere lan egin dezakete. Honela, aurrekoek egin ditzaketen gauzak egin ditzake, makroinstrukzioak erabili esaterako, eta gainera programazio estruktura konplexuagoak erabiltzea ahalbidetzen du, maila altuko lengoaien berezkoa.

## Erreferentziak 
## Ikus, gainera 
* Makina lengoaia

## Kanpo estekak