CATEGORII DOCUMENTE |
Utilizarea macroinstructiunilor
1 Generalitati
La fel ca in cazul utilizarii subrutinelor, atunci cand intr-un program se foloseste de mai multe ori un bloc de instructiuni, acesta poate fi scris o singura data sub forma unei macroinstructiuni (numita si macrodefinitie) si reutiliza apoi in punctele in care este necesar.
Blocul continut de o macroinstructiune va fi automat inserat in programul obiect in urma procesului de asamblare, ca si cum ele ar fi fost scrise ca atare in programul sursa. Acest proces se numeste expandare a macroinstructiunii (macroexpandare).
Rezulta ca utilizarea de macroinstructiuni nu economiseste spatiu in memoria de program, in schimb usureaza munca programatorului. In plus, spre deosebire de subrutine, macroinstructiunile admit parametri expliciti, precum si unele directive specifice care cresc productivitatea dezvoltarii programelor. Si din punct de vedere al vitezei, macroinstructiunile sunt preferabile, deoarece elimina necesitatea salturilor suplimentare introduse de subrutine. Aceste salturi penalizeaza puternic viteza procesoarelor care au coada de asteptare in care instructiunile se extrag anticipat in ordine, coada care trebuie golita integral la aparitia unui salt.
Totusi, utilizarea macroinstructiunilor genereaza anumite dificultati, a caror rezolvare va fi prezentata in cele ce urmeaza.
2 Declararea si utilizarea macroinstructiunilor
Declararea unei macroinstructiuni se face in forma urmatoare:
Nume MACRO [parametri formali]
[REPT]
[IRP]
[IRPC]
corpul macroinstructiunii
ENDM
Termenii pusi in paranteze drepte sunt optionali (pot sa apara sau sa nu apara la o macroinstructiune).
Corpul macroinstructiunii contine date, instructiuni, din care unele care se pot referi la eventualii parametri, si chiar alte apeluri de macroinstructiuni sau subrutine.
Unele asambloare cer ca eventualele comentarii din declararea macroinstructiunii sa fie precedate in mod obligatoriu de ';;' deoarece la expandare din cele doua caractere ';' va ramane unul singur.
Macroinstructiunile se declara de regula la inceputul zonei de cod, inainte de eticheta de intrare in programul principal (START: ).
Utilizarea unei macroinstructiuni in program se face prin scrierea numelui acesteia urmat de lista de parametri actuali (cu valorile necesare in punctul respectiv).
Nume [parametri actuali]
Exemplul 1:
Fie programul de trasare a unei drepte orizontale cu parametrii x1,y1, lungimea si culoarea din lucrarea 10, punctul P10.10. Scriind sirul de instructiuni care traseaza linia ca o macroinstructiune, programul poate fi pus in urmatoarea forma:
.MODEL SMALL
.STACK 200H
.DATA
x1=100 ;Aici se declara parametrii liniilor
y1=50
lung=200
culoarea=5
.CODE
;Aici se declara macroinstructiunea de trasare linie
Linieo macro
mov di,x1 ;DI contine X1
mov bp,y1 ;BP contine Y1
mov cx,lung ;CX contine numarul de puncte
mov al,culoarea;In AL este culoarea
mov dx,bp ;Se face inmultirea
shl dx,6 ;lui BP (adica a lui Y1) cu 320
shl bp,8 ;Prin copiere in DX
add bp,dx ;deplasari la stanga si adunare
add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala
repz stosb ;Se face transferul sirului
endm
Start:
;Mod video 320x200
mov ah,0
mov al,13h
int 10h
MOV AX, 0A000H; Adresa segment ecran in modul 13
MOV ES, AX ;in ES
Linieo ;Aici s-a chemat macroinstructiunea
oprire:
jmp oprire
END Start
Avand insa in vedere posibilitatile comode de transmitere a parametrilor catre o macroinstructiune, mai corect ar fi ca sa se scrie lista de parametri formali la declarare si de parametri actuali la utilizare. De exemplu, un programu care traseaza doua linii ar lua forma urmatoare:
Exemplul 2:
.MODEL SMALL
.STACK 200H
.DATA
x1=50
y1=50
lung=100
culoarea=0Eh
.CODE
;Aici se declara macroinstructiunea de trasare linie
Linieo macro x1,y1,lung,culoarea; parametrii ;formali
mov di,x1 ;DI contine X1
mov bp,y1 ;BP contine Y1
mov cx,lung ;CX contine numarul de puncte
mov al,culoarea;In AL este culoarea
mov dx,bp ;Se face inmultirea
shl dx,6 ;lui BP (adica a lui Y1) cu 320
shl bp,8 ;Prin copiere in DX
add bp,dx ;deplasari la stanga si adunare
add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala
repz stosb ;Se face transferul sirului
endm
Start:
;Mod video 320x200
mov ah,0
mov al,13h
int 10h
MOV AX, 0A000H; Adresa segment ecran in modul 13
MOV ES, AX ;in ES
linieo 10,100,30,2 ;Parametrii actuali ai primei ;linii
linieo 20,120,30,1 ;Parametrii actuali ai altei ;linii
oprire:
jmp oprire
END Start
Observatii: In programul precedent nu era de fapt necesara declararea initiala a unor valori pentru x1,y1, lung si culoarea. Daca aceasta declarare apare, ea nu are nici un efect asupra macroinstructiunii, chiar daca in declararea acesteia s-au folosit aceleasi simboluri. Daca insa la utilizarea macroinstructiunii sunt puse aceste simboluri, ele vor lua ca valori actuale cele declarate explicit (50,50,100 si OEh).
Modul de lucru.
P 1 Sa se scrie si sa se testeze programul din exemplul 2. Se va observa mai intai in fisierul de listare modul in care macroinstructiunea este expandata in cele doua puncte unde este apelata si cum apar parametrii actuali. Apoi se vor modifica parametrii actuali ai uneia dintre utilizari, folosind simbolurile declarate in partea de date a programului, si se va observa in fisierul de listare cum sunt inlocuite aceste simboluri.
Se va mai declara in partea de date un alt set de simboluri, x1=150,y1=60,lung=30,culoarea=8, care vor fi folosite pentru trasarea unei a treia linii orizontale.
3 Utilizarea etichetelor locale cu directiva LOCAL
Daca, la declararea unei macroinstructiuni, in corpul acesteia exista etichete catre care se fac salturi, la expandarea in mai multe locuri se vor genera mesaje de eroare de tip 'simbol deja utilizat in alta parte'. Nu se va mai putea sti catre care din simbolurile identice aparute in urma expandarii sa se faca saltul.
Pentru a se evita aceasta situatie, daca in declararea unei macroinstructiuni se folosesc simboluri, se va folosi inainte de corpul macroinstructiunii directiva LOCAL urmata de lista de simboluri.
Nume MACRO [parametri formali]
LOCAL simbol1,simbol2,.
corpul macroinstructiunii
ENDM
In urma expandarii, simbolurile vor fi renumite automat de catre asamblor sub forma ??0001, ??0002, pana la ??9999 si nu vor mai fi posibile erori.
Exemplul 3:
.MODEL SMALL
.STACK 200H
.DATA
x1=50
y1=50
lung=100
culoarea=0Eh
.CODE
Liniev macro x1,y1,lung,culoarea
local Lv1
mov di,x1 ;DI contine X1
mov bp,y1 ;BP contine Y1
mov cx,lung ;CX contine numarul de puncte
mov al,culoarea;In AL este culoarea
mov dx,bp ;Se face inmultirea
shl dx,6 ;lui BP (adica a lui Y1) cu 320
shl bp,8 ;Prin copiere in DX
add bp,dx ;deplasari la stanga si adunare
add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala
Lv1: add di,320 ;Noul punct este cu 320 mai ;departe in memoria de ecran
mov es:[di],al ;Pune punctul
loop Lv1 ;Repeta de CX ori
endm
Start:
;Mod video 320x200
mov ah,0
mov al,13h
int 10h
MOV AX, 0A000H; Adresa segmentului ecran mod 13
MOV ES, AX ;in ES
liniev x1,y1,lung,culoarea
liniev 20,120,30,1
oprire:
jmp oprire
END Start
Se observa ca in macroinstructiunea de trasare a unei linii verticale exista o bucla cu eticheta Lv1. Aceasta este declarata cu directiva LOCAL Lv1, astfel ca daca este utilizata in mai multe locuri, la expandarile respective simbolul va capata automat denumiri diferite.
Modul de lucru
P 2 Se va relua programul de desenare a unui dreptunghi din lucrarea precedenta (P 11.2) folosind macroinstructiuni.
P 3 Se va scrie un program care sa traseze un triunghi dreptunghic isoscel cu ipotenuza orizontala si unul cu ipotenuza oblica folosind macroinstructiuni pentru linii oblice , orizontale si verticale.
P 4 Se va relua programul de afisare a unor dreptunghiuri aleatoare cu parametri din memorie, prezentat in lucrarea precedenta (P 11.5) folosind macroinstructiuni.
4 Alte facilitati de macroasamblare
Exista o serie de directive suplimentare de macroasamblare care permit un formalism de nivel crescut al scrierii fisierului sursa, lasand macroasamblorului sarcina expandarii la nivel de limbaj de asamblare obisnuit. Desi aceste facilitati sunt foarte puternice, ele sunt destul de rar necesare, datorita posibilitatilor de integrare a programelor scrise in limbaj de asamblare in programe scrise in limbaj de nivel inalt sau mediu care pot prelua partea formala. Vom da in continuare, succint, numai cateva exemple de astfel de facilitati. Ele depind totusi de implementare si se recomanda consultarea documentatiei asamblorului de care se dispune pentru a vedea forma sintactica si toate optiunile prezente.
Macrodefinitia REPT este folosita atunci cand corpul macroinstructiunii respective trebuie transcris de mai multe ori. Forma sintactica obisnuita este urmatoarea:
REPT expresie
Corpul macro care se va repeta
ENDM
Ca efect, instructiunile din corp se vor repeta de un numar de ori egal cu valoarea expresiei.
Expresia poate fi un numar, un simbol care a fost asignat numeric anterior, sau poate fi o structura mai complexa aritmetica sau logica.
In macroinstructiuni si expresii se admit diversi operatori cum ar fi & (substituire), <> (sir de caractere pentru texte), ! (sir de caractere), % (expresie), precum si structuri de tip IF.ELSE.ENDIF.
Alte definitii utile in macroinstructiuni sunt IRP (repetare cu parametri) si IRPC (repetare cu parametru sir).
Macroinstructiunile pot fi imbricate (se poate chema o macroinstructiune din corpul alteia) si admit recursivitate - o macroinstructiune se poate chema pe ea insasi de atatea ori cate argumente se afla in lista de apel. Ele pot fi de asemenea anulate pe parcursul unui program pentru eliberarea memoriei 'heap' (cu directiva PURGE) sau redefinite. Este admisa de catre unele asambloare chiar si folosirea unui nume rezervat pentru numirea unei macroinstructiuni, aparand insa un mesaj de avertizare.
Se recomanda ca alte elemente ale limbajului de asamblare sa fie consultate in documentatia asamblorului cu care se lucreaza, ele fiind utile atunci cand se scriu programe deosebit de lungi si complexe exclusiv in limbaj de asamblare.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 3039
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved