Mihiztadura-lengoaia (ingelesez *assembly language* 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.lengoaiako aginduen eta makina-kodearen aginduen arteko korrespondentzia zuzena da, ia erabatekoa. Hala, prozesadore-arkitektura bakoitzak bere mihiztatze-lengoaia du, goi-mailako programazio-lengoaia gehienek ez bezala. Hizkuntza horiek hainbat arkitekturaren artean eramangarriak izan ohi dira, baina, interpretatu edo konpilatu egin behar dira.

| Agindua MIPS mihiztadura-
lengoaian | Agindua MIPS makina-lengoaian | Adibidearen azalpena |
| --- | --- | --- |
| **addi** $s2, $t8, **37** | **001000** 11000 10010 **0000 0000 0010 0101** | ***addi*** operazioaren kodea '001000' da (batuketa bat egitea.
**37** da batu behar den balioa ('0000 0000 0010 0101') |

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 bakar batek normal bat makina-ĺengoaiako agindu asko ematbihurtu ohi da.

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

Batez ere softwarearen garapeneko hasieran erabili zen mihiztadura-lengoaia, historikoki. 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.

Ezaugarriak
-----------

Mihiztagailuan idatzitako programak antzekoak dira objektu-fitxategietan, mihiztatze-programa bat erabiliz. Ondoren, fitxategi hori estekatze-programa baten bidez lotzen da objektu izan daitezkeen beste liburu-denda edo fitxategi batzuekin, exekutagarri bat osatuz. Normalean, programa mihiztatzaileak gai dira exekutagarriak lotzeko, edo zeregin hori gauzatzeko programa estekatzaile batekin batera datoz.

Mota horretako hizkuntzak sortzeko helburua programak errazago idaztea da, zuzenean kode bitarrean idaztea ezinezkoa baita. Kode hori da ordenagailuak asimilatzen duen kode bakarra. Hizkuntzak lotura estua du programa gauzatzen den arkitekturarekin.

Mihiztatze-lengoaiak parekatzearen eta beste edozein hizkuntza konpilatzearen artean bereiztea askoz errazagoa da, izan ere, mihiztatze-programa askoz ere errazagoa da; izan ere, kasurik sinpleenetan, hashtag-ak kode bitarretik itzuli besterik ez du egin behar, eta, horrez gain, konpiladoreak askoz ere konplexuagoak dira, hizkuntza askoz hurbilago bat interpretatu behar baitute, hizkuntza sintaktikoaren teoria gisa askoz tresna matematiko konplexuagoak behar baitituzte.

Bestalde, **mihiztatzaile** bat (ingelesezko assembler-etik datorrena) mihiztatzaile-lengoaia batean idatzitako iturburu-kode sinboliko hori itzultzeaz arduratzen den programa informatikoan dago, makina-kodeak duen fitxategian, eta kode hori sortu duen mikroprozesadoreak zuzenean exekuta dezake. Mihiztadura-lengoaietatik abiatuta programazio-lengoaien bilakaerak programa mihiztatzaile horien bilakaera eragin zuen, gaur egun konpilatzaile gisa ezagutzen den bera egiten baitzuten. Programak mihiztatzaile-lengoaian idatzitako fitxategia irakurtzen du, eta sistema bitarrean agertzen den mnemotekniko bakoitzaren ordez, mihiztatzailearen aukera espezifikoetan helburu gisa aukeratu zen plataforma erabiltzen du.

Mihiztagailuko iturburu-kodeen fitxategiak ASCII testu-fitxategiak dira, eta luzapena izaten dute.**ASM**

* Mihiztatzaile-lengoaian idatzitako kodeak ulertzeko zailtasun pixka bat du, bere egitura makinaren hizkuntzaren antzekoa baita, hau da, maila txikiko lengoaia.
* Mihiztatze-lengoaia oso eramangarria da, hau da, mikroprozesadore batentzat idatzitako kode bat aldatu egin behar izan daiteke beste makina batean erabiltzeko. Arkitektura desberdina duen makina batera aldatzean, oro har, erabat berridatzi behar izaten da.
* Mihiztatze-lengoaia batean aditua den programatzaile batek egindako programak askoz azkarragoak izaten dira, eta sistemaren baliabide gutxiago kontsumitzen dute (RAM memoria eta ROM) goi-mailako lengoaia batetik konpilatutako programa baliokideak baino. Mihiztatze-lengoaian sendaketa handiz programatzean, azkarrago exekutatzen diren eta goi-mailako lengoaiarekin baino leku gutxiago hartzen duten programak sor daitezke.
* Mihiztatze-lengoaia baten bidez, oso zehatz kontrolatzen dira mikroprozesadore batek egiten dituen lanak, eta, horren bidez, goi-mailako lengoaian programatzeko zailak eta/edo ez-eraginkorrak diren kode-segmentuak sor daitezke; izan ere, besteak beste, mihiztatze-lengoaian PUZaren jarraibideak daude, normalean goi-mailako lengoaietan eskuragarri ez daudenak.
* Era berean, errutina batek exekutatzean zenbat denbora behar duen ere kontrola daiteke, eta exekutatzen ari den bitartean ez eten.

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.

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
--------------

1. ↑   «Mihiztadura-lengoaia - ZT Hiztegi Berria» *zthiztegia.elhuyar.eus* (Noiz kontsultatua: 2023-12-09).
2. ↑    Fundazioa, Elhuyar. «ensamblador» *Elhuyar Hiztegia* (Noiz kontsultatua: 2023-12-09).
3. ↑    *Introduction to Assembly Language.*  www.swansontec.com.
4. ↑   Verle, Milan. *5.1 Elements of Assembly Language | Architecture and programming of 8051 MCUs.*  learn.mikroe.com.
5. ↑   **(Ingelesez)** «4.4: Machine Code for the Addi Instruction» *Engineering LibreTexts* 2020-06-26 (Noiz kontsultatua: 2024-01-04).
6. ↑     doi:10.1145/2465554.2465559. ISBN 9781450320856..
7. ↑   **(Ingelesez)** McGregor, Jim. «The Difference Between ARM, MIPS, x86, RISC-V And Others In Choosing A Processor Architecture» *Forbes* (Noiz kontsultatua: 2022-11-21).
8. ↑   body. Intel Corporation, issuing. *Intel architecture software developer's manual.*  ISBN 1-55512-272-8. PMC 652410922. (Noiz kontsultatua: 2022-11-21).
9. ↑   «Guide to x86 Assembly» *www.cs.virginia.edu* (Noiz kontsultatua: 2022-11-21).

Ikus, gainera
-------------

* Makina lengoaia

Kanpo estekak
-------------

|  |  |
| --- | --- |
| Autoritate kontrola | 
* **Wikimedia proiektuak**
* Wd Datuak: Q165436
* Commonscat Multimedia: Assembly languages

---

* **Identifikadoreak**
* BNF: 11961749m (data)
* GND: 4003255-3
* LCCN: sh85008765
* NKC: ph318939
* **Hiztegiak eta entziklopediak**
* Britannica: url

 |

* Wd Datuak: Q165436
* Commonscat Multimedia: Assembly languages