Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Utilizarea macroinstructiunilor

calculatoare



+ Font mai mare | - Font mai mic



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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 3005
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved