Sunteți pe pagina 1din 24

CAPITOLUL 3 ELEMENTELE LIMBAJULUI DE ASAMBLARE

Limbajul main al unui sistem de calcul (SC) este format din totalitatea instruciunilor main puse la dispoziie de procesorul SC. Acestea se reprezint sub forma unor iruri de bii cu semnificaie prestabilit. Limbajul de asamblare al unui calculator este un limbaj de programare n care setul de baz al instruciunilor coincide cu operaiile mainii i ale crui structuri de date coincid cu structurile primare de date ale mainii. Limbaj simbolic. Simboluri - Mnemonice + etichete. Elementele cu care lucreaz un asamblor sunt: * etichete - nume scrise de utilizator, cu ajutorul crora acesta refera date sau zone de memorie. * instruciuni - scrise sub forma unor mnemonice care sugereaz aciunea. Asamblorul genereaz octeii care codific instruciunea respectiv. * directive - sunt indicaii date asamblorului n scopul generarii corecte a octetilor. Ex: relaii ntre modulele obiect, definirea unor segmente, indicaii de asamblare condiionat, directive de generare a datelor. * contor de locaii - numr ntreg gestionat de asamblor. n fiecare moment, valoarea contorului coincide cu numrul de octei generai corespunztor instruciunilor i directivelor deja ntlnite n cadrul segmentului respectiv (deplasamentul curent n cadrul segmentului). Programatorul poate utiliza aceast valoare (accesare doar n citire!) prin simbolul '$'.

3.1. FORMATUL UNEI LINII SURS Formatul unei linii surs n limbajul de asamblare 8086 este urmtorul: [etichet] [mnemonic] [operanzi] [;comentariu] Caracterele din care poate fi constituit o etichet sunt A - Z a - z _ @ $ ? 0 - 9 1). etichete de cod, care apar n cadrul secvenelor de instruciuni (segmente de cod) cu scopul de a defini destinaiile de transfer ale controlului n cadrul unui program. 2). etichete de date, care identific simbolic unele locaii de memorie, din punct de vedere semantic ele fiind echivalentul noiunii de variabil din alte limbaje. Valoarea unei etichete n limbaj de asamblare este un numr ntreg reprezentnd adresa instruciunii sau directivei ce urmeaz etichetei. Diferena ntre accesarea adresei i respectiv a coninutului unei locaii cu nume se face n funcie de contextul utilizrii. Exemplu: lea ax, v ; ncarc n registrul ax adresa variabilei v mov ax, v ; ncarc n registrul ax coninutul variabilei v Exist dou tipuri de mnemonice: mnemonice de instruciuni i nume de directive. Directivele dirijeaz asamblorul. Ele specific modul n care asamblorul va genera codul obiect. Instruciunile dirijeaz procesorul. Operanzii sunt parametri care definesc valorile ce vor fi prelucrate de instruciuni sau de directive. Ei pot fi regitri, constante, etichete, expresii, cuvinte cheie sau alte simboluri. Semnificaia operanzilor depinde de mnemonica instruciunii sau directivei asociate. 3.2. EXPRESII
2

expresie - operanzi + opeartori. Operatorii indic modul de combinare a operanzilor n scopul formrii expresiei. Expresiile sunt evaluate n momentul asamblrii (adic, valorile lor sunt determinabile la momentul asamblrii, cu excepia acelor pri care desemneaz coninuturi de regitri i care vor fi determinate la execuie). 3.2.1. Moduri de adresare Operanzii instruciunilor pot fi specificai sub forme numite moduri de adresare. Cele trei tipuri de operanzi sunt: operanzi imediai, operanzi registru i operanzi n memorie. Valoarea operanzilor este calculat n momentul asamblrii pentru operanzii imediai, n momentul ncrcrii programului pentru adresarea direct i n momentul execuiei pentru operanzii registru i cei adresai indirect. 3.2.1.1. Utilizarea operanzilor imediai Operanzii imediai sunt formai din date numerice constante calculabile la momentul asamblrii. Deplasamentele etichetelor de date i de cod reprezinta valori determinabile la momentul asamblarii care rmn constante pe tot parcursul execuiei programului lea ax, v ; transfer n registrul ax a deplasamentului variabilei v

va putea fi evaluat la momentul asamblrii drept de exemplu lea ax, 0008 ; distan de 8 octei fa de nceputul segmentului de date

Similar, jmp et eval.la jmp [0004] aceasta nsemnnd salt cu 4 octei mai jos fa de poziia curent. 3.2.1.2. Utilizarea operanzilor registru
3

Modul de adresare direct - mov ax,bx adresare indirecta - pentru a indica locaiile de memorie - mov ax,[bx] 3.2.1.3. Utilizarea operanzilor din memorie Operanzii din memorie : cu adresare direct i cu adresare indirect. Operandul cu adresare direct este o constant sau un simbol care reprezint adresa (segment i deplasament) unei instruciuni sau a unor date. Aceti operanzi pot fi etichete (de ex: jmp et), nume de proceduri (de ex: call proc1) sau valoarea contorului de locaii (de ex: b db $-a). Deplasamentul unui operand cu adresare direct este calculat n momentul asamblrii (assembly time). Adresa fiecrui operand raportat la structura programului executabil (mai precis stabilirea segmentelor la care se raporteaz deplasamentele calculate) este calculat n momentul editrii de legturi (linking time). Adresa fizic efectiv este calculat n momentul ncrcrii programului pentru execuie (loading time). 3.2.1.4. Operanzi cu adresare indirect Operanzii cu adresare indirect utilizeaz regitri pentru a indica adrese din memorie. Deoarece valorile din regitri se pot modifica la momentul execuiei, adresarea indirect este indicat pentru a opera n mod dinamic asupra datelor. Regitrii ce pot fi folosii n adresarea indirect: BX, BP (regitri de baz), DI i SI (regitri index). Orice tentativ de a folosi ali regitri, diferii de cei patru de mai sus, ntr-o instruciune care acceseaz memoria indirect, va produce o eroare. Forma general pentru accesarea indirect a unui operand de memorie este dat de formula de calcul a offset-ului unui operand: [registru_de_baz + registru_index + constanta]
4

Constanta este o expresie a crei valoare este determinabil la momentul asamblrii. De exemplu, [bx + di + table + 6] desemneaz un operand prin adresare indirect, n ceea ce privete regulile implicite de determinare a adresei de segment corespunztoare unui deplasament specificat, acestea sunt: dac n expresia de calcul a deplasamentului este folosit ca registru de baz BX sau dac nu este specificat nici un registru de baz, la calculul adresei efective a unui operand cu adresare indirect, procesorul utilizeaz DS ca registru de segment implicit. Dac BP este folosit oriunde n operand, registrul de segment implicit este SS. Orice operator care indic adunarea (+,[],.) poate fi folosit pentru a combina deplasamentul cu regitri de baz sau index. De exemplu, urmtoarele moduri de specificare sunt toate echivalente: table [bx] [di] + 6 6 + table [bx+di] [table+bx+di] + 6 [bx][di].table + 6 [bx+6][di] + table table [di] [bx] + 6 bx + di + table[6] di + table + bx[6]

Cnd se utilizeaz modurile de adresare baz-index, unul dintre regitri trebuie s fie registru de baz, iar cellalt trebuie s fie registru index. Urmtoarele instruciuni sunt incorecte: mov ax, table [bx] [bp] mov ax, table [di] [si] ;ilegal - doi regitri de baz! ;ilegal - doi regitri index!

Deci, s reinem c pentru adresarea indirect, esenial este specificarea ntre paranteze drepte a cel puin unuia dintre elementele componente ale formulei de calcul a offsetului. 3.2.2. Utilizarea operatorilor Operatori - pentru combinarea, compararea, modificarea i analiza operanzilor. Unii operatori lucreaz cu constante ntregi, alii cu valori ntregi memorate, iar alii cu ambele tipuri de operanzi.
5

Este important nelegerea diferenei dintre operatori i instruciuni. Operatorii efectueaz calcule cu valori constante determinabile la momentul asamblrii. Instruciunile efectueaz calcule cu valori ce pot fi necunoscute pn n momentul execuiei. Operatorul de adunare (+) efectueaz adunarea n momentul asamblrii; instruciunea ADD efectueaz adunarea n timpul execuiei. Operatorii ce pot fi folosii n cadrul expresiilor limbajului de asamblare 8086 (operatorii de pe aceeai linie au prioritate egal) : maxim 1 2 3 4 5 6 7 8 9 10 11 12 13 minim

(), [], <>, LENGTH, SIZE, WIDTH, MASK .(selector pentru membru al unei structuri) HIGH,LOW +,- (unar) : (precizarea explicit a segmentului) PTR, OFFSET, SEG, TYPE, THIS *, /, MOD, SHL, SHR +,- (binar) EQ, NE, LT, LE, GT, GE NOT AND OR, XOR SHORT, .TYPE, SMALL, LARGE

3.2.2.1. Operatori aritmetici OPERATOR SINTAXA SEMNIFICAIE


6

+ * / MOD + 3.2.2.2. Operatorul de indexare

+ expresie - expresie expresie1 * expresie2 expresie1 / expresie2 expr1 MOD expr2 expresie1 + expresie2 expresie1 - expresie2

pozitiv (unar) negativ (unar) nmulire mprire ntreag rest (modulo) adunare scdere

Operatorul de indexare ([]) indic o adunare. El este similar cu operatorul de adunare (+). Sintaxa lui este [expresie_1] [expresie_2] 3.2.2.3. Operatori de deplasare de bii expresie SHR cu_ct i expresie SHL cu_ct

mov ax, 01110111b SHL 3 ; desemneaz valoarea 10111000b add bx, 01110111b SHR 3 ; desemneaz valoarea 00001110b

3.2.2.4. Operatori logici pe bii Operatorii pe bii efectueaz operaii logice la nivelul fiecrui bit al operandului (operanzilor) unei expresii. Expresiile au ca rezultat valori constante. OPERATOR SINTAXA SEMNIFICAIE
7

NOT AND OR XOR

NOT expresie expr1 AND expr2 expr1 OR expr2 expr1 XOR expr2

complementare bii I bit cu bit SAU bit cu bit SAU exclusiv bit cu bit

Exemple (presupunem c expresia se reprezint pe un octet): NOT 11110000b ; desemneaz valoarea 00001111b 01010101b AND 11110000b ; are ca rezultat valoarea 01010000b 01010101b OR 11110000b ; are ca rezultat valoarea 11110101b 01010101b XOR 11110000b ; are ca rezultat valoarea 10100101b 3.2.2.5. Operatori relaionali Un operator relaional compar (cu semn!) dou expresii i ntoarce valoarea adevrat (-1) cnd condiia specificat de operator este ndeplinit, sau valoarea fals (0) cnd nu este ndeplinit. Indiferent de dimensiunea de reprezentare, valoarea -1 se reprezint n cod complementar ca un ir de bii, avnd toi valoarea 1. Expresiile evaluate au ca rezultat valori constante. Numele i semantica acestor operatori sunt similare celor din FORTRAN. Ei sunt: EQ (EQual), NE (Not Equal), LT (Less Than), LE (Less or Equal), GT (Greater Than) i GE (Greater or Equal). Exemple: 4 EQ 3 ; fals (0) - 4 LT 3 ; adevrat (-1) 4 NE 3 ; adevrat (-1) - 4 GT 3 ; fals (0) 3.2.2.6. Operatorul de specificare a segmentului Operatorul de specificare a segmentului (:) comand calcularea adresei FAR a unei variabile sau etichete n funcie de un anumit segment. Sintaxa este: segment:expresie ss:[bx+4] ; deplasamentul e relativ la SS
8

es:082h date:var

; deplasamentul e relativ la ES ; adresa de segment este adresa de nceput a segmentului cu numele date, iar offsetul este valoarea etichetei var.

3.2.2.7. Operatori de tip Specific sau analizeaz tipurile unor expresii i a unor operanzi pstrai n memorie. Operatorul PTR Operatorul PTR specific tipul (neles n sensul dimensiunii de reprezentare) pentru o variabil sau o etichet de cod. Sintaxa este tip PTR expresie Operatorul foreaz ca expresie s fie tratat ca avnd dimensiunea de reprezentare tip, fr ns a-i modifica definitiv (distructiv) valoarea n sensul precizat de conversia dorit. De aceea, operatorul PTR este considerat un operator de conversie (temporar) nedistructiv. Pentru operanzii pstrai n memorie, tip poate fi BYTE, WORD, DWORD avnd dimensiunile de reprezentare 1, 2, respectiv 4 octeti. Pentru etichetele de cod el poate fi NEAR (adres pe 2 octei) sau FAR (adres pe 4 octei). Expresia byte ptr A va indica doar primul octet de la adresa indicat de A. Analog, dword ptr A indic dublucuvntul ce ncepe la adresa A. Operatorul THIS creeaz un operand ale crui valori de deplasament i segment sunt egale cu valoarea curent a contorului de locaii : THIS tip Reiese deci c forma THIS tip este echivalent cu tip PTR $. Astfel de forme se utilizeaz de obicei pentru iniializarea unor simboluri cu lungimea (dimensiunea) unui tablou. De exemplu:
9

lg lg

dw dw

this word table word ptr $ table

este o form de definire echivalent cu

Operatorii HIGH si LOW ntorc octetul cel mai semnificativ, respectiv cel mai puin semnificativ, al unei expresii constante reprezentat pe cuvnt. Sintaxa lor este: HIGH expresie Operatorii SEG i OFFSET Sintaxele acestor doi operatori sunt: SEG expresie i OFFSET expresie i LOW expresie

unde expresie adreseaz direct o locaie de memorie. Operatorul SEG ntoarce adresa de segment a locaiei de memorie referite. Valoarea ntoars de operatorul OFFSET este o constant reprezentnd numrul de octei dintre nceputul segmentului i locaia de memorie referit. Valorile ntoarse de aceti doi operatori sunt determinate la momentul ncrcrii programului, ele rmnnd neschimbate pe parcursul execuiei. Exemplu: s considerm eticheta V, a crei adres far este 5AFDh:0003. Atunci SEG (V+5) va avea valoarea 5AFDh iar OFFSET (V+5) va avea valoarea 0008. Deoarece modul de adresare direct n cazul regitrilor nseamn folosirea valorii din regitri, ca i caz particular operatorii SEG i OFFSET accept i regitri ca operanzi, cu efectele: SEG registru = 0 OFFSET registru = registru Ex: mov bx, SEG ax ;bx:=0 mov bx, OFFSET ax ;bx:=ax

Pe de alt parte, deoarece numele unui segment este o etichet avnd ca valoare adresa de nceput a acelui segment, s reinem c avem:
10

SEG nume_segment = nume_segment OFFSET nume_segment = 0 3.3. DIRECTIVE

Ex: mov bx, SEG data ;mov bx,data mov bx, OFFSET data ;mov bx,0

Directivele indic modul n care sunt generate codul i datele n momentul asamblrii. 3.3.1. Directive standard pentru definirea segmentelor Exist dou tipuri de directive segment: directive segment standard (SEGMENT, ENDS, ASSUME) i directive segment simplificate 3.3.1.1. Directiva SEGMENT nceputul unui segment de program este definit cu directiva SEGMENT, iar sfritul segmentului este definit cu directiva ENDS. Sintaxa unei definiri de segment este urmtoarea: nume SEGMENT [aliniere] [combinare] [utilizare] ['clasa'] nume ENDS [instruciuni]

Numele segmentului este definit de eticheta nume. Acestui nume i se asociaz ca valoare adresa de segment (16 bii) corespunztoare poziiei segmentului n memorie n faza de execuie. Argumentele opionale aliniere, combinare, utilizare i 'clasa' dau editorului de legturi i asamblorului indicaii referitoare la modul de ncrcare i combinare a segmentelor. 3.3.1.2. Directiva ASSUME i gestiunea segmentelor Directiva ASSUME stabilete care sunt segmentele active la un moment dat:
11

ASSUME CS:nume1, SS:nume2, DS:nume3, ES:nume4 Rolul directivei ASSUME este de a preciza asamblorului regitrii de segment ce trebuie utilizai pentru calculul adreselor efective ale etichetelor de date si de cod folosite n program. Prefixarea explicit a etichetelor i variabilelor cu numele registrului de segment corespunztor furnizeaz n mod imediat aceast informaie, avnd prioritate n cazul respectiv fa de asocierea declarat prin directiva ASSUME. Prezena acestei directive nu este necesar n cazul n care programul nu acceseaz etichete i variabile (astfel de programe sunt ns extrem de rare). Este foarte important de reinut faptul c rolul acestei directive nu este i de a ncrca regitrii segment cu adresele corespunztoare !

ASSUME CS:c c segment start: jmp far ptr etd etc:

;asociaz registrul segment CS cu segmentul de cod c

;salt far necondiionat la eticheta etd din cadrul segm de cod d . . . ;(nu e nevoie de ASSUME deoarece etd este forat a fi considerat FAR) jmp x ;salt near necondiionat la eticheta local x (aici este nevoie de ;ASSUME, pentru a se putea compune corect adresa fizic CS:x)

... x: . . . ends
12

ASSUME CS:d

;realizeaz o nou asociere a registrului segment CS, de aceast dat cu segmentul d. Vechea asociere este anulat; d segment etd: jmp y ... y: d ends end start ;salt near necondiionat la eticheta local y (aici este nevoie de ;ASSUME pentru a se putea compune corect adresa fizic CS:y)

jmp far ptr etc ;salt far necondiionat la eticheta etc din cadrul segm. de cod c

Observaie. Dac segmentul de cod nu conine referiri la etichete locale, prezena unei directive ASSUME nu mai este obligatorie. c segment start: jmp far ptr etd ;salt far necondiionat la eticheta etd din cadrul segmentului de cod d etc: . . . ;nu se impune aici prezena vreunei directive ASSUME deoarece eticheta local etc este referit doar ca etichet FAR din segmentul d c ends d segment etd: jmp far ptr etc ;salt far necondiionat la eticheta etc din cadrul segmentului de . . . ;cod c d ends end start n ceea ce privete ncrcarea regitrilor de segment, precizm urmtoarele: - registrul CS este ncrcat automat - registrul SS este deasemenea ncrcat automat. Dac programatorul dorete s schimbe segmentul de stiv, atunci el trebuie s ncarce noua valoare n SS - regitrii DS i ES, n cadrul programelor .EXE trebuie ncrcai de ctre programator.
13

Orice program scris n limbaj de asamblare trebuie s conin directiva END pentru marcarea sfritului codului surs al programului. Eventualele linii de program ce urmeaz directivei END sunt ignorate de ctre asamblor. Sintaxa ei este END [adresa_start] 3.3.2. Directive pentru definirea datelor definire date = declarare (specificarea atributelor) + alocare (rezervarea sp. de memorie necesar). tipul de dat = dimensiunea de reprezentare octet, cuvnt sau dublucuvnt Forma general a unei linii surs n cazul unei declaraii de date este: [nume] tip_data lista_expresii sau [nume] tip_data factor DUP (lista_expresii) [;comentariu] [;comentariu]

unde nume este o etichet prin care va fi referit data. Tipul rezult din tipul datei (dimensiunea de reprezentare) iar valoarea este adresa la care se va gsi n memorie primul octet rezervat pentru data etichetat cu numele respectiv. factor este un numr care indic de cte ori se repet lista de expresii care urmeaz n parantez. Tip_data este o directiv de definire a datelor, una din urmtoarele: DB - date de tip octet (BYTE) DW - date de tip cuvnt (WORD) DD - date de tip dublucuvnt (pointer - DWORD) De exemplu, secvena de mai jos definete i iniializeaz 3 variabile de memorie: data segment varb DB 'd' ;1 octet
14

varw DW 101b ;2 octei vard DD 2bfh ;4 octei data ends Tabpatrate DD 0, 1, 4, 9, 16, 25, 36 DD 49, 64, 81 DD 100, 121, 144, 169 Operatorul DUP se folosete pentru definirea unor blocuri de memorie iniializate repetitiv cu o anumit valoare. De exemplu Tabzero DW 100h DUP (0)

rezerv 256 de cuvinte pentru tabloul Tabzero iniializndu-le cu 0, iar Tabchar DB 80 DUP ('a')

creaz un tablou de 80 de octei iniializai fiecare cu codul ASCII al caracterului 'a'. Dac se dorete doar rezervarea de spaiu de memorie : Tabzero DW 100h DUP (?) Tabchar DB 80 DUP (?) Asamblorul considera echivalente declaraii ca: sirchar sirchar DB 'a','b','c','d' DB 'abcd'

Valoarea de iniializare poate fi i o expresie, ca de exemplu n vartest DW (1002/4+1)


15

Valoarea curent a contorului de locaii poate s fie referit cu ajutorul simbolului $ sau al expresiei this <tip>. Ca urmare, putem avea urmtoarele secvene echivalente tabcuv DW 50 DUP (?) tabcuv DW 50 DUP (?) lungtab DW $-tabcuv lungtab DW this word-tabcuv tabcuv lungtab DW 50 DUP (?) DW lungtab-tabcuv tabcuv lungtab DW 50 DUP (?) EQU this word-tabcuv

3.3.3. Directivele LABEL, EQU, = Directiva LABEL permite numirea unei locaii fr alocarea de spaiu de memorie sau generare de octei, precum i accesul la o dat utiliznd alt tip dect cel cu care a fost definit data respectiv. Sintaxa este nume LABEL tip unde nume este un simbol ce nu a fost definit anterior n textul surs, iar tip descrie dimensiunea de interpretare a simbolului i dac acesta se va referi la cod sau la date. Numele primete ca valoare contorul de locaii. Tip poate s fie una din urmtoarele: BYTE WORD DWORD data segment . . . varcuv LABEL WORD DB 1,2 . . . data ends NEAR QWORD TBYTE FAR PROC UNKNOWN code segment . . . mov ax, varcuv . . .

16

Tipul PROC (existent numai n varianta TASM) va furniza un tip NEAR sau FAR n funcie de modelul de memorie folosit n cazul utilizrii directivelor segment simplificate. Tipul UNKNOWN declar un tip necunoscut i este folosit atunci cnd se dorete s existe posibilitatea accesrii unei variabile de memorie n mai multe moduri (asem. cu void din C). data segment tempvar LABEL UNKNOWN DB ?,? . . . data ends code segment . . . mov tempvar,ax ;utilizare ca i cuvnt . . . add dl,tempvar ;utilizare ca i octet . . .

O alt soluie pentru adresarea unei date cu un alt tip dect cel cu care a fost declarat este utilizarea operatorului de conversie PTR (prezentat n 3.2.2.7). Directiva EQU permite atribuirea, n faza de asamblare, unei valori numerice sau ir de caractere unei etichete fr alocarea de spaiu de memorie sau generare de octei. Sintaxa directivei EQU este Exemple: nume EQU expresie END_OF_DATA EQU '!' BUFFER_SIZE EQU 1000h INDEX_START EQU (1000/4 + 2) VAR_CICLAREEQU i Prin utilizarea de astfel de echivalri textul surs poate deveni mai lizibil. Directiva = este echivalent directivei EQU cu excepia urmtoarelor aspecte: - etichetele definite cu EQU nu pot fi redefinite n timp ce acelea definite cu = pot.
17

operanzii expresiei directivei = trebuie s furnizeze n final o valoare numeric, nefiind permis asignarea de iruri de caractere etichetelor.

3.3.4. Directiva PROC n limbajul de asamblare 8086 definirea unei subrutine ncepe cu o directiv PROC: <nume_procedur> PROC [tip_apel] unde nume_procedur este o etichet reprezentnd numele procedurii, iar tip_apel este NEAR sau FAR. Dac lipsete, atunci se consider implicit NEAR. Directiva ENDP marcheaz sfritul unei subrutine ce ncepe cu PROC. Sintaxa ei este <nume_procedur> ENDP 3.3.5. Blocuri repetitive Un bloc repetitiv este o construcie prin care i se cere asamblorului s genereze n mod repetat o configuraie de octei. Avem trei tipuri de blocuri repetitive: REPT, IRP i IRPC. Un bloc repetitiv delimitat de directivele REPT i ENDM are urmtoarea sintax de definire: REPT contor secven ENDM cu semnificaia c secvena va fi asamblat de contor ori. De exemplu secvenele REPT dw ENDM 5 0 dw dw dw dw dw 0 0 0 0 0
18

genereaz acelai cod, lucru ce se poate realiza bineneles i cu:

dw 5 DUP (0)

Exemplul urmtor ns nu are un echiv. simplu. El genereaz 5 locaii de memorie consecutive coninnd valorile de la 0 la 4. Folosim n acest scop i directiva = : Intval = 0 care va genera REPT 5 dw Intval Intval = Intval + 1 ENDM dw dw dw dw dw 0 1 2 3 4

De asemenea, blocurile repetitive pot fi imbricate. Secvena REPT 5 REPT 2 secven ENDM ENDM genereaz de 10 ori secvena specificat. Directiva IRP are sintaxa IRP parametru, <arg1 [,arg2]...> secven ENDM Se efectueaz repetat asamblarea secvenei, cte o dat pentru fiecare argument prevzut n lista de argumente, prin nlocuirea textual n secven a fiecrei apariii a parametrului cu argumentul curent. Argumentele pot fi iruri de caractere, simboluri, valori numerice. De exemplu, IRP param,<0,1,4,9,16,25> db 0
19

db param ENDM

