Sunteți pe pagina 1din 6
Revista Informatica Economicd, n.1/1997 37, Designul limbajelor de asamblare Prof.dr. Jon IVAN, Catedra de Informatics Economica, A. $. E., Bucuresti Limbajele de asamblare apar ca rezultat al proiectarii microprocesoarelor. Limbajele evoluate de programare permit accesul la toate resursele sistemelor de calcul. Per- formanta software este influenjaté de modul in care a fost proiectat, de limbajul in care este elaborat $i de facilitafile oferite de limbajul de asamblare, la care se ajunge in final. Designul limbajelor de asamblare reprezinté un nou mod de abordare a construirii acestora in vederea ameliorarii performantei softwareului aplicativ. Cuvinte cheie: limaje de asamblare, instructiuni, ortogonalitate, performante. Introducere Limbajele evoluate de programare elimina suportul invapirii programariit jin assembler pentru a avea acces la toate resursele sistemelor de calcul. Utilizarea corecti a funcfiilor din bibliotecite standard din programele sorise in limbajele C¥++ sau PASCAL oferi programatorilor posibilitijile de acees la orice nivel al resurselor. in acest nou context, studierea unui limbaj de asamblare se justifick pentru eficientizarea unor secvente de pro- gram. Existi posibilitatea de a introdue ce direct in textele sursi C/C++ seo- vente asm. © alti motivatie este intelegerea exacta a unor mecanisme de manipulare a in- formafiei (lucru pe stiva, lucru cu va- riabile pointer, definirea si utilizarea funcfiilor virtuale). Dacé au existat pericade in care lim- bajul de asamblare a fost considerat un produs natural, uneori imperfect, al procesului de proiectare a procesoa- relor, acum se poate pune si problema de a realiza mictoprocesoare pornind de la un limbaj de asamblare dat, Lim- bajul de asamblare este definit aga fel fncat s& asigure eficienta, masurati sta- tistic, fie la implementarea unor meca- nisme noi de gestiune memorie, fie in generarea de secvenfe compacte, fie tn reducerea chiratei de executie a prelu- crarilor. in continuare sunt analizate aspecte de baz ale designului limbaje- lor de asamblare. Programele scrise fintr-un limbaj de asamblare proiectat cu luarea in considerare a anumitor criterii de performanja, vor propaga efecte pozitive in toate fazele realizzrii codului sursa si ale utilizétii software- ului la beneficiari, Se pune fn evidenta legatura dintre caracteristicile de ordin cantitativ gi laturile calita-tive ale unui limbaj de asamblare si efectele de antrenare multipla induse. Structura instructiunii limbajului de asamblare Programatorul in lisssdele de asam- blare, fnainte de orice, trebuie si cu- noasci structura interna a instruc- fiumilor, care diferd de la un limbaj la altul. Structura intema arata modul in care se dispun la nivel de bifi infor- mafiile privind: codul operafiilor, eti- chetele si expresiile de adresare ale operanzilor. Sirul de bifi care memoreazi codul operatiei are o lungime strict depen- denta de numirul de operatii de baz pe cate le implementeaza limbajul de asamblare. Astfel, dacd proiectantul limbajului de asamblare opteaza pentru un sir de opt bifi, limbajul de asamblare poate fi inzestrat cu maxim 256 de mnemonice asociate unor instrucfiuni diferite. Nu- mérul foarte mare de mnemonice dis- ponibile permite definiri de instruc- jiuni diferite pentru aceleasi operafii in 38 cazul in care tipul operanzilor este altul. De exemplu, vor exista instruc- fiuni pentru efectuarea adunirii in binar, in zecimal impachetat si in virgulé mobila. Programatorul assem- bler va alege aritmetica in care lucreazii strict dependent de contextul problemei pe care 0 rezolva. Daca proiectantul limbajului de asam- blare defineste codul operatiei ca un sir de sapte bifi, numarul mnemonicelor cu care va manipula programatorul va fi de cel mult 127. Un astfel de limbaj este mai sirac, posibilitatile de alegere se reduc. Chiat daci pot fi definiji “ operanzi de tipuri diferite, implemen- area aritmeticilor presupune apelarea de functii care s& prelucreze datele fiecérui tip folosind operatii dintre cele 127 implementate tn limbaj. Efortul de programare este mult mai ridicat. Este posibil ca numérul de instrucfiuni N, sa fie mai mic decat 2* unde k reprezinta lungimea sirului de biti pe care este memorat codul instructiuni- lor. Gradul de ocupare, G este dat de relafia: N G= —-* 100 ay 2k Gradul de neocupare T este dat de relay r=100-G @ Gradul de neocupare este cel care ofer’ posibilitatea designerilor si dezvolte un sistem de macrodefinifii coerent sau s& impuni definirea de noi operafii de baza ce conduc la reducerea efortului de programare. Designul structural al limbajului de asamblare are la baz ipoteza conform c&reia toate clementele limbajului au aceiasi importantéa. Aceasti viziune conduce 1a abordarea separaté 2 com- ponentelor instrucfiunii Tn designul structural resursele sunt privite de sinestititor. Operanzii pot fi stocafi in registre (R), in memorie (M) sau pot fi definiti in corpul instructin- Revista Informatica Economicd, n.1/1997 nii, imediat (1). Complexitatea limbaju- lui de asamblare se modifica radical in cazul opfiunilor designeralui pentru instructiunile cu doi operanzi Daca se opteazA pentru intreaga gama de structuri de operanzi, vor fi definite instructiuni de tip R-R, R-M, R-I, M- M, MAL Structurile interne ale acestor tipuri vor ocupa zone de memorie de lungime variabila, ‘in cazul in care existi 16 registre de lucru codul operatiei ocupa 8 biti, o instructiune de tip R-R va fi definita pe cel putin 16 bifi. Pentru operatii R-R se asociaz coduri distincte. jn cazul in care codul operatiei este unic, nedepinzand de operanzi, sunt necesari inc’ 3 bifi pentru a indica tipul (000 pentru tipul R-R, 001 pentru tipul , 010 pentra tipul R-Ietc.). Limbajele de asamblare ale gencrafiilor de microprocesoare actuale evita tipul de instructiuni M-M, avénd definite mnemonice pentru Jucral cu siruri de caractete, suficient de flexibile. Expresiile de adresare se evalueaza in timpul asamblirii, semnificatiile find ___gate de coduri memorate pe anumite Soci din corpul structurii interne a instructiunii. Folosind 0 zona de 2 bifi se pot objine toate combinafiile ce corespund atribu- telor direct / indirect si indexat / nein- dexat. Pentru tipologii identificate si limitate ca numar de expresii de adre- sare se stabileste 0 zon’ care memo- reaz coduri asociate care prin interpre- tare in timpul execufiei permit utiliza~ rea corect4 a informatiilor din zonele “operanzi” din structura_ intemi a instructiunii. Codurile conduc la posi- bilitatea realizirii unei variabilitati a lungimii zonei de memorie ocupata de informatiile despre operanzi. Designul limbajului de asamblare pen- tru microprocesoarele 80x86 a condus la o structuri de instructiune interna specifica tipurilor de instructiuni R-R, R-M, R-I, codul operafiei are incor- porate informafii privind formatul Revista Jyformatica Economicd, nr.1/1997 datelor (bait, cuvant, cuvant dublu) gi diteofia de parcurgere (adresare sau tra- versare) a memoriei, figura 1. ua, | TEtTTTdw MM reg r/m bili | 76543210. 76543 Fig. 1 Structura interna instructiunii unde: T - bifi pentru codul operatiei; d- direofic de parcurgere; w- tip operand (bait/euvant); MM - interpretarea deplasitii; reg - registre (semiregistre) codificate; rin - tipologii expresii de adresare, Limbajele de asamblare mai vechi, da- toritd numarului mare de registre si a aritmeticilor implementate, au regrupat expresiile de adresare pe un numér mai restrdins de bifi, Gradul de dependenta a cémpurilor din structura instruefiunilor era foarte slab. Limbajul de asamblare a micro- procesorului conventional x86 are definit un grad de dependent ridicat intre elmentele din structura instructi- unii. Astfel, deplasarea este interpretat functie de cémpul w (cdmpul MNEG depinde de cémpul w), iar cdmpul reg depinde ca interpretare tot de cémpul wyCampul r/m depinde de cémpul MM: Daca valoarea MM este 11, cdtiypul r/m este interpretat reg, Designul corectiv pentru timba- jele de asamblare Pentru limbaje precum Fortran, Cobol, PL/I in timp au fost efectuate analize Statistice, toate evidentiind neuniformi- tatea cu care programatorii utilizeaz’ in-structiunile si tipurile de date si de structuri oferite. In mod normal, experienfa oferita de utilizarea facilitatilor ar trebui si conduca la perfectionarea limbajelor, aspect, realizat prin. trecerea’ de..la FORTRAN. AV la FORTRAN ‘77 si acum deja exist FORTRAN’90.. Mai 39. dinamic, limbajul C a inregistrat evolutiile C++ si VISUAL C++, Limbajele de asamblare: sunt cele chemate si permiti.:.implementarea noilor mecanisme. Avantajele lu-crului pe stiva a condus la imple-mentarea de instructiuni (PUSH, POP) absente la primele limbaje. Frecventa redusa de lucru in aritmetica zecimal impachetaté a condus la excluderea din lista mne- monicelor a elementelor corespunzi- toare operatiilor acestei aritmetici Se presupune existenfa unui program, simplu de altfel, care citeste figiere cu texte sursi assembler si contorizeaza instructiunile. Se observa clar c& frec- venfa cu care apar instruefiuni precum mov, add, ine, dec difera radical de frecventa cu care apar instructiuni ca hit, aaa, aad, das, lock, les, xehg. De asemenea, dac& alaituri de frecvenfele cu care sunt utilizate resursele (regis- tre, zone de memoric) se vor putea defini asocieri operafiiresurse care trebuie tratate distinct. Existenja metodelor statistice modeme ofera un instrument eficient dé grupare a instructiunilor legate de operanzi ca un tot si tratarea distinct a instructi. unilor din punet de vedere al utilizar Toate clasificdrile instructiunilor (dupa tipul operatiei, natura operanzilor, tipul operanzilor) sunt strict legate de latura semantica a limbajului. Metodele de clasificare statistice oferé posibilitatea de a structura limbajul de asamblare dupa rigorile utilizatorilor. Se considera o matrice a freeventelor F cu elemente fj care au semnificatia: numér de aparijii ale instructiunii A; cu utilizarea resursei Sj. Prin definirea unui sistem de ponderi adecvat, se pro- cedeaz la agregarea informafiilor, ob- jinandu-se o masura a intensitatii intre~ buingirii unei instructiuni int-un con- text dat (operatori utilizagi). Un algo- titm de clasificare conduce la identifi- carea unei noi tipologii de instructiuni. Structura interna a instructiunii este rezultatul natufal al utilizarii. Se por- 40, neste Ja proiectarea limbajului de asamblare de la cerinfele reale ale programatorilor. Se spune o& se utili- zeazi un design corectiv, intrucat clasele se obfin pornind de la programe serise intr-un limbaj existent. Noul limbaj de asamblare este rezultatul introducerii de corectii Ja un limbaj j—_Instruetiuni —> Instrucfiuni de salt Instructiuni de manipulare » Instructiuni cu siruri de biti Reyisia Informatica Economicd, nt.\/1997 existent, Pentru ca rezultatele si fle semnificative este necesar ca esan- tionul de programe cu care s-a efectuat constituirea matricei F si fie suficient de mare gi si cuprinda o diversitate de programe care sa acopere multitudinea de aplicatii care se dezvolti in limbaje de asamblare. Instructiuni foarte mult folosite Instructiuni folosite normal Instrucfiuni slab folosite t Instructiuni nefolosite Fig. 2. Migrarea instructiunilor Clasele de instrucfiuni obfinute dupa frecventele de intrebuintare in progra- me vor avea asociate coduri ale opera- fillor care din structura si permité interpretari diferite. Daca de exemplu, instructiunea ine ax are frecventa de aparitie cea mai mare, i se va asocia codul de operatic format ‘numai din zerouri. Dac& se optear-Pentru un limbaj de asamblare cu codul operafiei format din 8 bifi, zerourile nesethmificative ca numar permit crearea de grupe de instrucfiuni, fi 0 acoperire consecu- tiv a submulfimilor formate din codu- rile consecutive. in ipoteza c& in clasa de instruc-fiuni foarte frecvent intilnite se afl 18 tructiuni de calcul Instrucfiuni de caleul —— SS 4 a Instrucfiuni de salt — Insirucfiuni de manipulare Instruetiuni cu giruri de biti elemente, reprezentabile pe cinei pozi- {ii binare, codurile acestei clase vor avea trei zerouri in fafa (000xxxxx). Din cele 32 de combinajii binare cu cinci pozifii sunt utilizate numai 18. fntr-o prima etapa se realizeaz’i pune- rea in corespondena a cla-selor cu codurile. in cazul in care siman in- structiuni clrora nu li se asociazi co- duri datorita epuizarii celor 256 de combinafii binare, se trece la rafinarea claselor. Rafinarea este un procedeu complex care vizeazi fie reducerea numarului de clase, fie translajia de instructiuni de la o clasa ta alta, obfinandurse o alt’ repartizare a instructiunilor in clase, ca in figura 3. + Instructiuni foarte mult folosite instructiuni normal folosite _x Instrucfiuni slab folosite Fig. 3, Restrangerea resurselor Daci prin restrdingerea claselor sau prin. translatie s-a obfinut cresterea numaru- lui de clemente de Ja 18 1a 31 in clasa instructiunilor cel mai freevent folosite si dac& s-a obfinut incadrarea instructi- unilor prin punere in corespondentai cu Revista Informatica Economica nr.1/1997 coduti binare si de opt pozitii, se poate trece la dezvoltarea in continuare a structurii inteme a instruetiunilor lim- bajului de asamblare. Un astfel de limbaj prezint& particula- ritatea ca. structurarea_instrucfiunilor fncepe chiar cu codul operatiei, Este mai corect si se vorbeased de codul operatiei-operand, intrucat frecventele de aparitie tin seama de operatie si de operanzii utilizati Aparent un astfel de limbaj nu mai prezint& regulatitafile intalnite la cele- lalte limbaje de asamblare. Structurarea in continuare a instrue- jiunilor se efectueazi depinzind strict de alcituirea claselor. Tipurile de adre- sate, modul de parcurgere (sténga/ dreapta), expresiile de adresare, se vor regasi sau nu la fiecare clas&, dupa cum rezulti din elementele care o alc&tu- iese. Ciftele semnificative de pe pozi- fille zero, unu sau doi vor marca fie~ care tip structural. Chiar daci se inregistreazi “intreruperi” in secven- tele de atribuire a codutilor, clasele neavand exact 32 de elemente, codifi- catea aceasta a instractiunilor fine sea- ma de paiiicularivagile de utilizare ale limbajului Stabilirea numarului de registre Limbajele de asamblare considera re- gistrele ca resurse. Se definese instruc- tiuni in care se utilizeazt numai anumi- te registre, ceea ce restrictioneaz foar- te mult manipularea datelor, Inseamna cA registrele nu au functiuni identice, unele dintee ele flind “dedicate”. Astfel, in cazul limbajului de asambla- re definit pentru microprocesoarele x86, registrul AX este “dedicat pentru numeroase operafii (ajustari, inmulliri impartiri) si este destinatie pentru multe operatii. Problematica pe care 0 are designerul este de a stabili numi- rul optim de registre pe care si le gesti oneze eficient (statistic) programatorii Acest “optim” este rezultatul unui 4 proces de definite “la birou” a seeven- felor in diferite ipoteze cu luarea in considerare a numarului de cicluri pe care le determina fiecare solufic dat. Se considera un lot de probleme frec- vent rezolvate in limbaj de asamblare P), Po, ... Pm. Se vor scrie programe in ipoteza in care limbajul este definit cu un singur registra de lucru. Se va observa abundenta de instructiuni mov pentru stocare rezultate intermediare gi pentru inifializari. Scriind un program de analizi a celor m programe care oferi solujii pentru problemele P,, i=1,2,..m, se evalueazi volumul de prelucrati exprimat ca numar de cicluri magin’. Tot astfel se procedeaz’ si pentru definirile de limbaje de asamblare in care existi doud, trei sau mai multe registre. Numarul de registre determi- na si implementarile de structuri funda- mentale prin intermediul expresiilor de adresare. De exemplu, registrul index permite atat implementarea structurii de dati masiv, cat si definirea structurii repetitive: Utilizarea indicatorului numar de ci- cluri masini, conduce la omogenizarea de rezultate, chiar daca se pierd anumite informafii. El permite agregari si manipularea cu medi aritmetice si dispersii. Daca se considera mai multe loturi de probleme, este posibila analiza stabili- ‘tii limbajului de asamblare, tot din punct de vedere statistic. fn cazul in care s-a obfinut un grad de stabilitate corespunzitor, sc poate trece la alege- rea numirului cficient de registre in raport cu criteriul reducerii numarului de cicluri masina. Cu cat lotul problemelor este mai vast, exist posibilitatea de a acoperi o gama mare de aplicafii si de a face un studiu mai complet asupra comportamentului limbajului de asamblare. Indiferent de marimea lotului, este riscant sd se A despre optimizarea lim- vorbeasca, bajului sau de stabilirea numarului op- 42 tim de registre de Iueru, “dedicate” sau ‘nu, Oricum atributul de optim se_va referi la lotul de programe rezultat, orice extensie fiind riscanta daci nu s-2 studiat suficient _repreventativitates acestui lot. Cercetiirile efectuate pan’ in pre-zent pe un lot de 60 de programe cu acelasi grad de complexitate pune in evidenta eficienta unui limbaj de asamblare cu doui registre acumulator (imperecheate corespunziitor pentru a se face identifi- carea corecti a operanzilor si pentru climinarea ambiguitifii in cazul ajust’- rilor). De asemenea, tipurile de expre- sii de adres ce intervin in registre pot fi dezvoltate pentru a introduce nivele de indirectare de ordin superior. Concluzii Designul limbajului de programare cu Iuarea in considerare a finalitatii, scrierea de programe, determin pro- iectarea unui limbaj pentru utilizator. Numeroase dificultiifi care apar in asamblare, la generarea formei interne fa instrucfiunilor, sunt probleme inde~ pendente de programator. Odati re- zolvate corect, programul asamblor va opera asupra unei mulfimi de programe in crestere, propagénd efectele pozitive ale limbajului. Dac la proiectare sunt luate in consi- derare si elemente de compresic a programelor in cod masind, limbajul de asamblare oferd o traséiturdi beneficd tot Ja nivelul utilizatorilor finali. Preocupirile de design penta limbaje de asamblare capaté acum 0 now ca- racteristica, aceea de a fi deschis spre utilizatori. Optiunea spre neomogeni- tate de tratare a instructiunilor nu determina complicatii la nivelul utili- zatorilor. La nivelul celor care imple- menteazi limbajul de asamblare, fie- care neomogenitate se traduce in mo- dalitate distinct de tratare. Diversitatii de tipuri de instructiuni ii va cores- Revista Informatica Economicd, mt 1/1997 punde 0 crestere a complexitafii pro- gramului asamblor. Pentru a obfine rezultate cu nivel de stabilitate ridicat este necesara crearea uunei baze de programe serise in limbaj de asamblare care si includ’ c&t mai multe stiluri de programe si cat mai multe tipuri de probleme rezolvate Ca si in cazul altor limbaje, designul limbajelor de asamblare ia in conside- rare mentinerea unui nivel tidicat al ortogonalititii instructiunilor. Studiul efectuat acum a presupus ortogona- Titatea deja existent a instructiunilor din limbajul de asamblare asociat microprocesoarelor x86, far a se pro- ceda la definirea de noi instructiuni sau noi tipuri de expresii de adresare. Dac se vor efectua in viitor si aceste modi- ficiri, designul limbajului de asam- blare capata un nivel de profunzime mult mai accentuat, influentand por bilitatea limbajului, in sensul reduce Bibliografie 1. Irina Atanasiu, Alexandru-Panoiu ~ Microprocesoarele 8086, 80286, 30386. Programarea in limbaj de asamblare, Editura TEORA, Bucuresti 1992. 2. Penn Brumm, Don Brumm - 80386 “Assembly Language, TAB Professional ‘and Reference Books, Blue Ridge Summit, 1988. 3. Patrick Cohen - Le Micro- processeur PENTIUM. Architec-ture et ‘programation, Armand Colin, Paris, 1994. 4, Len Dorfman - Structured Assembly Language, Windcrest Books,Blue Ridge Summit, 1990. 5. Julio Sanchez, Maria P. Canton - Numerical Programming the 386, 486 & PENTIUM, McGraw-Hill Inc., New York, 1995. 6. Sen Cuo Ro, Sheau Chueri ~ 1386 / i486 Advanced Program-ming, Van Nostrand Reinhold, San Jose, 1993.

S-ar putea să vă placă și