Sunteți pe pagina 1din 8

LUCRAREA NR.

1 Descrierea pachetului de programe MASM (I)


Scopul lucrrii Lucrarea urmreste familiarizarea studenilor cu mediul de dezvoltare a programelor scrise n limbaj de asamblare, pus la dispoziie de ctre macroasamblorul MASM, versiunea 5.00 (sau TASM, versiunea 3.2). Se prezint, pe scurt, componentele pachetului de programe MASM (TASM) i procedura general de lucru cu acesta. Chestiuni teoretice Introducere Pachetul de programe MASM (TASM), pune la dispoziia utilizatorului toate instrumentele necesare pentru dezvoltarea programelor scrise n limbaj de asamblare. Macroasamblorul MASM (TASM) produce module obiect relocabile din fiiere surs scrise n limbaj de asamblare. n scopul obinerii unor programe executabile sub sistemul de operare DOS, aceste module obiect se pot "lega" ntre ele cu programul LINK (TLINK). Pachetul de programe MASM (TASM) cuprinde: - macroasamblorul MASM (TASM); - generatorul de referine ncruciate CREF; - editorul de legturi LINK (TLINK); - bibliotecarul LIB; - utilitarul MAKE; - depanatorul simbolic Code View - CV (Turbo Debugger - TD). Pentru depanare se poate folosi i depanatorul standard al sistemului de operare DOS, DEBUG. Sunt posibile urmtoarele forme de fiiere executabile: EXE - Este formatul uzual pentru fiiere executabile sub sistemul de operare DOS. Programele executabile pstrate n acest format pot avea segmente multiple. Este formatul recomandat pentru programe de dimensiuni mari. Extensia implicit a acestor programe este .EXE; COM - Programele n acest format sunt limitate la un singur segment, ele nedepind 64 Ko (exceptnd cazurile cnd nu se

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

; nceputul segmentului de date data2

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

Exemplu de program in format COM:


TITLE succes_com text SEGMENT ASSUME cs: text, ds: text, ss: text ORG 100h start: jmp inceput mesaj DB "Mult succes in utilizarea MASM !", 0dh, 0ah lmesaj EQU $ - mesaj inceput:mov bx, 1 mov cx, lmesaj mov dx, OFFSET mesaj mov ah, 40h int 21h mov ax, 4c00h int 21h text ENDS END start Programele COM difera de programele EXE in urmatoarele puncte: 1. Directiva .MODEL nu poate fi folosita la definirea segmentelor implicite pentru fisiere COM. Cu toate acestea, definirea segmentelor nu este dificila, intrucit este utilizat numai un singur segment; 2. Toate registrele de segment sunt asignate unui aceluiasi segment prin utilizarea directivei ASSUME. Aceasta indica asamblorului segmentul ce trebuie asociat cu fiecare registru de segment; 3. Directiva ORG se utilizeaza pentru a indica inceperea asamblarii de la octetul 256 (100h). Se creaza astfel un spatiu pentru prefixul segmentului de program (PSP), care este automat incarcat in memorie in momentul executiei;

Exemplu de program in format EXE:


TITLE succes_exe DOSSEG .MODEL SMALL .STACK 100h .DATA mesaj DB "Mult succes in utilizarea MASM (TASM) !", 0dh, 0ah lmesaj EQU $ - mesaj ; Lungimea mesajului .CODE start: mov ax, @DATA ; Se initializeaza registrul DS mov ds, ax ; cu adresa de baza a segmetului de date mov bx, 1 mov cx, lmesaj mov dx, OFFSET mesaj mov ah, 40h int 21h ; Apel functie DOS pentru afisarea unui sir ; cu lungimea precizata in registrul DX mov ax, 4c00h int 21h ; Iesire in sistem END start

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)

LIB LINKEDITARE ( LINK, TLINK ) DEBUG (DOS) EXE2BIN


nume.COM EXECUTIE (sub MS-DOS)

nume.LIB
(fisier biblioteca)

Apeluri de proceduri externe

nume.EXE (modul executabil)


CODEVIEW - CV TURBODEBUGGER - TD

Depanare (numai format EXE)

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.

Observatie: Celelalte comenzi sunt identice cu cele oferite de


pachetul MASM. Modul de lucru 1. Se vor studia directivele pentru definirea si utilizarea segmentelor logice. 2. Se vor edita, asambla si rula programele prezentate in format .EXE si .COM. 3. Se va edita, asambla si rula o varianta a programului prezentat inlocuind directivele de segment simplificate cu directive nesimplificate (SEGMENT, ASSUME, ENDS). 4. Se vor obtine si analiza fisierele listing si de referinte incrucisate. 5. Se vor testa cit mai multe dintre optiunile de lucru ale macroasamblorului MASM (TASM). 6. Se vor rula sub CV sau TD programele realizate. Continutul referatului 1. Listingul programului realizat la punctul 3 de la modul de lucru. 2. Observatiile si comentariile studentului.

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