Sunteți pe pagina 1din 19

CAPITOLUL 4 INSTRUCIUNI ALE LIMBAJULUI DE ASAMBLARE

Forma general a unui program ASM: assume cs:code, ds:data data segment data ends code segment start: mov ax,data mov ds,ax ... mov ah,4ch int 21h code ends end start ;code este aici numele segmentului de cod numele poate fi modificat ;ncrcarea registrului segment DS cu adresa segmentului de date ;apelarea funciei 4ch a ntreruperii 21h pentru a provoca ncheierea ;execuiei programului curent ;rolul directivei ASSUME este detaliat n 3.3.1.2. ;data este aici numele segmentului de date numele poate fi modificat ;definiii de date - DB, DW, DD.

;precizarea sfritului textului surs (directiva END) mpreun cu definirea punctului de intrare n program eticheta de cod start

Exist posibilitatea de a elabora programe care conin numai cte un segment de date i unul de cod, avnd nume predefinite (neaprat data i code). n acest scop se pot folosi directivele simplificate (caracteristic TASM). Un astfel de program are structura: .model .data . small . . ;coninutul segmentului de date
1

.code Start: mov ax,@Data mov ds,ax . . . mov ah,4ch int 21h end Start

;coninutul segmentului de cod ;apelarea funciei 4ch a ntreruperii 21h nume.ASM

Un program surs este editat ntr-un fiier cu extensia .asm:

cu nume fixat de ctre utilizator. n acest caz urmtoarea secven de trei comenzi DOS: ...>TASM nume ...>TLINK nume ...>TD nume realizeaz asamblarea, editarea de legturi i execuia asistat a programului respectiv. 4.1. MANIPULAREA DATELOR/ 4.1.1. Instruciuni de transfer al informaiei 4.1.1.1. Instruciuni de transfer de uz general MOV d,s PUSH s POP d XCHG d,s XLAT [tabel_de_translatare] <d> <-- <s> depune <s> n stiv extrage elementul curent din stiv i l depune n d <d> <--> <s> AL <-- < seg:[BX+<AL>] > 2

Instruciunile PUSH i POP au sintaxa PUSH s

POP d

Operanzii trebuie s fie reprezentai pe cuvnt, deoarece stiva este organizat pe cuvinte. Stiva crete de la adrese mari spre adrese mici, din doi n doi octei, SP punctnd ntotdeauna spre cuvntul din vrful stivei. Instruciunea XCHG permite interschimbarea coninutului a doi operanzi de aceeai dimensiune (octet sau cuvnt), cel puin unul dintre ei trebuind s fie registru. Sintaxa ei este XCHG operand1, operand2 Instruciunea XLAT "traduce" octetul din AL ntr-un alt octet, utiliznd n acest scop o tabel de coresponden creat de utilizator, numit tabel de translatare. Instruciunea are sintaxa XLAT [tabel_de_translatare] tabel_de_translatare este adresa direct a unui ir de octei. Instruciunea pretinde la intrare adresa far a tabelei de translatare furnizat sub unul din urmtoarele dou moduri: - DS:BX (implicit, dac lipsete operandul) - registru_segment:BX, dac operandul instruciunii XLAT este prezent, registrul segment fiind determinat pe baza directivei ASSUME corespunztoare operandului. Efectul instruciunii XLAT este nlocuirea octetului din AL cu octetul din tabel ce are numrul de ordine valoarea din AL (primul octet din tabel are indexul 0). EXEMPLU: pag.111-112 (curs).

4.1.1.3. Instruciuni de transfer al adreselor Aceste instruciuni sunt deosebit de utile la operaiile cu iruri, la transmiterea de parametri ctre proceduri etc. n tabelul de mai jos reg desemneaz un registru general (deci orice registru diferit de regitri segment). LEA reg,mem LDS reg,mem LES reg,mem reg <-- offset(mem) reg <-- <mem>, DS <-- <mem+2> reg <-- <mem>, ES <-- <mem+2> _ _

