Mihiztadura-lengoaia
Mihiztadura-lengoaia (ingelesez: assembly languagea eta asm laburdura) edo mihiztatzailea informatikako behe-mailako programazio-lengoaia sinbolikoa da.[1][2]
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.[3][4]
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.
Agindu bat MIPS mihiztadura-lengoaian | addi $s2, $t8, 37 |
Agindu bera MIPS makina-lengoaian | 001000 11000 10010 0000 0000 0010 0101 |
Adibidearen azalpena | 'addi' operazioaren kodea '001000' da (batuketa bat egitea).
'37' da batu behar den balioa ('0000 0000 0010 0101')[5] |
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
[aldatu | aldatu iturburu kodea]Mihiztadura-lengoaiaren kode baten lehen bertsioa 1947ko Coding for A.R.C. obran dago, Kathleen Booth eta Andrew Donald Booth bikote matematikariak sortua.[6]
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).[7]
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.[8] 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.[8] COBOL eta FORTRAN lengoaiek lan haietako asko berenganatu zituzten aldi baterako, nahiz eta mihiztadura-lengoaiazko aplikazioak garatzeko azpiegiturak erakunde handi askok mantendu zituzten 90eko hamarkadako bukaera arte
Lehen mikrokonputagailu gehienetan eskuz egindako mihiztadura-lengoaiatan oinarritu ziren, sistema eragile eta aplikazio nagusi gehienak barne. Izan ere, sistema horiek baliabide-muga larriak zituzten, memoria- eta pantaila-arkitektura idiosinkrasikoak ezarri zituzten, eta sistema-zerbitzu mugatuak eta erroredunak eman zituzten. Hala ere, garaia hartan mikroordenagailu batean ez zegoen goi-mailako lengoaiazko lehen klaseko konpiladore egokirik. Faktore psikologiko batek ere zeregin garrantzitsua izan zezakeen: mikroordenagailuetako programatzaileen lehen belaunaldikoak ez ziren profesionalak, zaletuak baino ez ziren.
Testuinguru askoz komertzialago batean, mihiztadura-lengoaiak erabiltzeko arrazoi nagusiak hauek ziren: neurri eta gainkarga minimoetako programak sortzea, eta abiadura eta fidagarritasun handiagoa lortzea.
Mihiztadura-lengoaiazko programa handien ohiko adibideak IBM PC DOS sistema eragileak eta beren lehen aplikazioak dira, hala nola Lotus 1-2-3 kalkulu-orria, eta konputagailu pertsonaletako Atari 800 familiako ia joko guztiak. 1990ean ere, kontsolako bideo-joko gehienak mihiztadura-lengoaiaz idatzi ziren, Megra Drive/Genesis eta Super Nintendo Entertainment System-erako joko gehienak barne. Industriako zenbait adituren arabera, mihiztadurakoa zen programazio-lengoaia onena Sega Saturn-en jarduera hobea lortzeko. Kontsola horretarako, jokoak garatu eta programatu behar ziren. NBA Jam arkade-joko ezaguna (1993) beste adibide bat da. Mihiztatzailea Commodore 64, Atari ST eta ZX Spectrum ordenagailuetako garapen primarioko lengoaia izan da luzaroan. Hori horrela izan zen, hein handi batean, sistema horietako BASICeko dialektoek exekuzio-abiadura eskasa eskaintzen zutelako, bai eta hardware erabilgarria erabat aprobetxatzeko ezaugarriak ere. Sistema batzuek, are nabarmenago Amigak, arazketa-ezaugarriak dituzten IDEak ere badituzte, eta makro oso aurreratuak, hala nola freeware ASM-One mihiztatzailea, Microsoft Visual Studiokoekin aldera daitezkeenak (ASM-Uno aurrekoa da).
VIC-20rako mihiztatzailea Don French-ek idatzi eta French Silv-ek argitaratu zuten. 1639 byteko luzera zuen, eta inoizko txikiena zela uste zuen egileak. Mihiztatzaileak ohiko helbideratze sinbolikoa eta karaktere edo kate hamaseitarren kateak definitzea onartzen zituen. Halaber, helbide-adierazpideak onartzen zituen, eta konbinatu zitezkeen zenbait eragiketekin: adizioa, kenketa, biderketa, AND logikoa, ORO logikoa eta esponentziaketa ere.
Ezaugarriak
[aldatu | aldatu iturburu kodea]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.
Terminologia
[aldatu | aldatu iturburu kodea]Atal honetan mihiztadura-lengoaiekin lotuta dauden zenbait termino azaltzen dira:
- Makromihiztatzaile bat makroinstrukzioak erabiltzeko aukera ematen duen mihiztatzaile bat da, non mihiztadura-lengoaiazko testua izen baten bidez adieraz daitekeen, eta izen hori erabil daiteke gero testu hedatua beste kode batean txertatzeko.
- "Kode irekia", mihiztadura-lengoaiazko programa baten barruan, makro baten definiziotik kanpo dagoen zatiari dagokio.
- Zeharkako mihiztatzaile baten kasuan (ingelesez: cross assembler; ikus, halaber, zeharkako konpiladore, edo cross compiler), ordenagailu edo sistema eragile desberdinetan egiten dira batetik programa mihiztatzailearen exekuzioa makina-lengoaiazko kodea lortzeko (ostalari-sistema) eta bestetik makina-lengoaiazko objektu-programaren exekuzioa. Zeharkako mihiztatzeak software-garapena erraztu egiten du baliabiderik ez duten sistemetan, hala nola, sistema txertatuetan eta mikrokontrolagailuetan. Kasu horretan, lortutako objektu-kodea sistema hartzailera transferitu behar da, memoria baten bidez (ROM, EPROM, etab.), programagailu baten bidez (memoria gailuan bertan integratuta dagoenean, mikrokontrolagailuetan bezala), edo objektuaren kodearen bit-by-bit kopia zehatza erabiltzen duen datu-lotura baten bidez, edo kode horren testu-errepresentazio baten bidez (Intel hex edo Motorola S-record gertatzen den bezala).
- Goi-mailako mihiztatzaile bat gehienetan goi-mailako lengoaiekin lotuta dauden abstrakzioak erabiltzeko aukera ematen duen programa da, hala nola kontrol-egiturak (IF/THEN/ELSE, DO CASE, etab.) eta goi-mailako zenbait datu mota abstraktuak: egiturak/erregistroak, batuketak, klaseak eta multzoak barne.[9]
- 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,[10] [11] 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[12] eta SDS Sigma-serieko[13] konputagailuetarako "Metad-Symbol" mihiztatzaileak meta-mihiztatzaileak dira.[14] Sperry Univac-ek[15] ere UNIVAC 1100/2200 serierako meta-mihiztatzaile[16] 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
[aldatu | aldatu iturburu kodea]Mihiztatzailea
[aldatu | aldatu iturburu kodea]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.[17]
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
[aldatu | aldatu iturburu kodea]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
[aldatu | aldatu iturburu kodea]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
[aldatu | aldatu iturburu kodea]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.[18] 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 .[18]
Adibidez, ondoko instrukzioak x86/IA-32 prozesadore bati adierazten dio, erregistro batean 8 biteko balio zehatz bat jartzeko. Instrukzio honetarako kode bitarra 10110 da, eta ondoren 3 biteko identifikadore bat, zein erregistrotan erabili behar den zehazten duena. AL erregistroaren identifikatzailea 000 denez, makina-lengoaiazko agindu honek AL erregistroan 01100001 datua jarriko du:
10110000 01100001
Kode informatiko bitar hori irakurgarriagoa izan daiteke gizakiaontzat zenbaki -sistema hamaseitarrez adierazita, honela:
B0 61
Hor, B0
esan nahi du "Jarri AL erregistroan honako balio hau", eta 61
da 01100001 balioaren errepresentazio hexadezimala (0110: 6; eta 0001: 1). Kontuz, gizakiontzat ohikoa den sistema hamartarrean 01100001 zenbaki bitar hori ez da 61, guretzat 97 zenbakia da.
8086 familiako mihiztadura-lengoaiatan, adibidez, MOV Mnemonikoa ("Mugitu"-ren laburpena) finkatzen du agindu mota horretarako, beraz, goiko makina-kodea honela idatz daiteke mihiztadura-lengoaian, azalpen-ohar batekin osatuta, 'puntu eta koma' karakterearen ondoren. Honela, askoz errazagoa da irakurtzea eta gogoratzea:
MOV AL, 61h ; Load AL with 97 decimal (61 hex)
Mihiztadura-lengoaia batzuetan (honetan bezala) mnemoniko bera, MOV adibidez, datuak kargatu, kopiatu eta mugitzeko agindu-familia baterako erabil daiteke, non balioak modu desberdinetan adierazi daitezkeen: konstante bat, erregistro batean dagoen balioa, memoriako gelaxka batean dagoen balioa (atzipen zuzena), edo erregistro batean dagoen balioa memoriako helbide gisa hartuta memoriako helbide horretan dagoen balioa (zeharkako atzipena).
Beste mihiztatzaile batzuek opcode mnemonic bereziak erabiltzen dituzte, hala nola, L "balioa memoriatik erregistrora mugitzeko", ST "balioa erregistrotik memoriara mugitzeko", LR "balioa erregistrotik erregistrora mugitzeko" eta MVI "balioa eragigaitik memoriara mugitzeko" eta abar. Mnemonikoa beste agindu batzuetarako erabiltzen bada, horrek esan nahi du mnemonikoa hainbat agindu bitarren kode desberdinekin bat datorrela, datuak kenduta (adibidez, 61h
lehengo adibidean), mnemonikoari jarraitzen dioten eragigaien arabera. Adibidez, x86/IA-32 konputagailuentzat, Intel-en mihiztadura-lengoaiaren sintaxiaren arabera MOV AL, AH
aginduak esan nahi du AH erregistroaren edukia AL erregistrora kopiatu behar dela. Aginduaren forma hexadezimala hau da:
88 E0
Lehen byteak, 88h, identifikatzen du mugimendu bat byte-tamainako erregistro baten eta beste erregistro edo memoriaren artean. Bigarren byteak E0h kodetzen du (hiru bit-eremuekin) bi eragigaiak erregistroak direla, balioaren iturria AH erregistroa dela eta helmuga AL dela.
Halako kasu batean, mnemoniko berak agindu bitar bat baino gehiago irudikatu ditzakeenean, eragigaiak aztertuta erabakitzen du mihiztatzaileak zein agindu sortuko duen. Lehen adibidean, 61h
eragigaia balio konstante bat (zenbaki hexadezimala) da eta ez da erregistro-izen bat, beraz, B0
instrukzioa bakarrik aplikatu daiteke. Bigarren adibidean, AH
eragigaia erregistro-izen bat da eta ez da konstante numeriko bat (hexadezimala, hamarrekoa, oktala edo bitarra), beraz, 88
instrukzioa bakarrik aplikatu daiteke.
Mihiztadura-lengoaiak beti diseinatuta daude anbiguotasun hori sintaxiaren bidez ulertu eta ebatsi ahal izateko. Adibidez, Intel x86 mihiztadura-lengoaian, konstante hexadezimal batek digitu-zenbaki batekin hasi behar du, horrela 'A' hexadezimala (kode hamartarrean 10 zenbakia da)0Ah
edo 0AH
bezala idatziko da, ez AH, eta horrela ezin izango da AH erregistroaren izenarekin nahastu. (Arau bera aplikatu daiteke BH, CH eta DH erregistroen izenak bereizteko, baita erabiltzaileak H hizkiarekin bukatzen den edozein sinbolo definitzen duenean, sinbolo horretako letrak sistema hexadezimaleko zenbakiak ere baldin badira, noski, hala nola "BEACH" sinboloa.)
Jatorrizko adibidera bueltatuz, x86-ko 10110000 (B0
) eragiketa-ḱodea 8 biteko balio bat kopiatzen du AL erregistroan, 10110001 (B1
) CL erregistroan kopiatzen du eta 10110010 (B2
) DL erregistroan. Agindu horiekin osa daitezke mihiztadura-lengoaiazko adibide hauek:
MOV AL, 1h ; Load AL with immediate value 1
MOV CL, 2h ; Load CL with immediate value 2
MOV DL, 3h ; Load DL with immediate value 3
MOV aginduaren sintaxia konplexuagoa ere izan daiteke, adibide hauek erakusten dutenez.[19]
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.[20]
Lengoaiaren diseinua
[aldatu | aldatu iturburu kodea]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.[21]
Edozein kasutan lengoaia horiek ezaugarri komunak dituzte diseinuaren ikuspuntutik.
Formatua
[aldatu | aldatu iturburu kodea]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
[aldatu | aldatu iturburu kodea]Intel x86 lengoaian oinarritutako lehen adibideak[22]
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[23]
MOV EAX, [EBX] ; Eraman EAXra EBXn gordetako helbideko 4 byteak, memoriakoak MOV [ESI+EAX], CL ; Eraman ESI+EAX helbidera CL erregistroaren edukia
Mihiztatzaile motak
[aldatu | aldatu iturburu kodea]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
[aldatu | aldatu iturburu kodea]- ↑ «Mihiztadura-lengoaia - ZT Hiztegi Berria» zthiztegia.elhuyar.eus (Noiz kontsultatua: 2023-12-09).
- ↑ Fundazioa, Elhuyar. «ensamblador» Elhuyar Hiztegia (Noiz kontsultatua: 2023-12-09).
- ↑ Introduction to Assembly Language. www.swansontec.com.
- ↑ Verle, Milan. 5.1 Elements of Assembly Language | Architecture and programming of 8051 MCUs. learn.mikroe.com.
- ↑ (Ingelesez) «4.4: Machine Code for the Addi Instruction» Engineering LibreTexts 2020-06-26 (Noiz kontsultatua: 2024-01-04).
- ↑ (Ingelesez) CODING FOR A.R.C.. .
- ↑ BIOS. 2019-12-15 (Noiz kontsultatua: 2023-12-22).
- ↑ a b (Gaztelaniaz) «IBM - España» www.ibm.com (Noiz kontsultatua: 2023-12-22).
- ↑ (Ingelesez) High-level assembler. 2021-04-18 (Noiz kontsultatua: 2024-01-05).
- ↑ «meta-assembler | Encyclopedia.com» www.encyclopedia.com (Noiz kontsultatua: 2023-12-18).
- ↑ «meta-assembler | Encyclopedia.com» web.archive.org 2020-03-24 (Noiz kontsultatua: 2023-12-18).
- ↑ (Ingelesez) SDS 9 Series. 2023-07-21 (Noiz kontsultatua: 2024-01-05).
- ↑ (Gaztelaniaz) Serie SDS Sigma. 2023-02-09 (Noiz kontsultatua: 2024-01-05).
- ↑ https://bitsavers.org/pdf/sds/sigma/lang/900952G_metaSymbolLangRef_Oct75.pdf
- ↑ (Gaztelaniaz) UNIVAC. 2023-12-14 (Noiz kontsultatua: 2024-01-05).
- ↑ http://www.bitsavers.org/pdf/univac/1100/asm/UP-8453_MASM_Programmers_Ref_1977.pdf
- ↑ doi: . ISBN 9781450320856..
- ↑ a b «Wayback Machine» web.archive.org (Noiz kontsultatua: 2023-12-18).
- ↑ «Guide to x86 Assembly» www.cs.virginia.edu (Noiz kontsultatua: 2023-12-18).
- ↑ Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference (PDF). Vol. 2. Intel Corporation. 1999. Archived from the original (PDF) on 2009-06-11. Retrieved 2010-11-18.
- ↑ (Ingelesez) McGregor, Jim. «The Difference Between ARM, MIPS, x86, RISC-V And Others In Choosing A Processor Architecture» Forbes (Noiz kontsultatua: 2022-11-21).
- ↑ body., Intel Corporation, issuing. Intel architecture software developer's manual. ISBN 1-55512-272-8. PMC 652410922. (Noiz kontsultatua: 2022-11-21).
- ↑ «Guide to x86 Assembly» www.cs.virginia.edu (Noiz kontsultatua: 2022-11-21).