Documente Academic
Documente Profesional
Documente Cultură
L1SOLTR
L1SOLTR
specific segmente). Se recomand pentru programe mici. Un dezavantaj important l reprezint faptul c nu conin informaii despre programul surs i variabilele simbolice necesare depanatorului simbolic CV; cod pentru ROM - Asamblorul poate fi utilizat pentru generarea codului care este nscris n memorii ROM programabile. De obicei acesta este un format binar; uniti de dispozitiv - Controleaz activitile de I/E pentru unitile hardware de I/E. Dezvoltarea programelor n limbaj de asamblare Pentru a facilita dezvoltarea programelor n limbaj de asamblare, macroasamblorul MASM (TASM) ofer o serie de pseudoinstruciuni sau directive i anume: 1. Directive pentru definirea datelor: - directive pentru definirea constantelor simbolice: EQU; - directive pentru definirea variabilelor: DB, DW, DD, RECORD, STRUC; - directive pentru definirea etichetelor: LABEL. 2. Directive pentru alocarea memoriei: - directive pentru modificarea contorului de instruciuni: ORG; - directive pentru definirea segmentelor logice i adresabilitii datelor: SEGMENT, ENDS, ASSUME, GROUP; - directive pentru definirea procedurilor: PROC, ENDP. 3. Directive pentru legarea modulelor de program: NAME, END, PUBLIC, EXTRN, INCLUDE. 4. Directive pentru controlul listrii: PAGE, TITLE, LIST etc. 5. Directive pentru asamblare conditionat: IFxxxx, ENDIF. 6. Directive pentru definirea macroinstruciunilor: MACRO, ENDM. Definirea i utilizarea segmentelor logice Segmentul logic (numit pe scurt segment) este cea mai mic unitate relocabil a unui program. Relocabilitatea este proprietatea unui program obiect de a putea fi linkeditat i fcut executabil prin plasarea sa la orice adres de nceput n memoria principal.
Un segment fizic (numit i cadru) n memoria lui I8086/I8088 const dintr-un grup de locaii adiacente de dimensiune 64 Ko, cu adresa absolut de nceput multiplu de 16. La un moment dat microprocesorul poate s fac acces la patru segmente logice: - segmentul de cod - accesibil prin CS; - segmentul de date, curent - accesibil prin DS; - segmentul de date, suplimentar - accesibil prin ES; - segmentul de stiv - accesibil prin SS. Aceste segmente logice pot s corespund la patru segmente fizice distincte, dar pot s existe i coincidene i/sau suprapuneri pariale ntre aceste segmente. Definirea unui segment se face sub forma: nume_segment SEGMENT Corpul segmentului nume_segment ENDS unde nume_segment este numele asociat segmentului, care nu poate fi utilizat n program cu alt semnificaie. Acestui nume i se asociaz o valoare i anume adresa de segment (16 bii) corespunztoare poziiei segmentului n memorie. Structura unui segment de date este urmtoarea: nume_segment SEGMENT Directive de alocare memorie nume_segment ENDS Structura unui segment de cod este urmtoarea: nume_segment SEGMENT Instruciuni i directive nume_segment ENDS Directivele i instruciunile cuprinse ntre directivele SEGMENT i ENDS se consider c fac parte din segmentul respectiv. Structura unui program format din dou segmente de date i un segment de cod este urmtoarea: data_seg1 SEGMENT ; nceputul segmentului de date data1 . . . . . . . . . . Directive data_seg1 ENDS ; Sfritul segmentului data1
data_seg2
SEGMENT
. . . . . . . . . . Directive ENDS ; Sfritul segmentului data2 SEGMENT ; nceputul segmentului de cod code . . . . . . . . . . Directive start: . . . . . . . . . . Instruciuni code_seg ENDS ; Sfritul segmentului code END start Avnd n vedere ca ntr-un program pot s existe mai multe segmente este necesar ca asamblorul sa "tie" n fiecare moment care sunt cele patru segmente logice curente pentru a putea s genereze corect codurile instruciunilor. De asemenea, asamblorul trebuie s "tie" ce registre de segment se pot utiliza pentru a realiza accesul la datele referite. Aceast informaie este transmis asamblorului cu ajutorul pseudoinstruciunii ASSUME a crei form general este: ASSUME reg_segment : nume_segment [, . . . . . .] unde: reg_segment = CS | DS | SS | ES; nume_segment = numele segmentului logic sau numele unui grup de segmente definit anterior printr-o directiv GROUP sau cuvntul cheie NOTHING care anuleaz selecia precedent a segmentului. Precizm c nume_segment va fi adresat prin reg_segment corespunztor. ncrcarea lui reg_segment cu adresa de baz este sarcina programatorului. Trebuie remarcat c ASSUME este o pseudoinstruciune pentru care nu se genereaz cod, rolul ei fiind numai de a informa asamblorul de intenia programatorului. Exemplu: ASSUME CS : code_seg, DS : data_seg1, ES : data_seg2 Aceast directiv va informa asamblorul c adresa de segment a segmentului code_seg se va gsi n CS, adresa de segment a segmentului data_seg1 se va gsi n DS i adresa de segment a segmentului data_seg2 se va gsi n ES. Asupra lui SS nu s-a facut nici o presupunere. Observaie: Deoarece directiva ASSUME nu ncarc adresele de segment n registrele de segment corespunztoare, pentru toate registrele de segment, cu excepia lui CS, acest lucru se face n mod explicit de ctre programator, ca n exemplul urmtor:
data_seg2 code_seg
SEGMENT ASSUME CS : code_seg, DS : data_seg1, ES : data_seg2 start: mov ax, data_seg1 ; ncrcarea registrului DS cu mov ds, ax ; adresa de baz a segmentului data_seg1 mov ax, data_seg2 ; ncrcarea registrului ES cu mov es, ax ; adresa de baz a segmentului data_seg2 ENDS code_seg END start Incepind cu versiunea 5.00, macroasamblorul MASM (TASM), permite utilizarea unor directive de segment simplificate. Implicit, directivele de segment simplificate, utilizeaza numele si conventiile de segment din limbajul C. Pentru folosirea directivelor de segment simplificate, se va declara un model de memorie pentru program. Acesta specifica modul de alocare implicita a datelor si codului programului respectiv. Sunt posibile urmatoarele modele de memorie: - Mic (SMALL) - Toate datele se incadreaza intr-un singur segment de 64 Ko si toate portiunile de cod intr-un alt segment de 64 Ko. Toate datele si portiunile de cod vor fi adresate prin intermediul unor referinte apropiate (NEAR); - Mediu (MEDIUM) - Toate datele se incadreaza intr-un singur segment de 64 Ko, iar portiunea de cod poate fi mai mare 64 Ko. (Datele sunt referite ca NEAR, iar codul ca FAR); - Compact (COMPACT) - Codul se incadreaza intr-un singur segment de 64 Ko, iar portiunea de date poate fi mai mare 64 Ko. (Datele sunt referite ca FAR, iar codul ca NEAR); - Mare (LARGE) - Atit datele, cit si portiunea de cod pot fi mai mari 64 Ko. (Ambele sunt referite ca FAR); - Urias (HUGE) - Atit datele, cit si portiunea de cod pot fi mai mari 64 Ko. (Ambele sunt referite ca FAR); In plus, fata de modelul LARGE, modelul HUGE permite siruri de date mai mari de 64 Ko. Definirea modelului de memorie se face cu ajutorul directivei .MODEL ce are sintaxa: .MODEL modelmemorie unde modelmemorie poate fi : SMALL, MEDIUM, COMPACT, LARGE sau HUGE.
code_seg
Intr-un program, directiva .MODEL apare inaintea definirii oricarui segment. Ea este echivalenta cu definirea explicita a directivelor ASSUME, SEGMENT, GROUP necesare pentru definirea explicita a segmentelor corespunzatoare modelului ales. Observatie: Este indicata utilizarea modelului SMALL, deoarece modelele MEDIUM, LARGE, HUGE conduc la executia lenta a programului, iar COMPACT, LARGE, HUGE sunt dificil de tratat de catre asamblor. Definirea simplificata a unui segment se face cu directivele: .CODE, .DATA, .DATA?, .FARDATA, .FARDATA?, .CONST, .STACK. Sintaxa acestor directive este: .STACK [ marime ] Permite definirea unui segment de stiva, unde parametrul marime specifica numarul de octeti rezervati pentru stiva. Daca nu se specifica, se considera implicit o stiva de 1 Ko. .CODE [ nume ] Specifica inceputul unui segment de cod. Precizarea cimpului nume este necesara in cazul in care se doreste utilizarea mai multor segmente de cod in fisierul sursa, fiind permisa numai pentru modelele ce pot utiliza mai multe segmente de cod (MEDIUM, LARGE, HUGE). .DATA Specifica inceputul unui segment de date, accesibile prin referinta apropiata. Observatie: Pentru a accesa locatiile de memorie din segmentul definit prin .DATA, trebuie incarcat explicit registrul segment DS cu simbolul @DATA. Aceasta se realizeaza cu urmatoarele doua instructiuni: mov ax, @DATA mov ds, ax ; Registrul DS indica segmentul de date ; specificat prin .DATA .DATA? Specifica definirea unui segment de date neinitializate, accesibile prin referinta apropiata.
.FARDATA Specifica definirea unui segment de date , accesibile prin referinta indepartata (FAR). .FARDATA? Specifica definirea unui segment de date neinitializate, accesibile prin referinta indepartata. .CONST Specifica definirea unui segment de date constante. Datele definite cu directivele .STACK, .DATA, .DATA? si .CONST sunt plasate intr-un grup denumit DGROUP. Ordonarea segmentelor in fisierul executabil conform conventiei DOS se face cu directiva .DOSSEG . Aceasta conventie este utilizata implicit de compilatoarele C.
Continutul variabilei mesaj de tip sir de caractere se afisaza pe ecran utilizind functia DOS cu codul 40h, printr-o intrerupere cu codul 21h. Sirurile pot fi de asemenea afisate pe ecran cu functia DOS cu codul 09h. Functia DOS cu codul 4ch este utilizata pentru terminarea programului si iesirea la sistem.
4. Desi datele programului trebuie incluse in segmentul unic ele nu vor fi executate. Se poate "sari" peste ele cu o instructiune jmp (ca in exemplu), sau se pot plasa la sfirsit, dupa punctul in care programul revine in sistem. Tinind cont de cele de mai sus, putem acum prezenta: Procedura generala de dezvoltare a programelor in limbaj de asamblare
a. studiul raspunsului programului la diferite seturi de date de intrare; b. studiul fisierelor sursa si listing; c. utilizarea programului CREF pentru crearea fisierului listing cu referinte incrucisate;
EDITARE TEXTE
nume.ASM (modul sursa)
nume.REF (fisier text) nume.CRF
1. Se foloseste un editor de texte pentru crearea sau modificarea modulelor sursa. Prin conventie, acestea au extensia implicita .ASM. 2. Se utilizeaza programul MASM (TASM) pentru asamblarea fiecarui modul de program. Se pot utiliza optional fisiere de includere (fisiere ce sunt incluse in modulul asamblat doar pe durata asamblarii). Daca apar erori dupa executarea acestui pas se revine la pasul 1. Pentru fiecare fisier sursa MASM (TASM) creeaza: a. un fisier obiect cu extensia implicita .OBJ; b. un fisier listing cu extensia implicita .LST; c. un fisier de referinte incrucisate cu extensia implicita .CRF. Daca se doreste legarea de module scrise in asamblare, cu module scrise intr-un limbaj de nivel inalt, acestea se vor compila in fisiere obiect. 3. Optional, se foloseste LIB pentru editarea legaturilor pentru mai multe fisiere obiect plasate intr-un singur fisier biblioteca cu extensia implicita .LIB. Acest lucru se intimpla cind se doreste legarea unor fisiere obiect standard la mai multe programe. 4. Se foloseste LINK (TLINK) pentru a combina toate fisierele obiect si modulele biblioteca ce formeaza un program in cadrul unui singur fisier executabil care are extensia implicita .EXE. Optional se poate crea si o harta de alocare a memoriei, cu extensia implicita .MAP. 5. Pentru convertirea (daca este necesara) fisierelor executabile in format binar, se foloseste comanda externa EXE2BIN. Aceasta operatie este necesara pentru programele scrise in format COM (care vor avea extensia .COM) si se va omite pentru programele scrise in format EXE. 6. Se depaneaza programul pentru depistarea erorilor de logica utilizind una din urmatoarele tehnici:
CREF
nume.LST ASAMBLARE ( MASM, TASM ) (fisier de listare) ( fisier referinte incrucisate ) nume.OBJ (modul obiect)
nume.LIB
(fisier biblioteca)
d. utilizarea depanatorului simbolic CV (TD) pentru depanare dinamica. Pentru depanare dinamica se poate utiliza si utilitarul DEBUG pus la dispozitie de sistemul de operare. Sugestiv, procedura de dezvoltare a unui program in limbaj de asamblare este prezentata in figura 1.1. Figura 1.1. Comenzi necesare dezvoltarii unui program Sintaxa comenzii de asamblare este urmatoarea : MASM [optiuni] sursa [,[obiect] [,[listing] [, [referinte_incrucisate]]]] [;]
Exemplu:
Pentru fisierul sursa SUCCES.ASM, se poate introduce comanda: MASM SUCCES ; In urma executarii acestei comenzi, va rezulta fisierul SUCCES.OBJ. Pentru a se asambla acelasi fisier sursa si a se obtine o cantitate maxima de informatii necesare in vederea depanarii simbolice a acestuia, se va utiliza comanda: MASM /V /Z /ZI SUCCES ; Optiunile /V si /Z indica programului MASM sa transmita pe ecran in timpul asamblarii informatii suplimentare statistice si despre eventualele erori de asamblare. Optiunea /ZI indica programului MASM sa includa in fisierul obiect informatiile necesare depanatorului simbolic CODEVIEW. Cu aceasta comanda, vor rezulta trei fisiere: SUCCES.OBJ, SUCCES.LST si SUCCES.CRF. Convertirea fisierelor de referinte incrucisate produse de MASM din format binar in format text se face cu utilitarul CREF. Sintaxa comenzii este: CREF referinte_incrucisate [, listing_referinte_incrucisate ] [;] Fisierul rezultat are extensia implicita .REF. Exemplu: Pentru convertirea fisierului cu referinte incrucisate SUCCES.CRF in fisierul text corespunzator, se va folosi comanda: CREF SUCCES; in urma careia va rezulta fisierul SUCCES.REF. Fisierele obiect create cu MASM pot fi convertite in fisiere biblioteca cu ajutorul programului bibliotecar LIB. Sintaxa comenzii este: LIB bibl_veche [/PAGESIZE: numar] [comenzi] [, [listing] [, [ bibl_noua ]]] [;] Exemplu: Sa consideram ca MASM a fost utilizat pentru asamblarea a doua fisiere sursa ce contin proceduri grafice si ca aceste proceduri trebuie apelate din citeva programe diferite. Fisierele obiect ce contin procedurile respective sunt PUNCTE.OBJ si LINII.OBJ. Acestea se vor grupa in fisierul GRAF.LIB, astfel: LIB GRAF + PUNCTE + LINII ;
Daca se doreste adaugarea unui alt fisier obiect, numit CERCURI.OBJ si in acelasi timp obtinerea unei listari a procedurilor din biblioteca, se poate folosi comanda: LIB GRAF + CERCURI , GRAF.LST Editarea legaturilor se face cu ajutorul programului LINK, care are urmatoarea sintaxa: LINK [optiuni] fisier_obiect [, [fisier_executabil] [, [fisier_mapare] [, [fisiere_biblioteca]]]] [;] Exemplu: Consideram ca dorim sa cream un fisier executabil din modulul unic SUCCES.OBJ, modulul sursa fiind scris in formatul EXE si asamblat cu optiunea /ZI. Programul este depanabil cu COCEVIEW si pentru a realiza acest lucru editarea legaturilor se face cu comanda: LINK /CO SUCCES ; Fisierul rezultat este SUCCES.EXE. El contine informatii simbolice si referitoare la numarul liniilor sursa. Programul executabil obtinut se poate rula de la linia de comanda DOS sau de sub depanatorul simbolic CODEVIEW. Dupa depanarea programului se poate crea o versiune finala, fara informatii simbolice. Pentru aceasta se utilizeaza comanda: LINK SUCCES ; Aceasta linie de comanda se poate utiliza si cind fisierul sursa a fost creat in format COM. Totusi, in acest caz, fisierul SUCCES.EXE rezultat nu este direct executabil. Pentru a putea fi rulat, se mai trece printr-o etapa suplimentara de convertire in format executabil COM. Daca se doreste crearea unui program de dimensiuni mari, denumit PICT.EXE, did doua fisiere obiect PICT1 si PICT2 si care apeleaza proceduri externe din fisierul biblioteca GRAF.LIB descris mai sus, se va utiliza comanda: LINK /CO PICT1 PICT2 , , , GRAF ; Este necesar ca fisierul GRAF.LIB sa se afle in directorul curent sau in cel descris prin variabila de mediu LIB. In fisierul sursa, procedurile apelate se vor declara externe. Convertirea in format executabil COM se face cu utilitarul EXE2BIN, furnizat drept comanda externa de sistemul de operare. Linia de comanda este: EXE2BIN fisier_executabil [ fisier_binar ]
EXE2BIN SUCCES SUCCES.COM Trebuie retinut ca specificarea extensiei .COM este obligatorie, implicita fiind extensia .BIN. De asemenea, fisierul .EXE convertit trebuie generat din fisiere sursa si obiect in format COM. Depanarea programelor se face uzual cu depanatorul simbolic CODEVIEW. Sintaxa liniei de comanda este: CV [ optiuni ] fisier_executabil [ argumente ] Exemplu: Pentru depanarea programului SUCCES.EXE generat anterior se face comanda: CV SUCCES Pentru a fi posibila depanarea simbolica, asamblarea trebuie sa fi fost facuta cu optiunea /ZI si editarea legaturilor cu optiunea /CO. Exista anumite optiuni ale CODEVIEW utile in diverse situatii. De exemplu, programele grafice necesita intotdeauna utilizarea optiunii /S. Astfel depanarea programului grafic CERCURI.COM se va face cu: CV /V /I /S CERCURI.COM Optiunile /V si /I specifica utlizarea anumitor facilitati specifice microcalculatoarelor compatibile IBM-PC. Extensia .COM trebuie specificata explicit, pentru ca cea implicita este .EXE. Daca se doreste ca depanarea programului sa se faca cu depanatorul DEBUG, se va proceda astfel: a. Se lanseaza DEBUG in executie tastind in linia DOS de comanda numele DEBUG; b. Se introduce numele programului ce trebuie depanat, ca parametru al comenzii N a depanatorului; c. Se incarca programul specificat la punctul anterior cu comanda L a depanatorului; d. Se ruleaza apoi programul de depanat sub controlul DEBUG, vizualizindu-se rezultatele partiale si valorile curente ale registrelor de lucru in punctele critice ale programului. Pentru pachetul de programe TASM, a carui utilizare este recomandata, comenzile necesare dezvoltarii unui program au o sintaxa asemanatoare cu cea a comenzilor din MASM, deosebindu-se insa anumite optiuni, astfel: Sintaxa comenzii de asamblare este urmatoarea :
Exemplu:
TASM [optiuni] sursa [, obiect] [, listing] [, referinte_incrucisate] in care optiunile cele mai utilizate au urmatoarea semnificatie: /l - genereaza fisier de listare ; /z - afisaza linia sursa cu mesaj de eroare; / zi - aceeasi semnificatie ca la MASM. Editarea legaturilor se face cu programul TLINK, care are urmatoarea sintaxa: TLINK [optiuni] fisier_obiect [, fisier_executabil] [, fisier_mapare] [fisiere_biblioteca] in care optiunile cele mai utilizate au urmatoarea semnificatie: /v - ofera informatii simbolice complete pentru TD, numai daca asamblarea s-a efectuat cu optiunea /zi; /t - creaza fisier COM.