Instruciunea LEA (Load Effective Address) transfer deplasamentul operandului din memorie mem n registrul destinaie. De exemplu lea ax,v ncarc n AX offsetul variabilei v, instruciune echivalent cu mov ax, offset v Instruciunea LEA are insa avantajul c operandul surs poate fi indexat. De exemplu, instruciunea lea ax,[bx+v] nu are ca echivalent direct o singur instruciune MOV cu un operator OFFSET, deoarece operatorul OFFSET impune efectuarea evalurilor la momentul asamblrii. Chiar i afirmaia noastr de mai sus (lea ax,v echivalent cu mov ax,offset v) rmne adevrat numai n condiiile n care deplasamentul variabilei v este determinabil la momentul asamblrii. Instruciunile LDS (Load pointer using DS) i LES (Load pointer using ES) transfer adresa far memorat la mem (deci coninutul variabilei dublucuvnt mem!) n perechea de regitri DS:reg respectiv ES:reg. Instruciunile LDS i LES constituie un mijloc eficient de pregtire n regitri a adreselor far ale unor variabile n vederea unor prelucrri ulterioare.

De exemplu, presupunnd c variabila varp conine valoarea 1234h:5678h (posibil a fi interpretat ulterior ca adresa far a unei zone de memorie), putem obine primul octet al acestei zone n AL prin secvena . . . varp dd 12345678h . . . lds bx,varp ;se transfer coninutul variabilei varp n DS:BX n DS:=1234h iar BX:=5678h mov al,[bx] se transfer n AL octetul de la adresa DS:[BX], adic byte-ul de la adresa 1234h:5678h Exemplu care demonstreaz utilitatea instruciunilor de transfer al adreselor: data1 segment db 'primul segment de date' aa db 31 data1 ends data2 segment db 'al doilea segment de date' db '01234567' bb dd aa ;bb va conine adresa far a etich. aa data2 ends

cod segment assume cs:cod, ds:data2, es:data1 start: . . . mov ax,data2 mov ds,ax mov ax,data1 mov es,ax lea bx,aa ;echivalent cu mov bx,offset aa lds di,bb ;ds:di := es:offset aa (practic variabila bb este utilizat aici ca variabil pointer ce conine adresa far a variabilei aa) mov al, ds:[di] ;al := 31 (valoarea de la adresa etichetei de date aa) . . . cod ends end start
5

Instruciunile LDS i LES sunt singurele instruciuni ale limbajului de asamblare ce accept ca ambii operanzi sa fie dublucuvinte i aceast chiar de o manier explicit ! (coninutul <mem> dublucuvnt se transfer n dublucuvntul DS:reg sau respectiv ES:reg). Se remarc o rat foarte nalt de confuzie asupra mecanismelor implicate de LEA n raport cu LDS i LES. Din cauza tratrii lor sub aceeai titulatur de instruciuni de transfer al adreselor i datorit relativei uurine de a nelege efectul instruciunii LEA, exist tentaia de a deduce c LDS i LES sunt similare lui LEA, n sensul c ele nu vor ncrca numai deplasamentul operandului surs (ca LEA) ci (se interpreteaz greit!) vor transfera ntreaga adres (segment:deplasament) a operandului surs! Aici apare greeala de interpretare comis de cei n cauz: LDS i LES nu transfer adresa far a operandului surs, ci coninutul operandului surs! Revenind i reanaliznd exemplul anterior n care am avut lds bx, varp ; transferul coninutului variabilei varp n DS:BX - corect!

este foarte important s nu facem confuzie i sub influena instruciunii LEA s interpretm vreodat c am avea ca efect al instruciunii de mai sus transferul adresei variabilei varp n ds:bx (concluzie greit!). Dac ntradevr am dori acest lucru, l-am putea realiza corect astfel: ; secvena ce urmeaz ncarc n ds:bx adresa far a variabilei varp! mov ax, SEG varp mov ds,ax lea bx, varp ;operatorul SEG l-am prezentat n 3.2.2.7. ;transfer adres segment varp n DS ;transfer offset varp n BX