genereaz secvena

db db db db db

1 4 9 16 25 mov mov mov mov ax,di bx,di cx,di dx,di

iar

IRP reg,<ax,bx,cx,dx> mov reg,di ENDM genereaz secvena

Directiva IRPC are un efect similar, ea realiznd ns nlocuirea textual a parametrului, pe rnd, cu fiecare caracter dintr-un ir de caractere dat. Sintaxa ei este IRPC parametru,string secven ENDM De exemplu IRPCnr,1375 db nr ENDM creaz 4 octei avnd respectiv valorile 1, 3, 7 i 5. 3.3.6. Directiva INCLUDE Directiva INCLUDE are sintaxa INCLUDE numefisier Ex: cod segment mov ax,1 INCLUDE INSTR2.ASM push ax . . .
20

Fiierele incluse pot conine la rndul lor alte directive INCLUDE, .a.m.d. pn la orice nivel, instruciunile respective fiind inserate corespunztor pentru crearea n final a unui singur cod surs. 3.3.7. Macrouri Un macro este un text parametrizat cruia i se atribuie un nume. La fiecare ntlnire a numelui, asamblorul pune n codul surs textul cu parametrii actualizai. Operaia este cunoscut i sub numele de expandarea macroului. Se poate face o analogie cu directiva INCLUDE prezentat anterior. Fa de fiierele incluse, macrourile prezint un grad sporit de flexibilitate permind transmiterea de parametri i existena de etichete locale. Un macro este delimitat de directivele MACRO i ENDM : nume MACRO [parametru [,parametru]...] corp instruciuni ENDM De exemplu, pentru interschimbarea valorilor a dou variabile cuvnt putem defini urmtorul macro: swap MACRO a,b mov ax,a mov a,b mov b,ax ENDM Pentru nmulirea cu 4 a valorii unei variabile (rezultatul depunndu-se n DX:AX) se poate scrie urmtorul macro: inmcu4 MACRO a mov ax,a sub dx,dx shl ax,1 rcl dx,1 shl ax,1 rcl dx,1
21

ENDM O utilizare a sa sub forma inmcu4 varm va genera secvena mov sub shl rcl shl rcl ax,varm dx,dx ax,1 dx,1 ax,1 dx,1

Macrourile pot conine blocuri repetitive. n acest sens putem lua ca exemplu chiar macroul inmcu4 de mai sus, care se poate rescrie astfel: inmcu4 MACRO a mov ax,a sub dx,dx REPT 2 shl ax,1 rcl dx,1 ENDM ENDM O posibil problem ce apare se refer la definirea unei etichete ntr-un macro. S presupunem c ntrun macro se definete o etichet i n program exist mai mult de un apel al acelui macro. Eticheta definit va aprea la fiecare expandare a macroului n codul programului, cauznd o eroare de "redefinire de etichet". Exemplu: scade MACRO jcxz Etich dec cx Etich:............ ENDM
22

. . scade . . scade . .

. . . ;apare eticheta Etich ;i aici apare Etich!

Soluia unei astfel de probleme este oferit de ctre directiva LOCAL, care, la apariia ei n cadrul unui macro foreaz ca domeniul de vizibilitate al etichetelor specificate ca argumente s fie numai acel macro. Soluia pentru ex. de mai sus este: scade MACRO LOCAL Etich jcxz Etich dec cx Etich:............... ENDM cele dou apeluri consecutive de mai sus fiind translatate n . . . jcxz ??0000 dec cx ??0000: . . . jcxz ??0001 dec cx ??0001: --------------------------------------------------------------------------------------------Ex: push_reg MACRO rlitera push &rlitera&x ENDM . . . push_reg b
23

se va asambla n push bx. S facem precizarea c operatorul de substituie & poate fi utilizat i n cadrul directivelor IRP sau IRPC. De exemplu: push ax IRP rlitera,<a,b,c,d> push bx push &rlitera&x push cx ENDM genereaz push dx Dup cum am vzut, macrourile pot conine blocuri repetitive. De asemenea macrourile pot invoca la rndul lor alte macrouri. n exemplul push_reg MACRO registru push registru ENDM . . . push_toate_reg MACRO IRP reg,<ax,bx,cx,dx,si,di,bp,sp> push_reg reg ENDM ENDM macroul push_toate_reg conine un bloc repetitiv, care la rndul lui conine o invocare a macroului push_reg.

24