4.1.1.4. Instruciuni asupra flagurilor Urmtoarele patru instruciuni sunt instruciuni de transfer al indicatorilor: Instruciunea LAHF (Load register AH from Flags) copiaz indicatorii SF, ZF, AF, PF i CF din registrul de flag-uri n biii 7, 6, 4, 2 i respectiv 0 ai registrului AH. Coninutul biilor 5,3 i 1 este nedefinit. Indicatorii nu sunt afectai n urma acestei operaii de transfer (n sensul c instruciunea LAHF nu este ea nsi generatoare de efecte asupra unor flag-uri ea doar transfer valorile flag-urilor i att). Instruciunea SAHF (Store register AH into Flags) transfer biii 7, 6, 4, 2 i 0 ai registrului AH n indicatorii SF, ZF, AF, PF i respectiv CF, nlocuind valorile anterioare ale acestor indicatori. Instruciunea PUSHF transfer toi indicatorii n vrful stivei (coniunutul registrului Flags se transfer n vrful stivei). Indicatorii nu sunt afectai n urma acestei operaii. Instruciunea POPF extrage cuvntul din vrful stivei i transfer din acesta indicatorii corespunztori n registrul de flag-uri. Limbajul de asamblare pune la dispoziia programatorului nite instruciuni de setare a valorii indicatorilor de condiie, pentru ca programatorul s poat influena dup dorin modul de aciune a instruciunilor care exploateaz flaguri. CLC CF=0 CF CMC STC CLD STD CLI STI CF = ~CF CF=1 DF=0 DF=1 IF=0 IF=1 CF CF DF DF IF IF
7

4.1.2. Instruciuni de conversie CBW CWD -

conversie octet coninut n AL la cuvnt n AX (extensie de semn) conversie cuvnt coninut n AX la dublu cuvnt n DX:AX (extensie de semn)

Instruciunea CBW convertete octetul cu semn din AL n cuvntul cu semn AX (extinde bitul de semn al octetului din AL la nivelul cuvntului din AX, modificnd distructiv coninutul registrului AH). De exemplu, mov al, -1 cbw ;extinde valoarea octet -1 din AL n valoarea cuvnt -1 din AX.

Analog, pentru conversia cu semn cuvnt - dublu cuvnt, instruciunea CWD extinde cuvntul cu semn din AX n dublucuvntul cu semn DX:AX. Exemplu: mov ax,-10000 cwd ;obine valoarea -10000 n DX:AX.

Conversia fr semn se realizeaz prin zerorizarea octetului sau cuvntului superior al valorii de la care s-a plecat.

4.1.3. Impactul reprezentrii little-endian asupra accesrii datelor (pag.119 122 curs). Dac programatorul utilizeaz datele consistent cu dimensiunea de reprezentare stabilit la definire (ex: accesarea octeilor drept octei i nu drept secvene de octei interpretate ca i cuvinte sau dublucuvinte, accesarea de cuvinte ca i cuvinte i nu ca perechi de octei, accesarea de dublucuvinte ca i dublucuvinte i nu ca secvene de octei sau de cuvinte) atunci instruciunile limbajului de asamblare vor ine cont n mod automat de modalitatea de reprezentare little-endian. Ca urmare, dac se respect aceast condiie programatorul nu trebuie s intervin suplimentar n nici un fel pentru a asigura corectitudinea accesrii i manipulrii datelor utilizate. Exemplu: a db d, -25, 120 b dw -15642, 2ba5h c dd 12345678h mov al, a;se ncarc n AL codul ASCII al caracterului d mov bx, b ;se ncarc n BX valoarea -15642; ordinea octeilor n BX va fi ns ;inversat fa de reprezentarea n memorie, deoarece numai reprezentarea n memorie folosete reprezentarea little-endian! n regitri datele sunt ;memorate conform reprezentrii structurale normale, echivalente unei ;reprezentri big endian. les dx, c ;se ncarc n combinaia de regitri ES:DX valoarea dublucuvnt ;1234:5678h, mai precis, n ES se ncarc 1234h iar n DX se ncarc 5678h. ;Aceeai observaie i aici: fa de ordinea octeilor din memorie care este ;78h 56h 34h 12h, dup aciunea instruciunii les ordinea octeilor n cadrul ;regitrilor va fi cea structural normal, adic 12h 34h 56h 78h. Dac ns se dorete accesarea sau interpretarea datelor sub o form diferit fa de modalitatea de definire atunci trebuie utilizate conversii explicite de tip. n momentul utilizrii conversiilor explicite de tip programatorul trebuie s i asume ns ntreaga responsabilitate a interpretrii i accesrii corecte a datelor. In astfel de situaii programatorul este obligat s contientizeze particularitile de reprezentare little-endian (ordinea de plasare a

octeilor n memorie) i s utilizeze modaliti de accesare a datelor n conformitate cu aceasta Ex pag.120-

122.

4.2. OPERAII 4.2.1. Operaii aritmetice Operanzii sunt reprezentai n cod complementar (vezi 1.5.2.). Microprocesorul realizeaz adunrile i scderile "vznd" doar configuraii de bii i nu numere cu semn sau fr. Regulile de efectuare a adunrii i scderii presupun adunarea de configuraii binare, fr a fi nevoie de a interpreta operanzii drept cu semn sau fr semn anterior efecturii operaiei! Deci, la nivelul acestor instruciuni, interpretarea "cu semn" sau "fr semn" rmne la latitudinea programatorului, nefiind nevoie de instruciuni separate pentru adunarea/scderea cu semn fa de adunarea/scderea fr semn. Adunarea i scderea se efectueaz ntotdeauna la fel (adunnd sau scznd configuraii binare) indiferent de semnul (interpretarea) acestor configuraii! Dup cum vom vedea acest lucru nu este valabil i pentru nmulire i mprire. n cazul acestor operaii trebuie s tim apriori dac operanzii vor fi interpretai drept cu semn sau fr semn. De exemplu, fie doi operanzi A i B reprezentai fiecare pe cte un octet:

A = 9Ch = 10011100b (= 156 n interpretarea fr semn i -100 n interpretarea cu semn) B = 4Ah = 01001010b (= 74 att n interpretarea fr semn ct i n interpretarea cu semn)
Microprocesorul realizeaz adunarea C = A + B i obine

C = E6h = 11100110b (= 230 n interpretarea fr semn i -26 n interpretarea cu semn)


Se observ deci c simpla adunare a configuraiilor de bii (fr a ne fixa neaprat asupra unei interpretri anume la momentul efecturii adunrii) asigur corectitudinea rezultatului obinut, att n interpretarea cu semn ct i n cea fr semn. INSTRUCIUNI ARITMETICE tabel pag.123 (curs)
10

4.2.1.3. Exemple i exerciii propuse pag.129-130 (curs) 4.2.2. Operaii logice pe bii(AND, OR, XOR i NOT). Instruciunea AND este indicat pentru izolarea unui anumit bit sau pentru forarea anumitor bii la valoarea 0. Instruciunea OR este indicata pentru forarea anumitor bii la valoarea 1. Instruciunea XOR este indicat pentru schimbarea valorii unor bii din 0 n 1 sau din 1 n 0. 4.2.3. Deplasri i rotiri de bii Instruciunile de deplasare de bii se clasific n: - Instruciuni de deplasare logic - Instruciuni de deplasare aritmetic - stnga - SHL - stnga - SAL - dreapta - SHR - dreapta - SAR Instruciunile de rotire a biilor n cadrul unui operand se clasific n: - Instruciuni de rotire fr carry - Instruciuni de rotire cu carry - stnga - ROL - stnga - RCL - dreapta - ROR - dreapta - RCR Pentru a defini deplasrile i rotirile s considerm ca i configuraie iniial un octet X = abcdefgh, unde a-h sunt cifre binare, h este cifra binar de rang 0, a este cifra binar de rang 7, iar k este valoarea existent n CF (CF=k). Atunci avem: SHL X,1 ;rezult X = bcdefgh0 i CF = a SHR X,1 ;rezult X = 0abcdefg i CF = h SAL X,1 ; identic cu SHL SAR X,1 ;rezult X = aabcdefg i CF = h ROL X,1 ;rezult X = bcdefgha i CF = a ROR X,1 ;rezult X = habcdefg i CF = h RCL X,1 ;rezult X = bcdefghk i CF = a RCR X,1 ;rezult X = kabcdefg i CF = h
11

INSTRUCIUNILE DE DEPLASARE I ROTIRE DE BII tabel pag.134 (curs)

4.3. RAMIFICRI, SALTURI, CICLURI 4.3.1. Saltul necondiionat n aceast categorie intr instruciunile JMP (echivalentul instruciunii GOTO din alte limbaje), CALL (apelul de procedur nseamn transferul controlului din punctul apelului la prima instruciune din procedura apelat) i RET (transfer control la prima instruciune executabil de dup CALL). JMP operand CALL operand RET [n] Salt necondiionat la adresa determinat de operand Transfer controlul procedurii determinat de operand Transfer controlul instruciunii de dup CALL -

4.3.1.1. Instruciunea JMP Instruciunea de salt necondiionat JMP are sintaxa JMP operand unde operand este o etichet, un registru sau o variabil de memorie ce conine o adres. Efectul ei este transferul necondiionat al controlului la instruciunea ce urmeaz etichetei, la adresa coninut n registru, respectiv la adresa coninut n variabila de memorie. De exemplu, dup execuia secvenei mov ax,1 jmp AdunaDoi AdunaUnu: inc ax jmp urmare AdunaDoi: add ax,2 urmare: . . . registrul AX va conine valoarea 3. Instruciunile inc i jmp dintre etichetele AdunaUnu i AdunaDoi nu se vor executa, dect dac se va face salt la AdunaUnu de altundeva din program.
12

Dup cum am menionat, saltul poate fi fcut i la o adres memorat ntr-un registru sau ntr-o variabil de memorie. Exemple: (1) mov ax, OFFSET etich jmp ax etich: ;operand registru . . . (2) data segment Salt DW Dest ;Salt := offset Dest . . . cod segment . . . jmp Salt ;salt NEAR . .;operand variabil de memorie Dest : . . .

Dac n cazul (1) dorim nlocuirea operandului destinaie registru cu un operand destinaie variabil de memorie, o soluie posibil este: b dw ? (1) ... mov b, offset etich jmp b ; salt NEAR operand variabil de memorie Instruciunea JMP poate fi folosit de asemenea pentru saltul ntr-un alt segment de cod (salt FAR - far jump). Pentru aceasta este necesar determinarea unei adrese de forma segment:offset. Saltul FAR se poate realiza n patru moduri: a). declarnd eticheta destinaie ca etichet far prin directiva LABEL (vezi 3.3.3). Exemplu pag.140 (curs) b). specificnd direct n instruciunea JMP tipul FAR PTR pentru eticheta destinaie, sub forma: JMP FAR PTR eticheta. Acest mod de specificare al operandului destinaie a fost utilizat n exemplele din 3.3.1.2 - directiva ASSUME i gestiunea segmentelor. Operatorul PTR a fost prezentat n 3.2.2.7.
13

c). prefixnd explicit cu un registru de segment o adres NEAR specificat indirect (vezi 3.2.1.4 operanzi cu adresare indirect), adic furnizarea ca operand al instruciunii JMP a unei expresii de forma: reg_segment: specificare_offset. Exemplu: jmp es:[bx+di]. d). specificnd ca operand o variabil dublucuvnt care conine adresa far a destinaiei exemplu (pag.141-curs). Exemplul 4.3.1.2. pag.142-143 (curs) modul de transfer al controlului la o eticheta. Analiza si comparatie transfer direct tranfer indirect. 4.3.2. Instruciuni de salt condiionat 4.3.2.1. Comparaii ntre operanzi CMP comparaie valori operanzi (nu modific operanzii) (execuie fictiv d - s) execuie fictiv d AND s OF,SF,ZF,AF,PF i CF OF = 0, CF = 0 SF,ZF,PF - modificai, AF - nedefinit

d,s

TEST d,s

Instruciunile de salt condiionat se folosesc de obicei n combinaie cu instruciuni de comparare. De aceea, semnificaiile instruciunilor de salt rezult din semnificaia operanzilor unei instruciuni de comparare. n afara testului de egalitate pe care l poate efectua o instruciune CMP este de multe ori necesar determinarea relaiei de ordine dintre dou valori. De exemplu, se pune ntrebarea: numrul 11111111b (= FFh = 255 = -1) este mai mare dect 00000000b(= 0h = 0)? Rspunsul poate fi i da i nu! Dac cele dou numere sunt considerate fr semn, atunci primul are valoarea 255 i este evident mai mare dect 0. Dac ns cele dou numere sunt considerate cu semn, atunci primul are valoarea -1 i este mai mic dect 0. Instruciunea CMP nu face distincie ntre cele dou situaii, deoarece aa dup cum am precizat i n 4.2.1.1. adunarea i scderea se efectueaz ntotdeauna la fel (adunnd sau scznd configuraii binare) indiferent de semnul (interpretarea) acestor configuraii. Ca urmare, nu este vorba de a interpreta cu semn sau fr semn
14

operanzii scderii fictive d-s, ci rezultatul final al acesteia! Rolul de a interpreta n mod diferit (cu semn sau fr semn) rezultatul final al comparaiei revine diverselor instruciuni de salt condiionat prezentate n 4.3.2.2. 4.3.2.2. Salturi condiionate de flaguri n tabelul 4.1. (pag.146 curs) se prezint instruciunile de salt condiionat mpreun cu semnificaia lor i cu precizarea valorilor flagurilor n urma crora se execut salturile respective. Precizm c pentru toate instruciunile de salt sintaxa este aceeai, i anume <instruciune_de_salt> etichet Semnificaia instruciunilor de salt condiionat este dat sub forma "salt dac operand1 <<relaie>> fa de operand2" (unde cei doi operanzi sunt obiectul unei instruciuni anterioare CMP sau SUB) sau referitor la valoarea concret setat pentru un anumit flag. Dup cum se observ i din condiiile ce trebuie verificate, instruciunile ce se afl ntr-o aceeai linie a tabelului sunt echivalente. Cnd se compar dou numere cu semn se folosesc termenii "less than" (mai mic dect) i "greater than" (mai mare dect), iar cnd se compar dou numere fr semn se folosesc termenii "below" (inferior, sub) i respectiv "above" (superior, deasupra, peste). 4.3.2.3. Exemple comentate.............. pag.148-162 (curs). - discutie si analiza comparativa a conceptelor de : reprezentari cu semn vs. fara semn, depasire, modul de actiune al instructiunilor de salt conditionat. 4.3.3. Instruciuni de ciclare (pag.162 164 curs). Ele sunt: LOOP, LOOPE, LOOPNE i JCXZ. Sintaxa lor este <instruciune> etichet
15

Instruciunea LOOP comand reluarea execuiei blocului de instruciuni ce ncepe la etichet, atta timp ct valoarea din registrul CX este diferit de 0. Se efectueaz nti decrementarea registrului CX i apoi se face testul i eventual saltul. Saltul este "scurt" (max. 127 octei - atenie deci la "distana" dintre LOOP i etichet!). n cazul n care condiiile de terminare a ciclului sunt mai complexe se pot folosi instruciunile LOOPE i LOOPNE. Instruciunea LOOPE (LOOP while Equal) difer fa de LOOP prin condiia de terminare, ciclul terminndu-se fie dac CX=0, fie dac ZF=1. n cazul instruciunii LOOPNE (LOOP while Not Equal) ciclul se va termina fie dac CX=0, fie dac ZF=0. Chiar dac ieirea din ciclu se face pe baza valorii din ZF, decrementarea lui CX are oricum loc. LOOPE mai este cunoscut i sub numele de LOOPZ iar LOOPNE mai este cunoscut i sub numele de LOOPNZ. Se folosesc de obicei precedate de o instruciune CMP sau SUB. JCXZ (Jump if CX is Zero) realizeaz saltul la eticheta operand numai dac CX=0, fiind util n situaia n care se dorete testarea valorii din CX naintea intrrii ntr-o bucl. In exemplul urmtor instruciunea JCXZ se folosete pentru a se evita intrarea n ciclu dac CX=0:
. . . jcxz MaiDeparte Bucla: Mov BYTE PTR [si],0 inc si loop Bucla MaiDeparte: . . ;dac CX=0 se sare peste bucl ;iniializarea octetului curent ;trecere la octetul urmtor ;reluare ciclu sau terminare .

La ntlnirea instruciunii LOOP cu CX=0, CX este decrementat, obinndu-se valoarea 0FFFFh (= -1, deci o valoare diferit de 0), ciclul relundu-se pn cnd se va ajunge la valoarea 0 n CX, adic de nc 65535 ori! Este important s precizm aici faptul c nici una dintre instruciunile de ciclare prezentate nu afecteaz flagurile. dec cx loop Bucla i jnz Bucla dei semantic echivalente, nu au exact acelai efect, deoarece spre deosebire de LOOP, instruciunea DEC afecteaz indicatorii OF, ZF, SF i PF.
16

4.3.4. Instruciunile CALL i RET Apelul unei proceduri se face cu ajutorul instruciunii CALL, acesta putnd fi apel direct sau apel indirect. Apelul direct are sintaxa CALL operand Asemntor instruciunii JMP i instruciunea CALL transfer controlul la adresa desemnat de operand. n plus fa de aceasta, nainte de a face saltul, instruciunea CALL salveaz n stiv adresa urmtoarei instruciuni de dup CALL (adresa de revenire). Cu alte cuvinte, avem echivalena CALL operand A: . . . [ push CS ] (numai dac este operand far) push offset A jmp operand

Terminarea execuiei secvenei apelate este marcat de ntlnirea unei instruciuni RET. Aceasta preia din stiv adresa de revenire depus acolo de CALL, prednd controlul la instruciunea de la aceast adres. Sintaxa instruciunii RET este RET [n] unde n este un parametru opional. El indic eliberarea din stiv a n octei aflai sub adresa de revenire. Instruciunea RET poate fi far sau near. Ca efect, avem echivalenele RET n (revenire near) B dw ? . . . pop B add sp,n jmp B

17

RET n (revenire far)

B dd ? . . . pop word ptr B pop word ptr B+2 add sp,n jmp B

De cele mai multe ori, dup cum este i natural, instruciunile CALL i RET apar n urmtorul context nume PROC . . . ret n nume ENDP . . . CALL nume Directivele PROC i ENDP au fost prezentate n 3.3.4. Apelul i revenirea sunt implicit far sau near, dup cum procedura nume este declarat FAR sau respectiv NEAR. Instruciunea CALL poate de asemenea prelua adresa de transfer dintr-un registru (pentru un apel intrasegment) sau dintr-o variabil de memorie. Un asemenea gen de apel este denumit apel indirect. Exemple: call bx ;adres preluat din registru call vptr ;adres preluat din memorie Rezumnd, operandul destinaie al unei instruciuni CALL poate fi: - numele unei proceduri FAR sau NEAR
18

- numele unui registru n care se afl o adres NEAR - o adres de memorie NEAR sau FAR (ca i n cazul instruciunii JMP).

19

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