LPC23

24
4. Grupul instrucþiunilor de salt Instrucþiunile de salt se ímpart ín douá categorii: instrucþiuni de salt necondiþionat ßi instrucþiuni de salt condiþionat. 4.1. Instrucþiuni de salt necondiþionat Existá urmátoarele instrucþiuni de salt necondiþionat: a) Intra-segment 1. JMP SHORT etichetá ; Salt direct scurt intra-segment 2. JMP etichetá ; Salt direct intra-segment apropiat (etichetá este ; definitá ín interiorul segmentului curent ca NEAR) JMP NEAR etichetá ; Salt direct apropiat intra-segment 3. JMP R 16 ; Salt indirect intra-segment la adresa de offset conþinutá ín registrul R 16 4. JMP WORD PTR operand ; Salt indirect intra-segment la adresa de offset ; specificatá prin contextul lui operand Exemplu: jmp WORD PTR [bx] [di] ; jmp TABLE [bx] ; Observaþie: Dacá eticheta la care se face referirea se gáseßte textual ínainte de instrucþiunea de salt, atunci asamblorul "ßtie" sá genereze corect o instrucþiune scurtá. Ín cazul ín care eticheta la care se face referirea se gáseßte textual dupá instrucþiunea de salt este necesará specificarea explicitá a formei scurte de salt: alfa: mov ax, 5 --------------- jmp alfa --------------- jmp SHORT beta beta: add ax, cx b) Inter-segment 1. JMP etichetá ; Salt direct índepártat (ín alt segment) la operatorul etichetá ; (eticheta a fost definitá ca FAR (instrucþiunea ocupá 5 octeþi)) 2. JMP FAR PTR etichetá ; Salt direct inter-segment la operatorul etichetá ; (etichetá a fost definitá ca NEAR ín segmentul ín ; care se face saltul) 3. JMP DWORD PTR operand ; Salt indirect inter-segment, adresa de salt ; (SEGMENT:OFFSET), fiind specificatá prin ; conþinutul lui operand Exemplu: jmp DWORD PTR [bx] ; Semnificaþii: Jmp de tip SHORT: (IP) <--- (IP) + distanþa dintre offsetul instrucþiunii curente ßi cel al operandului Jmp de tip NEAR: (IP) <--- Offsetul adresei operandului Jmp de tip FAR: (IP) <--- Offsetul adresei operandului (CS) <--- Segmentul adresei operandului 4.2. Instrucþiuni de salt condiþionat Instrucþiunile de salt condiþionat se folosesc, de obicei, ímpreuná cu instrucþiunile de comparare (CMP DST, SRC), care determiná relaþia dintre douá numere. Ín prima etapá, 2 - 26

description

cerceteaza

Transcript of LPC23

4. Grupul instrucþiunilor de salt

Instrucþiunile de salt se ímpart ín douá categorii: instrucþiuni de salt necondiþionat ßiinstrucþiuni de salt condiþionat.

4.1. Instrucþiuni de salt necondiþionat

Existá urmátoarele instrucþiuni de salt necondiþionat:a) Intra-segment

1. JMP SHORT etichetá ; Salt direct scurt intra-segment2. JMP etichetá ; Salt direct intra-segment apropiat (etichetá este

; definitá ín interiorul segmentului curent ca NEAR)JMP NEAR etichetá ; Salt direct apropiat intra-segment

3. JMP R16 ; Salt indirect intra-segment la adresa de offset conþinutá ín registrul R16

4. JMP WORD PTR operand ; Salt indirect intra-segment la adresa de offset ; specificatá prin contextul lui operand

Exemplu: jmp WORD PTR [bx] [di] ;jmp TABLE [bx] ;

Observaþie: Dacá eticheta la care se face referirea se gáseßte textual ínainte de instrucþiunea de salt,atunci asamblorul "ßtie" sá genereze corect o instrucþiune scurtá. Ín cazul ín care eticheta la care seface referirea se gáseßte textual dupá instrucþiunea de salt este necesará specificarea explicitá aformei scurte de salt:

alfa: mov ax, 5---------------jmp alfa---------------jmp SHORT beta

beta: add ax, cx

b) Inter-segment

1. JMP etichetá ; Salt direct índepártat (ín alt segment) la operatorul etichetá ; (eticheta a fost definitá ca FAR (instrucþiunea ocupá 5 octeþi))

2. JMP FAR PTR etichetá ; Salt direct inter-segment la operatorul etichetá ; (etichetá a fost definitá ca NEAR ín segmentul ín ; care se face saltul)

3. JMP DWORD PTR operand ; Salt indirect inter-segment, adresa de salt ; (SEGMENT:OFFSET), fiind specificatá prin ; conþinutul lui operand

Exemplu: jmp DWORD PTR [bx] ;Semnificaþii:

Jmp de tip SHORT: (IP) <--- (IP) + distanþa dintre offsetul instrucþiunii curente ßi cel aloperandului

Jmp de tip NEAR: (IP) <--- Offsetul adresei operanduluiJmp de tip FAR: (IP) <--- Offsetul adresei operandului

(CS) <--- Segmentul adresei operandului

4.2. Instrucþiuni de salt condiþionat

Instrucþiunile de salt condiþionat se folosesc, de obicei, ímpreuná cu instrucþiunile decomparare (CMP DST, SRC), care determiná relaþia dintre douá numere. Ín prima etapá,

2 - 26

instrucþiunea CMP executá o scádere a celor douá numere (DST)-(SRC), fárá depunerearezultatului, dar cu modificarea corespunzátoare a fanioanelor de condiþie conform operaþieiefectuate. Ín a doua etapá, instrucþiunea de salt condiþionat, testeazá condiþia specificatá (bistabilulde condiþie), Fig.46.1, efectuänd saltul numai ín situaþia ín care condiþia este adeváratá, ín cazcontrar trecänd la instrucþiunea urmátoare. Observaþie: Toate instrucþiunile de salt condiþionat au lungimea de 2 octeþi, primul octet fiind coduloperaþiei, iar cel de-al doilea, un deplasament de 8 biþi reprezentat ín complement faþá de 2.

DEPL8

DEPL8 [-128, +127]∈

Dacá se executá saltul, adresa efectivá de salt se determiná efectuänd suma dintre conþinutulactual al registrului IP ßi un deplasament cu semn pe 8 biþi, care prin extindere de semn devine undeplasament pe 16 biþi. Deoarece instrucþiunile de salt au o distanþá de salt limitatá de intervalul[-128, +127], saltul la o instrucþiune din afara acestui domeniu se poate realiza prin efectuarea unuisalt condiþionat urmat de un salt necondiþionat la instrucþiunea doritá.

Observaþie: Trebuie fácutá distincþia íntre "mai mare" ßi "mai mic" ín cazul numerelor cu semn ßifárá semn. Astfel, dacá se compará douá numere cu semn, se folosesc termenii "less than" (mai micdecät) ßi "greater than" (mai mare decät), iar dacá se compará douá numere fárá semn, se folosesctermenii "below" (inferior, sub) ßi "above" (deasupra, peste, superior).

Existá urmátoarele instrucþiuni de salt condiþionat:a) Pentru numere cu semn:

1. JL / JNGE etichetá ; Jump if less / not greater nor equal (SF OF) = 1⊕Salt dacá DST < SRC

2. JLE / JNG etichetá ; Jump if less or equal / not greater ((SF OF) ZF) = 1⊕ ∪Salt dacá DST SRC≤

3. JNL / JGE etichetá ; Jump if not less / greater or equal (SF OF) = 0⊕Salt dacá DST SRC≥

4. JNLE / JG etichetá ; Jump if not less nor equal / greater ((SF OF) ZF) = 0⊕ ∪Salt dacá DST > SRC

5. JNO etichetá ; Jump if no overflow (OF = 0)Salt dacá nu existá depáßire

6. JO etichetá ; Jump if overflow (OF = 1)Salt dacá existá depáßire

7. JS etichetá ; Jump if sign (SF = 1)Salt dacá numárul este negativ

8. JNS etichetá ; Jump if not sign (SF = 0)Salt dacá numárul este pozitiv

b) Pentru numere fárá semn

9. JB / JNAE / JC etichetá ; Jump if below / not above nor equal / carry (CF = 1)Salt dacá DST < SRC

10. JBE / JNA etichetá ; Jump if below or equal / not above (CF ZF) = 1∪Salt dacá DST SRC≤

2 - 27

Condiþie índeplinitá ?

Executá instrucþiunea urmátoare IP <--- IP +

Fig. 4.1.

IP <--- IP +2

NU DASe executá saltul

11. JNB / JAE / JNC etichetá ; Jump if not below / above or equal / not carry (CF = 0)Salt dacá DST SRC≥

12. JNBE / JA etichetá ; Jump if not below nor equal / above (CF ZF) = 0∪Salt dacá DST > SRC

c) Alte categorii13. JC etichetá ; Jump if carry set (CF = 1)

Salt dacá flagul CF a fost setat14. JNC etichetá ; Jump if no carry (CF = 0)

Salt dacá flagul CF nu a fost setat15. JZ / JE etichetá ; Jump if zero / equal (ZF = 1)

Salt dacá DST = SRC16. JNZ / JNE etichetá ; Jump if not zero / not equal (ZF = 0)

Salt dacá DST SRC≠17. JP / JPE etichetá ; Jump if parity / parity even (PF = 1)

Salt dacá paritate pará18. JNP / JPO etichetá ; Jump if no parity / parity odd (PF = 0)

Salt dacá paritate impará19. JCXZ etichetá ; Jump if CX = 0

Salt la eticheta dacá CX = 0, unde etichetá [-128, 127] faþa de (IP).∈

Exemplu: Dacá se lucreazá cu numere fárá semn, atunci dupá execuþia instrucþiunilormov ax, 0FFFFhmov bx, 2cmp ax, bxja Etic

se va produce saltul la eticheta Etic, deoarece 0FFFFh > 2.Dacá se lucreazá cu numere cu semn, atunci dupá execuþia instrucþiunilor

mov ax, 0FFFFhmov bx, 2cmp ax, bxjg Etic

nu se va produce saltul la eticheta Etic, deoarece 0FFFFh < 2.

4.3. Instrucþiuni pentru controlul ciclurilor (Bucle)

Schema de construcþie a buclelor cu test final este urmátoarea:

2 - 28

CORP BUCLÁ

(Numárátor) <---- Numár iteraþii

(Numárátor) <----- (Numárátor) -1

(Numárátor) = 0 ?

DA

NU

Dacá drept numárátor se utilizeazá registrul CX, iar variabila N conþine numárul de repetiþii(iteraþii) schema devine:

Instrucþiunea LOOP a fost gänditá pentru a simplifica aceastá scriere. Astfel rescriereasecvenþei anterioare cu instrucþiunea LOOP este urmátoarea:

Existá urmátoarele instrucþiuni de buclare:

1. LOOP etichetá ; Loop until count completeSe executá salt repetat la operandul etichetá atät timp cät conþinutul registrului CX este

nenul. Instrucþiunea funcþioneazá dupá structura din Fig. 4.2.

DEPL8

2. LOOPZ/LOOPE etichetá ; Conditional LOOPSe executá salt repetat la operandul etichetá atät timp cät conþinutul registrului CX este

nenul ßi indicatorul de condiþie ZF = 1. Instrucþiunea funcþioneazá dupá structura din Fig. 4.3.

DEPL8

3. LOOPNZ/LOOPNE etichetáSe executá salt repetat la operandul etichetá atät timp conþinutul registrului CX este nenul ßi

indicatorul de condiþie ZF = 0. Instrucþiunea funcþioneazá dupá o structurá identicá cu cea din Fig.4.3, singura diferenþá fiind cá se testeazá ZF = 0 ín loc de ZF = 1.

2 - 29

mov cx, NBEGIN: ----------------

---------------------------------------------------

LOOP BEGIN

CORPBUCLÁ

CX <--- CX - 1

CX = 0 Executá instrucþiunea urmátoare

DA NU Salt la etichetáIP <--- IP +

Figura 4.2.

CX <--- CX - 1

CX = 0DA NU

ZF = 1DANUExecutá instrucþiunea

urmátoare Salt la etichetáIP <--- IP +

Figura 4.3.

mov cx, NBEGIN: ----------------

---------------------------------------------------dec cxjnz BEGIN

CORPBUCLÁ

Ín continuare sunt prezentate cäteva exemple de utilizare a instrucþiunilor prezentate.Exemplul 1. Urmátoarea secvenþá de program aduná conþinutul a M cuvinte din memorie plasateíncepänd de la adresa ARRAY ßi depune rezultatul ín variabila TOTAL.

mov cx, M ; Ín CX se introduce numárul cuvintelor de adunatmov ax, 0mov si, ax

START_LOOP: add ax, ARRAY[si]add si, 2loop START_LOOPmov TOTAL, ax

Exemplul 2. Suma a n octeþi plasaþi ín memorie la adresa sir sir DB 3, 5, 9, -10, 7, -11, 20n EQU ($ - sir) / TYPE sir ; TYPE operand - precizeazá numárul de octeþi

; ai tipului variabilei operandrez DB ?. . . . . . . . . . . . . . . . . . . . .

xor al, al ; AL = 0mov cx, n ; CX <--- nxor si, si ; SI = 0

repeta:add al, sir[si]inc siLOOP repetamov suma, al

Exemplul 3. Un exemplu ín care apare necesitatea testárii a 2 condiþii ínaintea repetárii buclei ílreprezintá cáutarea unui element íntr-un vector.

Presupunem cá ASCII_SIR reprezintá un ßir de caractere. Se pune problema cáutárii unuiblanc (spaþiu) ín acest ßir. Dacá nu se gáseßte nici un blanc, se executá salt la eticheta NU_GASIT.Lungimea ßirului este datá prin variabila L. Secvenþa de program este urmátoarea:

ASCII_SIR DB 'Acesta este un sir'L EQU $ - sircontor1 BD 0contor2 DB ?. . . . . . . . . . . . . . . . . . . . . . . .

mov cx, Lmov si, -1mov al, ' ' ; Ín AL se introduce codul ASCII al blancului

NEXT: inc sicmp al, ASCII_SIR[si]loopne NEXTjcxz NU_GASIT

GASIT: inc contor1jmp NEXT

NU_GASIT: mov contor2, 0

2 - 30

5. Grupul instrucþiunilor logice5.1. Instrucþiuni logice

Microprocesorul I8086/I8088 poate realiza cinci instrucþiuni logice: NOT, AND, OR, XORßi TEST.

a) Instrucþiunea:NOT DST ; Logical NOT

realizeazá negarea logicá (complementul faþá de 1) al operandului DST (DST <--- ). Forme de_____DST

utilizare:not R ; R <--- unde R poate fi R8 sau R16

_R

not M ; M <--- unde M poate fi M8 sau M16

Instrucþiunea nu afecteazá fanioanele de condiþie. b) Instrucþiunile

AND DST, SRC ; (DST) <--- (DST) (SRC) ; Logical AND∩OR DST, SRC ; (DST) <--- (DST) (SRC) ; Logical OR∪XOR DST, SRC ; (DST) <--- (DST) (SRC) ; Exclusive OR∀

realizeazá operaþiile logice SI, SAU ßi SAU EXCLUSIV, bit cu bit, íntre conþinutul operanduluisursá SRC ßi conþinutul operandului destinaþie DST, rezultatul depunändu-se ín destinaþia DST,sursa nefiind afectatá. Pentru aceste instrucþiuni sunt permise urmátoarele tipuri de operanzi:

and | or | xor R8, R8 ; R8 <--- R8 R8 ∩ ∪ ∀and | or | xor R8, M8 ; R8 <--- R8 M8 ∩ ∪ ∀and | or | xor M8, R8 ; M8 <--- M8 R8 ∩ ∪ ∀and | or | xor R16, R16 ; R16 <--- R16 R16 ∩ ∪ ∀and | or | xor R16, M16 ; R16 <--- R16 M16 ∩ ∪ ∀and | or | xor M16, R16 ; M16 <--- M16 R16 ∩ ∪ ∀and | or | xor R8, DATA8 ; R8 <--- R8 DATA8 ∩ ∪ ∀and | or | xor M8, DATA8 ; M8 <--- M8 DATA8 ∩ ∪ ∀and | or | xor R16, DATA16 ; R16 <--- R16 DATA16∩ ∪ ∀and | or | xor M16, DATA16 ; M16 <--- M16 DATA16∩ ∪ ∀

Observaþie: Dupá execuþia instrucþiunilor AND, OR, XOR, íntotdeauna: CF = 0 , OF = 0. Alþiindicatori afectaþi: SF, ZF, PF. Indicatorul AF este nedefinit.

c) Instrucþiunea:

TEST DST, SRC ; DST SRC; TEST∩

combiná proprietáþile instrucþiunilor AND ßi CMP, astfel: ca ßi o instrucþiune AND, TESTrealizeazá operaþia logicá SI íntre biþii corespunzátori ai sursei SRC ßi destinaþiei DST, fáráínscrierea rezultatului; ca ßi o instrucþiune CMP, TEST poziþioneazá ín mod corespunzátorrezultatului obþinut bistabilii de condiþie, cu excepþia flagurilor CF ßi OF care se poziþioneazá pe 0.

Cel mai des, instrucþiunile logice se utilizeazá pentru setarea, resetarea (ßtergerea),complementarea sau testarea selectivá ai unor biþi ai operandului destinaþie ín funcþie de formaoperandului sursá. Ín astfel de operaþii, operandul sursá se numeßte mascá, iar operaþia se numeßteoperaþie de mascare.

Setarea (punerea pe 1) selectivá a unor biþi se face cu instrucþiunea OR, resetarea (punereape 0) selectivá a unor biþi se face cu instrucþiunea AND, iar complementarea selectivá serealizeazá cu XOR.

Testarea selectivá a unor biþi se realizeazá cu instrucþiunea TEST.

2 - 31

Exemplu: Urmátoarea secvenþá de program realizeazá un salt la etichetele TASK1, respectivTASK2 sau TASK3, funcþie de valoarea biþilor registrului AX, ín urmátoarele condiþii:

a) Dacá biþii 1 ßi 14 sau 7 ßi 9 sunt setaþi, salt la TASK1;b) Dacá nu se face saltul la TASK1 ßi biþii 3 sau 4 sunt setaþi, salt la TASK3;c) Altfel, salt la TASK2.

Secvenþa de program este urmátoarea:

not ax ; Se neagá AX, deci ßi biþii 1 ßi 14test ax, 4002h ; Se testeazá dacá biþii 1 ßi 14 au valoarea 1jz TASK1 ; Dacá da, salt La TASK1test ax, 0280h ; Se testeazá dacá biþii 7 ßi 9 au valoarea 1jz TASK1 ; Dacá da, salt La TASK1not ax ; Se revine la valoarea iniþialá a lui AXtest ax, 0018h ; Se testeazá dacá biþii 3 sau 4 au valoarea 1jnz TASK3 ; Dacá da, salt La TASK3

TASK2: ------------------------------------------------------

TASK1: ------------------------------------------------------

TASK3: ------------------------------------------------------

Instrucþiunile logice pot fi utilizate ßi pentru simularea unor scheme logice combinaþionale.

5.2. Instrucþiuni logice pentru deplasare ßi rotaþie

Instrucþiunile de deplasare ßi rotaþie lucreazá pe octeþi sau cuvinte. Deplasarea (logicá sauaritmeticá) sau rotaþia spre stänga sau spre dreapta se poate efectua cu o singurá poziþie (un bit) saucu un numár de poziþii (biþi) specificat ín registrul CL. Existá urmátoarele instrucþiuni de deplasareßi de rotaþie:

a) SHL DST, 1 ; Deplasare logicá stänga a operandului DST cu 1 poziþii SHL DST, CL ; Deplasare logicá stänga a operandului DST cu (CL) poziþii

Observaþie: Pentru toate instrucþiunile din acest paragraf, DST poate fi conþinutul unui registrugeneral pe 8 sau 16 biþi, R8 respectiv R16 sau conþinutul unei locaþii de memorie de 8 sau 16 biþi, M8

respectiv M16 .Forme de utilizare:

SHL R, 1 ; R <---- R*2SHL M, 1 ; M <---- M*2

Dupá execuþia instrucþiunii, flagul CF va conþine bitul c.m.s. al registrului R sau locaþiei dememorie M.

SHL R, CL ; R <---- R*2(CL)

SHL M, CL ; M <---- M*2(CL)

Dupá execuþia instrucþiunii, flagul CF va conþine ultimul bit deplasat spre stänga al registrului R saulocaþiei de memorie M.

2 - 32

15 14 13 11 10 9 8 7 6 5 4 3 2 1 012AX

b) SHR DST, 1 ; Deplasare logicá dreapta a operandului DST cu 1 poziþii SHR DST, CL ; Deplasare logicá dreapta a operandului DST cu (CL) poziþii

Forme de utilizare:SHR R, 1 ; R <---- R/2SHR M, 1 ; M <---- M/2

Dupá execuþia instrucþiunii, flagul CF va conþine bitul c.m.p.s. al registrului R sau locaþiei dememorie M.Exemplu: Dacá AL = 00001011b = 11, dupá execuþia execuþiei shr al,1 flagul CF = 1, iar AL =00000101b.

SHR R, CL ; R <---- R/2(CL)

SHR M, CL ; M <---- M/2(CL)

Dupá execuþia instrucþiunii, flagul CF va conþine ultimul bit deplasat spre dreapta al registrului Rsau locaþiei de memorie M.

c) SAL DST, 1 ; Deplasare aritmeticá stänga a operandului DST cu 1 poziþii SAL DST, CL ; Deplasare aritmeticá stänga a operandului DST cu (CL) poziþii

Observaþie: Instrucþiunea SAL DST, 1 (CL) este analoagá instrucþiunii SHL DST, 1 (CL).

d) SAR DST, 1 ; Deplasare aritmeticá dreapta a operandului DST cu 1 poziþii SAR DST, CL ; Deplasare aritmeticá dreapta a operandului DST cu (CL) poziþii

Observaþie: Instrucþiunea SAR DST, 1 (CL) este analoagá instrucþiunii SHR DST, 1 (CL) cuprecizarea cá aceasta din urmá se aplicá operanzilor cu semn (din Aceastá cauzá, semnuloperandului se pástreazá)

e) ROL DST, 1 ; Rotire la stänga (cu carry) a operandului DST cu 1 poziþii ROL DST, CL ; Rotire la stänga (cu carry) a operandului DST cu (CL) poziþii

Forme de utilizare:ROL R, 1 ; ROL M, 1 ;

Bitul c.m.s. al registrului R sau a locaþiei de memorie M se deplaseazá ín flagul CF ßi ín poziþiabitului c.m.p.s. al registrului R sau a locaþiei de memorie M.

ROL R, CL ; ROL M, CL ;

Dupá execuþia instrucþiunii, flagul CF precum ßi bitul c.m.p.s. al registrului R sau a locaþiei dememorie M va conþine ultimul bit deplasat spre stänga al registrului R sau locaþiei de memorie M.

f) ROR DST, 1 ; Rotire la dreapta (cu carry) a operandului DST cu 1 poziþii ROR DST, CL ; Rotire la dreapta (cu carry) a operandului DST cu (CL) poziþii

Forme de utilizare:ROR R, 1 ; ROR M, 1 ;

Bitul c.m.p.s. al registrului R sau a locaþiei de memorie M se deplaseazá ín flagul CF ßi ín poziþiabitului c.m.s. al registrului R sau a locaþiei de memorie M.

ROR R, CL ; ROR M, CL ;

Dupá execuþia instrucþiunii, flagul CF precum ßi bitul c.m.s. al registrului R sau a locaþiei dememorie M va conþine ultimul bit deplasat spre dreapta al registrului R sau a locaþiei de memorieM.

g) RCL DST, 1 ; Rotire la stänga prin carry a operandului DST cu 1 poziþii RCL DST, CL ; Rotire la stänga prin carry a operandului DST cu (CL) poziþii

2 - 33

Forme de utilizare:RCL R, 1 ; RCL M, 1 ;

Bitul c.m.s. al registrului R sau a locaþiei de memorie M se deplaseazá ín flagul CF, iar vechiulconþinut al lui CF se deplaseazá ín poziþia bitului c.m.p.s. al registrului R sau a locaþiei de memorieM.

RCL R, CL ; RCL M, CL ;

Dupá execuþia instrucþiunii, flagul CF va conþine ultimul bit deplasat spre stänga al registrului R saulocaþiei de memorie M, iar CF se deplaseazá ín poziþia bitului c.m.p.s. al registrului R sau a locaþieide memorie M.

h) RCR DST, 1 ; Rotire la dreapta prin carry a operandului DST cu 1 poziþii RCR DST, CL ; Rotire la dreapta prin carry a operandului DST cu (CL) poziþii

Forme de utilizare:RCR R, 1 ; RCR M, 1 ;

Bitul c.m.p.s. al registrului R sau a locaþiei de memorie M se deplaseazá ín flagul CF, iar vechiulconþinut al lui CF se deplaseazá ín poziþia bitului c.m.s. al registrului R sau a locaþiei de memorieM.

ROR R, CL ; ROR M, CL ;

Dupá execuþia instrucþiunii, flagul CF va conþine ultimul bit deplasat spre dreapta al registrului Rsau a locaþiei de memorie M, iar CF se deplaseazá ín poziþia bitului c.m.s. al registrului R sau alocaþiei de memorie M.

Observaþii:a. Instrucþiunile de deplasare logicá ßi aritmeticá afecteazá toþi indicatorii de condiþie;b. Instrucþiunile de rotire afecteazá numai fanioanele CF ßi OF.

Cei opt operatori de mai sus sunt sugestiv prezentaþi ín Fig. 5.1.

Exemplul 1: Urmátoarea secvenþá de program realizeazá conversia unui numár reprezentat ínformat BCD neímpachetat, avänd 16 cifre zecimale, ín format ímpachetat. Precizám cá numárulneímpachetat se aflá memorat íncepänd de la adresa UNPCK, iar cel ímpachetat, íncepänd de laadresa PCK.

UNPCK DB 1,2,4,0,7,8,9,0,6,7,9,1,2,5,8,3PCK DB 8 DUP (?)

. . . . . . . . . . . . . . . . . . . . . . . . . . .mov dx, 8 ; DX conþine numárul cuvintelor cu numere neímpachetatemov cl, 4mov si, 0 ; SI = 0mov di, si ; DI = 0

CONVERT: mov ax, WORD PTR UNPCK[si] ; Ín AX se íncarcá cäte douá cifre ; zecimale neímpachetate

shl al, cl ; Cifra zecimalá mai puþin semnificativá se deplaseazá ín tetrada ; superioará a registrului AL

shr ax, cl ; Ín registrul AL se ímpacheteazá 2 cifre zecimalemov PCK[di], al ; Se memoreazá, pe un singur octet, 2 cifre zecimale add si, 2 ; Se trece la cifrele urmátoareinc di, 1 ;

2 - 34

dec dxjnz CONVERT

Fig. 5.1.

6. Grupul instrucþiunilor pe ßiruri de caractere

Pentru toate instrucþiunile pe ßiruri de caractere, se considerá cá ßirul sursá este conþinut ínsegmentul curent de date (a cárui adresá de ínceput este conþinutá ín registrul DS), iar adresarelativá a ßirului ín segment este conþinutá ín registrul SI. §irul destinaþie este conþinut ín segmentulde date suplimentare (a cárui adresá de ínceput este conþinutá ín registrul ES), iar adresa relativá aßirului ín segment este conþinutá ín registrul DI. Pentru ßirul sursá se poate considera ßi alt registrude segment utilizänd un prefix de registru adecvat (ES, CS sau SS). Flagul DF indicá sensul deparcurgere ín memorie al ßirurilor sau, altfel spus, modul ín care se actualizeazá registrele SI ßi DIdupá execuþia operaþiei. Astfel, dacá flagul DF are valoarea zero, atunci se considerá cá ßirurile sevor parcurge de la adrese mici cátre adrese mari. Actualizarea registrelor SI ßi DI se face prinincrementarea acestora cu 1 sau cu 2 dupá cum se executá o operaþie care implicá un octet sau uncuvänt. Dacá flagul DF are valoarea unu, atunci se considerá cá ßirurile se vor parcurge de la adrese

2 - 35

CF MSB LSB 0a) SHL Shift logical left

MSB LSB CF0b) SHR Shift logical right

c) SAL CF MSB LSB 0 Shift arithmetic left

d) SAR MS LS CF Shift arithmetic right

e) ROL CF MSB LSB Rotate left with carry

f) ROR MSB LSB CF Rotate right with carry

g) RCL CF MSB LSB Rotate through carry left

h) RCR MSB LSB CF Rotate through carry right

Operand

mari cátre adrese mici. Actualizarea registrelor SI ßi DI se face prin decrementarea acestora cu 1sau cu 2 dupá cum se executá o operaþie care implicá un octet sau un cuvänt.

Operaþiile elementare pe ßiruri de caractere sunt:

1. LODS SRC ; Load StringLODSB (LODSW) SRCInstrucþiunea íncarcá fiecare octet (cuvänt) din ßirul sursá SRC adresat prin DS:SI ín

registrul AL (AX), cu actualizarea corespunzátoare a registrului SI. Conþinutului ßirului sursá nu semodificá.

2. STOS DST ; Store StringSTOSB (STOSW) DSTInstrucþiunea memoreazá conþinutul registrului AL (AX) ín octetul (cuväntul) din ßirul

destinaþie DST adresat prin ES:DI, cu actualizarea corespunzátoare a registrului DI. Conþinutulregistrului AL (AX) nu se modificá.Exemplu: STOSB ; Memoreazá conþinutul registrului AL la adresa ES:DI ßi

; incrementeazá conþinutul lui DI cu 1STOSW ; Memoreazá conþinutul registrului AX la adresa ES:DI ßi

; incrementeazá conþinutul lui DI cu 2

3. MOVS DST, SRC ; Move StringMOVSB (MOVSW) DST, SRCTransferá un octet (o pereche de octeþi) din ßirul sursá SRC adresat prin DS:SI ín octetul

(perechea de octeþi) din ßirul destinaþie DST adresat prin ES:DI, cu actualizarea corespunzátoare aregistrelor index SI ßi DI. Conþinutului ßirului sursá nu se modificá.

Observaþie: Este clar cá ínaintea operaþiei de transfer trebuie íncárcate ín registrele SI ßi DIadresele de ínceput ale celor douá ßiruri (sursá, respectiv destinaþie), iar ín CX numárul elementelorce trebuie transferate. Pentru claritate prezentám urmátoarele exemple:

Exemplul 1. Mutarea unui bloc de memorie de la o adresa sursa la o adresa destinaþie. Vomprezenta o primá variantá a acestei probleme care nu utilizeazá primitivele pentru ßiruri.

DATA SEGMENT sir1 DB 100 DUP(7) sir2 DB 100 DUP(?) DATA ENDS CODE SEGMENT ASSUME cs: CODE, ds: DATA start: mov ax, DATA mov ds, ax ; Atenþie ! Cänd nu se utilizeazá primitivele MOVSB

; sau MOVSW, ambele ßiruri (sursá ßi destinaþie) se ; pot gási ín acelaßi segment (de exemplu, segmentul ; de date)

mov si, OFFSET sir1 mov di, OFFSET sir2 mov cx, LENGTH sir1

cld ; §terge DF (DF = 0) muta: mov al, [si] mov [di], al inc si inc di loop muta

2 - 36

SF: mov ax, 4c00hint 21h

CODE ENDS END start

Exemplul 2. Varianta care utilizeaza primitiva movs este urmatoarea:

DATA SEGMENT sir1 DB 100 DUP(7) sir2 DB 100 DUP(?) DATA ENDS CODE SEGMENT ASSUME cs: CODE, ds: DATA start: mov ax, DATA mov ds, ax

mov es, ax ; Atenþie ! Cänd se utilizeazá MOVSB sau MOVSW, registrul; DI se foloseßte numai cu segmentul adresat prin ES

mov si, OFFSET sir1 mov di, OFFSET sir2 mov cx, LENGTH sir1

cld ; §terge DF (DF = 0) muta: movs sir1, sir2 ; sau movsb loop mutaSF: mov ax, 4c00h

int 21h CODE ENDS END start

Exemplul 3. In general, transferul unui bloc de date de la o adresa la alta se face astfel:. . . . . . . . . . . . . . . .mov ax, extra_sgm ; Se íncarcá registrul ES cu adresa de bazá a mov es, ax ; segmentului de date suplimentaremov si, OFFSET SRCmov di, OFFSET DSTmov cx, numar_elementecld ; DF = 0 - ßirurile se vor parcurge ín sens crescátor

MUTA: movsb ; Transferul octeþilor de la sursa SRC la destinaþialoop MUTA ; DST se executá päná cänd CX = 0. . . . . . . . . . . . . . .

4. CPMS DST, SRC ; Compare StringsCMPSB (CMPSW) DST, SRCCompará un octet (o pereche de octeþi) din ßirul destinaþie DST adresat prin ES:DI cu

octetul (perechea de octeþi) din ßirul sursá SRC adresat prin DS:SI, cu actualizarea corespunzátoarea registrelor SI ßi DI. Comparaþia se realizeazá prin scáderea octetului (cuväntului) sursá din octetul(cuväntul) destinaþie, fárá ínscrierea rezultatului, dar cu poziþionarea indicatorilor de condiþieconform rezultatului obþinut. Conþinutul celor douá ßiruri nu se modificá.Exemplul 4. DATA SEGMENT sir1 DB 'AAAABC' lsir1 EQU $-sir1

2 - 37

sir2 DB 'AAAACB' DATA ENDS CODE SEGMENT ASSUME cs:CODE, ds:DATA, es:DATA

start: mov ax, DATA mov ds,ax mov es,ax mov si, OFFSET sir1 mov di, OFFSET sir2 mov cx, lsir1/TYPE sir1

comp: cmpsb jne exit loop comp exit: nop CODE ENDS END start

4. SCAS DST ; Scan StringSCASB (SCASW) DSTScaneazá ßirul destinaþie DST adresat prin ES:DI. Instrucþiunea poziþioneazá indicatorii de

condiþie conform rezultatului diferenþei dintre conþinutul registrului AL (AX) ßi octetul (perecheade octeþi) din ßirul destinaþie DST fárá ínscrierea rezultatului ßi fárá modificarea conþinutuluiregistrului AL (AX) ßi a conþinutului ßirului. Se actualizeazá corespunzátor registrul DI.

Pentru repetarea operaþiile elementare pe ßiruri de caractere se pot utiliza urmátoareleprefixe (obþinänd astfel o instrucþiune cu opcod-ul pe 2 octeþi):

1. REP - Se repetá operaþia care urmeazá päná cänd conþinutul registrului CX devine zero (numai este nevoie de instrucþiunea LOOP ca ín exemplul anterior). Precizám cá dupá fiecare execuþiea operaþiei elementare conþinutul registrului CX este decrementat cu 1.

Exemplu: Dorim sá transferám 100 octeþi de la adresa DS:0200h la adresa DS:0300h.Secvenþa de instrucþiuni va fi urmátoarea:

mov ax, dsmov es, axmov si, 200hmov di, 300hmov cx, 100cldrep movsb

2. REPZ, REPE - Se repetá operaþia care urmeazá päná cänd conþinutul registrului CX devinezero sau päná cänd indicatorul ZF devine zero. Indicatorul ZF este setat numai de cátreinstrucþiunile SCASB (SCASW) ßi CMPSB (CMPSW) la egalitatea a douá elemente. Menþionámcá dupá fiecare execuþie a operaþiei elementare conþinutul registrului CX este decrementat cu 1.

3. REPNZ, REPNE - Se repetá operaþia care urmeazá päná cänd conþinutul registrului CXdevine zero sau päná cänd indicatorul ZF devine unu. Indicatorul ZF este setat numai de cátreinstrucþiunile SCASB (SCASW) ßi CMPSB (CMPSW) la egalitatea a douá elemente. Menþionámcá dupá fiecare execuþie a operaþiei elementare conþinutul registrului CX este decrementat cu 1.

Observaþie: Tipul prefixului este semnificativ numai pentru operaþiile SCASB (SCASW) ßiCMPSB (CMPSW). Pentru toate celelalte instrucþiuni pe ßiruri de elemente, toate prefixele auaceeaßi semnificaþie ca ßi prefixul REP.

2 - 38

Prezentám ín continuare cäteva exemple de utilizare a instrucþiunilor pe ßiruri de caractere.

Exemplul 5. Utilizänd prefixul REP, bucla muta: movs sir1, sir2 loop mutadin Exemplul 2 se poate rescrie astfel:

rep movs sir1, sir2sau

movsb sir1, sir2

Exemplul 6. Ín varianta cu prefix REP, bucla din Exemplul 4comp: cmpsb

jne exit loop comp exit: nopse ínlocuießte cu

repe cmpsb jne exit exit: nop

Exemplul 7. ; TRANSFB - transferá un bloc de date dintr-o zoná de memorie ín altá zoná de memorie DOSSEG

.MODEL SMALL

.STACK 100hlung_bloc EQU 20h

.DATAbloc_sursa db 20 DUP (0A)bloc_dest db 20 DUP (0) .CODESTART:

mov ax, @DATA ; Íncarcá ín AX adresa de bazá a segmentului de date mov ds, ax cld ; §terge DF (DF = 0) mov cx, lung_bloc ; Se íncarcá CX cu lungimea blocului de date mov si, OFFSET bloc_sursa ; Se íncarcá SI cu adresa de ínceput a blocului sursá mov ax, SEG bloc_sursa ; Se íncarcá AX cu adresa de segment a blocului

mov ds, ax ; sursá, care se ínscrie apoi ín DS mov di, OFFSET bloc_dest; Se íncarcá DI cu adresa de ínceput a blocului dest mov ax, SEG bloc_dest ; Se íncarcá AX cu adresa de segment e blocului mov es, ax ; destinaþie, care se ínscrie apoi ín EStrans: movsb ; Se realizeazá transferul octet cu octet loop trans mov ax, 4c00h ; Ießire ín sistem int 21h END START

Exemplul 8.; COMPAS - compara doua siruri de octeti, numarul locatiilor diferite fiind contorizat ; in registrul DX

2 - 39

DOSSEG.MODEL SMALL.STACK 100h

.DATAlungs EQU 20h ; lungs - lungimea sirurilor de comparatbloc_sursa db lungs DUP (0)bloc_dest db lungs/4 DUP (1) db lungs/4 DUP (0) db lungs/4 DUP (5) db lungs/4 DUP (0) .CODESTART:

mov ax, @DATA mov ds, ax mov ax, SEG bloc_sursa mov ds, ax mov si, OFFSET bloc_sursa mov ax, SEG bloc_dest mov es, ax mov di, OFFSET bloc_dest cld ; Sterge DF mov cx, lungs ; Incarca CX cu lungimea sirurilor de comparat

xor dx, dxcompb: cmpsb ; Bucla pentru compararea sirurilor, octet cu octet loope compb jcxz SF1 ; Daca CX = 0, operatia de comparare s-a terminat inc dx ; In DX se contorizeaza numarul locatiilor ; diferite dintre cele doua siruri inc cx ; loop compbSF1: jz SF inc dx SF: mov ax, 4c00h ; Iesire in sistem int 21h END START

7. Instrucþiuni de intrare/ießire (I/O)

Accesul la interfeþele corespunzátoare echipamentelor periferice se realizeazá prinintermediul unor instrucþiuni speciale. Fiecare interfaþá are asociate un numár de coduri specificenumite porturi. Atribuirea codurilor pentru fiecare interfaþá se face la proiectarea sistemului decalcul. Comunicaþia íntre microprocesor ßi mediul exterior reprezentat de interfeþele de I/O se faceprin execuþia unor instrucþiuni care adreseazá aceste porturi. Un port este o valoare íntreagáreprezentatá pe 8 sau 16 biþi.

Citirea unor date sau informaþii de stare se face prin intermediul unor instrucþiuni de forma: a) IN AL (AX), PORT ; Input byte or word b) IN AL (AX), DX

Forma a) poate fi utilizatá numai dacá portul de intrare PORT are un cod mai mic decät 256(PORT ) ßi este specificat direct printr-un octet ín cadrul instrucþiunii. Efectul∈ {0, 1, ..., 255}acestei instrucþiuni constá ín íncárcarea valorii citite din PORT-ul specificat ín registrul AL (AX).

2 - 40

Exemplu: in al, 14 ; Citeßte octetul din portul cu numárul 14in ax, 5 ; Citeßte cuväntul din portul cu numárul 5

Efectul execuþiei unei instrucþiuni de forma b) constá ín íncárcarea valorii citite de la portuladresat indirect prin conþinutul registrului DX, ín registrul AL (AX).Exemplu: mov dx, 14 ;

in al, dx ; Citeßte octetul din portul cu numárul 14mov dx, 5 ;in ax, dx ; Citeßte cuväntul din portul cu numárul 5

Observaþii:1. Numai primele 256 porturi pot fi specificate direct ín instrucþiune, ín timp ce oricare din cele2**16 porturi pot fi specificate indirect prin registrul DX.2. Avantajul specificárii directe a portului constá ín aceea cá nu mai este necesará executarea uneiinstrucþiuni suplimentare de íncárcare prealabilá a numárului portului ín registrul DX.3. Avantajul specificárii indirecte a portului constá ín aceea cá se pot adresa (prin bucle) porturi cuadrese consecutive.

Transmiterea unor date sau a unor comenzi se face prin intermediul unor instrucþiuni deforma: a) OUT PORT, AL (AX) ; Output byte or word b) OUT DX, AL (AX)

Efectul acestor instrucþiuni constá ín: a) Scrierea conþinutului registrului AL (AX) ín portul de adresá (cod) PORT specificat íninstrucþiune (PORT ).∈ {0, 1, ..., 255} b) Scrierea conþinutului registrului AL (AX) ín portul adresat indirect prin conþinutul registruluiDX.Exemple: out 49, al ; Se ínscrie octetul din AL ín portul 49

out 15, ax ; Se ínscrie cuväntul din AX ín portul 15Echivalentul acestor instrucþiuni, utilizänd ínsá registrul DX este urmátorul:

mov dx, 49 ;out dx, al ; Se ínscrie octetul din AL ín portul 49mov dx, 15 ;out dx, ax ; Se ínscrie cuväntul din AX ín portul 15

Observaþie: Comentariile de la instrucþiunea IN sunt valabile ßi pentru instructiunea OUT.

8. Instrucþiuni pentru controlul íntreruperilor

Acþiunea provocatá de îndeplinirea unei condiþii (interne sau externe în raport cu programulaflat în execuþie) prin care se realizeazá automat transferul controlului unei rutine speciale de tratarese numeste întrerupere, iar rutina respectivá se numeßte rutiná de întrerupere. Existá douá clasede întreruperi: Întreruperi interne: acestea sunt iniþiate de starea programului aflat în execuþie sau prinexecutarea unor instrucþiuni speciale de întrerupere. Ele se caracterizeazá prin faptul cá suntsincrone în raport cu programul aflat în execuþie. Se mai numesc întreruperi software. Întreruperi externe: acestea sunt iniþiate de partea hardware prin intermediul semnalelor deîntrerupere trimise cátre procesor. Declanßarea lor semnificá îndeplinirea unor evenimente externeprocesorului. Ele se caracterizeazá prin faptul cá sunt asincrone în raport cu programul aflat înexecuþie. Se mai numesc întreruperi hardware.

O rutiná de întrerupere este asemánátoare unei proceduri în sensul cá dupá execuþia ei serevine în programul întrerupt la instrucþiunea imediat urmátoare celei întrerupte. Modalitatea dedeclanßare a unei rutine de întrerupere este în general diferitá de apelul unei proceduri, existînd

2 - 41

însá, pentru anumite clase de întreruperi ßi similitudini (la microprocesoarele 8086/88 existáaproape o similitudine perfectá între apelul procedurilor îndepártate ßi instrucþiunile de întrerupere).Ca element comun notám necesitatea salvárii contextului programului întrerupt (cuvänt de stareprogram - PSW, numárátor de program, registre generale) la intrarea în rutina de întrerupere.Deoarece anumite întreruperi sunt iniþiate de evenimente externe procesorului, asincrone în raportcu programul aflat în execuþie, acesta nu le poate transmite nici un fel de parametri, comunicaþiilede date putänd avea loc numai utilizänd variabile direct accesibile ambelor secvenþe de program:secvenþa curent executabilá ßi rutina de întrerupere. Acþiunile ce rezultá în urma apariþiei unei întreruperi ßi care determiná transferul controluluirutinei de întrerupere poartá numele de secvenþá de întrerupere. Secvenþa de întrerupere specificámicroprocesoarelor 8086/88 este urmátoarea:

1. Se salveazá valorile curente ale PSW, CS ßi IP în stivá;2. Se încarcá perechea de registre CS:IP dintr-un pointer determinat pe baza unei valori

calculatá folosind tipul întreruperii, ßi anume, dacá n este tipul întreruperii, valoarea calculatá este4*n. Pointerul ce conþine noile valori ale registrelor CS ßi IP se numeßte vector de întrerupere;

3. Se ßterg flagurile IF si TF. Noile conþinuturi ale registrelor CS ßi IP determiná adresa de început a rutinei deîntrerupere. Tipul întreruperii este un numár întreg în gama 0...255. Adresa vectorului de întrerupererezultá prin înmulþirea tipului întreruperii cu 4. Primele 5 tipuri de întrerupere, ßi anume 0, 1, 2, 3 ßi4, au semnificaþii speciale predefinite: a. tipul 0 este utilizat pentru tratarea erorii de împárþire la zero. Dacá se realizeazá oîmpárþire la zero se declanßeazá automat o întrerupere cu tipul 0. O astfel de situaþie poate apare oride cîte ori, dupá executarea unei instrucþiuni idiv sau div, cätul are o depáßire de format, indiferentde valoarea flagului IF; b. tipul 1 este utilizat pentru executarea programelor în regim "pas cu pas". Dacá flagul TFeste setat se va declanßa automat o întrerupere cu tipul 1 la sfärßitul fiecárei instrucþiuni executatede procesor; c. tipul 2 este utilizat de cátre întreruperea nemascabilá. Întreruperea nemascabilá este oîntrerupere externá care poate apare indiferent de starea flagului IF. d. tipul 3 este rezervat unei instrucþiuni speciale de întrerupere cu lungimea de un octet cucodul 0cc16. Aceastá instrucþiune este utilizatá pentru implementarea facilitáþii de executare a unuiprogram cu puncte de oprire (breakpoint) din cadrul programelor depanatoare (debugger). e. tipul 4 este utilizat pentru tratarea depáßirilor. Dacá se executá o instrucþiune into cändflagul OF este setat, se va declanßa o întrerupere cu tipul 4.

Instrucþiunile prin care se pot provoca prin program întreruperi se numesc instrucþiuni deîntrerupere. Aceste instrucþiuni sunt urmátoarele:

Instrucþiunea •INT n

unde n este un numár íntreg permite generarea unor íntreruperi software. Numárul n dininstrucþiune reprezintá numárul nivelului de íntrerupere asociat semnalului de íntrerupere generat.Sunt posibile 256 nivele de íntrerupere cuprinse íntre 0 ßi 255. Pentru fiecare íntrerupere existá oprocedurá specialá de tratare a acesteia. Efectul instrucþiunii INT n constá ín salvarea ín stivá aregistrului indicatorilor de condiþie F, a conþinutului registrelor CS ßi IP, resetarea indicatorilor TFßi IF ßi efectuarea saltului la adresa procedurii de tratare a íntreruperii, adresá memoratá pe 4 octeþila adresa corespunzátoare nivelului de íntrerupere. Adresa asociatá unui nivel de íntrerupere seobþine ínmulþind cu 4 numárul n al nivelului de íntrerupere. Adresa de segment pentru adresa

2 - 42

asociatá unui nivel de íntrerupere este zero. Simbolic, cele spuse mai sus se scriu sub urmátoareaformá:

SP <----- SP - 2(SP +1, SP) <----- F ; IF, TF <--- 0

SP <----- SP - 2(SP +1, SP) <----- CS

SP <----- SP - 2(SP +1, SP) <----- IP

IP <----- (4 * n) CS <----- (4 * n +2)

Adresele procedurilor de tratare a íntreruerilor sunt continute íntr-un tabel cu 256 de intrári, fiecareintrare fiind pe 4 octeþi. Tabelul íncepe la adresa de memorie 0000:0000h, conform Fig. 8.1.

Ín general, legátura cu sistemul de operare (BIOS, DOS) de realizeazá utilizänd instrucþiunide tip INT.

Reíntoarcerea din procedurile de tratare a íntreruperilor se face cu ajutorul instrucþiuniiIRET, plasatá la sfärßitul unei astfel de proceduri ßi care are ca efect refacerea valorilor registrelorIP ßi CS salvate anterior ín stivá, precum ßi starea indicatorilor de condiþie salvaþi de asemenea ínstivá, astfel:

IP <----- (SP +1, SP) SP <----- SP + 2CS <----- (SP +1, SP)SP <----- SP + 2 F <----- (SP +1, SP)SP <----- SP + 2

Instrucþiunea INTO (Interrupt on Overflow) este o instrucþiune pe un octet care genereazá oíntrerupere de tipul 4, dacá bistabilul de condiþie OF = 1. O astfel de instrucþiune ar trebui sáurmeze dupá fiecare instrucþiune aritmeticá aplicatá unor operanzi cu semn ori de cäte ori existáposibilitatea apariþiei unei depáßiri.

Ín afara íntreruperilor software INT n prezentate, activitatea procesorului poate fi•íntreruptá ßi de un semnal extern ce se aplicá pe pinul INTR al procesorului. Dacá indicatorul IF =1, dupá terminarea execuþiei instrucþiunii curente, procesorul se opreßte din taskul sáu obißnuit ßi sepregáteßte sá treacá la subrutina de tratare a íntreruperii recepþionate. Pentru ínceput, procesorulsalveazá ín stivá toate informaþiile importante despre taskul sáu (valorile curente ale indicatorilor decondiþie ßi ale indicatorilor de stare, valorile curente ale registrelor CS ßi IP), apoi va prelua de la

2 - 43

Memorie Adresa memorie 0000: 0000 h

0000: 0001 h0000: 0002 h0000: 0003 h0000: 0004 h0000: 0005 h0000: 0006 h0000: 0007 h0000: 0008 h0000: 0009 h

IP

CS

IP

CS

Intrerupere tip 0

Intrerupere tip 1

Fig. 8.1.

dispozitivul (elementul) extern tipul íntreruperii ßi va trece la subrutina de tratare a acesteia. Oricesubrutiná de tratare a unei íntreruperi se terminá cu instrucþiunea IRET.

Dacá procesorul primeßte o íntrerupere pe pinul NMI atunci, indiferent de valoarea lui IF,procesorul va executa aceleaßi operaþii ca ßi la o íntrerupere pe pinul INTR, cu singura deosebire cánu mai este nevoie sá se precizeze tipul íntreruperii deoarece, ín aceastá situaþie, se genereazá oíntrerupere de tipul 2.

8.1. Interfaþa limbaj de asamblare - Sistem de operare DOS Rutinele pe care sistemul de operare DOS le utilizeazá pentru gestiunea resurselorcalculatorului pot fi apelate din programele scrise în limbaj de asamblare. Aceste rutine se mainumesc apeluri sistem (system calls). Utilizarea apelurilor sistem de cátre programele de aplicaþiepermite obþinerea de programe independente de maßina fizicá, garantändu-se compatibilitateaacestora cu versiunile superioare ale sistemului de operare DOS. Instrucþiunile de întrerupere cu tipurile 2016, ..., 3f16 sunt rezervate apelurilor sistem.Majoritatea apelurilor sistem sunt grupate la întreruperea cu tipul 2116. Aceste apeluri suntcunoscute sub numele de funcþii sistem. Pentru executarea unui apel sistem se procedeazá astfel: - se transferá parametrii apelului în registrele procesorului. Parametrii împreuná curegistrele corespunzátoare sunt specifici fiecárui apel în parte; - se executá instrucþiunea int cu tipul corespunzátor apelului respectiv.

Pentru executarea unei funcþii sistem se procedeazá astfel: - se transferá parametrii funcþiei în registre; - se transferá numárul funcþiei în registrul ah; - se transferá un cod suplimentar, dacá acest lucru este cerut de funcþia respectivá, ínregistrul al; - se executá instrucþiunea int 21h.

Majoritatea funcþiilor sistem seteazá flagul CF dacá a apárut o eroare, codul de eroare fiindreturnat ín registrul AX. Principalele funcþii sistem pot fi grupate în urmátoarele categorii:

a. Funcþii pentru operaþiile de I/E standard, specifice urmátoarelor dispozitive de I/E:consolá, imprimantá, interfaþá serialá. Dacá un program foloseßte pentru implementarea operaþiilorde I/E aceste funcþii, intrarea respectiv ießirea sa pot fi redirectate. Dintre aceste funcþii ne referimla urmátoarele: - Funcþia 0116: aceastá funcþie citeßte un caracter de la intrarea standard, pe care îl trimite înecou la ießirea standard. Dacá caracterul citit este CTRL-C, se executá int 23h. La apel (ah)=0116, ßidupá execuþie (al)=codul ASCII al caracterului citit. - Funcþia 0216: aceastá funcþie scrie un caracter la ießirea standard. Dacá se tasteazáCTRL-C, se executá int 23h. La apel (ah)=0216, (dl)=codul ASCII al caracterului care trebuie scris. - Funcþia 0716: aceastá funcþie citeßte un caracter de la intrarea standard. Caracterul citit nueste trimis în ecou la ießirea standard, ßi nu se efectueazá nici un test pentru CTRL-C. La apel(ah)=0716 ßi dupá execuþie (al)=codul ASCII al caracterului citit. - Funcþia 0916: aceastá funcþie realizeazá afißarea unui ßir de caractere la ießirea standard,ßirul de caractere fiind terminat cu '$'. Caracterul '$' nu se afißeazá. La apel (ah)=0916,DS:DX=adresa de început a ßirului de caractere respectiv. - Functia 0A16: aceasta funcþie realizeazá citirea unui ßir de caractere de la intrarea standard.La apel (ah)=0A16, DS:DX=adresa unei zone tampon cu urmátoarea structurá: -primul octet al zonei va conþine, la apel, numárul maxim (fie acesta n) de caractere care vorfi citite, inclusiv un caracter CR;

2 - 44

-al doilea octet al zonei va conþine, dupá execuþia funcþiei, numárul de caractere efectivcitite, caracterul CR nefiind contorizat; -restul zonei va trebui sá conþiná cel puþin atäþia octeþi cäþi au fost specificaþi în primul octet.Dupá execuþia funcþiei aici va fi depus ßirul citit, primul caracter din ßir fiind plasat la adresa ceamai micá. Caracterele citite sunt plasate în zona tampon specificatá, începänd cu al treilea octet alzonei. Citirea se terminá cänd se tasteazá CR. Dacá se încearcá introducerea mai multor caracteredecät numárul specificat, adicá n-1, caracterele în plus se ignorá, la ießirea standard fiind trimiscaracterul BEL (0716). Ultimul caracter din zona tampon este întotdeauna CR. Dacá se tasteazáCTRL-C, se executá int 23h.

Exemplu. Urmátorul program citeßte o tastá, determiná dacá este o tastá obißnuitá sau funcþionaláßi apoi afißeazá codul tastei. Citirea tastei se face cu funcþia 0716. Dacá la primul apel se întoarcecodul 0 ín registrul AL, înseamná cá tasta apasatá este o tastá funcþionalá, codul extins al tasteifiind determinat cu un al doilea apel al funcþiei.

DATA SEGMENTcerere DB 'Tastati o tasta', 0ah, 0dh, '$'sir DB 3 DUP (?), 0ah, 0dh, '$'mesaj1 DB 'Codul tastei este:', 0ah, 0dh, '$'mesaj2 DB 'Codul extins al tastei este:', 0ah, 0dh, '$' DATA ENDS STIVA SEGMENT STACK 'STACK' DW 30 DUP(?)virf LABEL WORD STIVA ENDS COD SEGMENT ASSUME cs:COD, ds:DATA, ss:STIVAstart: jmp incep

conv PROC NEAR; Primeßte ín registrul AL un numár íntreg ßi ín registrul BX adresa unei zone de 3 octeþi.; Íntoarce ín aceastá zoná ßirul de caractere corespunzátor scrierii zecimale a numárului push dx xor ah, ah mov dl, 10 div dl add ah, '0' mov [bx+2], ah xor ah, ah div dl add ah, '0' mov [bx+1], ah add al, '0' mov [bx], al pop dx retconv ENDP

incep: mov ax, DATA mov ds, ax

2 - 45

mov ax, STIVA mov ss, ax mov sp, OFFSET virf lea dx, cerere ; Se afißeazá mesajul care cere tastarea unei taste mov ah,09h int 21h mov ah, 07h ; Se citeßte o tasta int 21h cmp al, 0 ; Se testeazá dacá este tastá funcþionalá jz cod_extins lea bx,sir ; Se determiná codul tastei call conv lea dx,mesaj1 ; Se afißeazá mesaj1 mov ah,09h int 21h jmp afiscod_extins: mov ah,07h ; Se citeßte codul extins int 21h lea bx,sir ; Se determiná codul extins call conv lea dx,mesaj2 ; Se afißeazá mesaj2 mov ah,09h int 21hafis: lea dx,sir ; Se afißeazá codul tastei mov ah,09h int 21h mov ax,4c00h int 21hCOD ENDS END start

b.Funcþii pentru gestiunea memoriei Sistemul de operare DOS þine evidenþa blocurilor de memorie alocate prin scrierea laînceputul fiecáruia a unei înregistrári, numitá bloc de control al memoriei (Memory ControlBlock, MCB) ce conþine informaþii referitoare la dimensiunea blocului, în numár de paragrafe (1paragraf=16 octeþi) ßi un pointer la urmátorul bloc, dacá existá. Dintre funcþiile pentru gestiuneamemoriei prezentám pe urmátoarele: - Funcþia 4816: prin aceastá funcþie, programul aflat în execuþie poate cere alocarea uneicantitáþi de memorie specificatá în numár de paragrafe. La apel AH=4816, BX=numárul deparagrafe cerute. Dacá la retur CF=1, înseamná ca a apárut o eroare, codul de eroare fiind specificatîn registrul AX, astfel: dacá AX=7 înseamná cá s-a alterat un MCB, iar dacá AX=8 înseamná cá nuexistá suficientá memorie pentru alocare. În registrul BX se obþine numárul de paragrafedisponibile. Dacá la retur CF=0, înseamná cá alocarea s-a efectuat cu succes, în registrul AXîntorcîndu-se adresa de segment a zonei zonei de memorie alocatá. - Funcþia 4916: aceastá funcþie elibereazá un bloc de memorie alocat anterior cu functia 4816.La apel AH=4916, ES=adresa de segment a blocului respectiv. Dacá la retur CF=1 înseamná cá aaparut o eroare, codul de eroare fiind specificat în registrul AX, astfel: dacá AX=7 înseamnáalterarea MCB-ului, iar dacá AX=9 înseamná cá se doreßte eliberarea unui bloc ce nu a fost alocatcorect (cu funcþia 4816). Dacá la retur CF=0 înseamná cá eliberarea s-a fácut cu succes.

2 - 46

- Funcþia 4a16: Aceastá funcþie modificá dimensiunea unui bloc de memorie alocat anterior.La apel AH=4a16, BX=noua dimensiune a blocului, în numár de paragrafe. Dacá la retur CF=1,înseamná cá a aparut o eroare, codul de eroare fiind specificat în registrul AX, astfel: AX=7înseamná alterarea MCB-ului, AX=8 înseamná memorie insuficientá (în situaþia în care s-a doritmárirea dimensiunii blocului), dacá AX=9 înseamná cá se doreßte modificarea dimensiunii unuibloc de memorie ce nu a fost alocat corect. Dacá AX=8, registrul BX va conþine numárul deparagrafe disponibile. Dacá la retur CF=0 înseamná cá modificarea dimensiunii blocului s-a fácutcu succes.

Exemplu. Urmátorul program alocá un bloc de memorie suficient de mare pentru a memora nocteþi, realizeazá umplerea zonei de n octeþi cu o valoare constantá, dupá care dezalocá zonaalocatá. La încárcarea unui program în memorie, sistemul de operare DOS îi alocá toatá memoriadisponibilá. Programul va trebui sá ajusteze blocul de memorie care i se alocá la dimensiuneaefectiv necesará.

DATA SEGMENT a1 DB 'Alocare efectuata cu succes', 0ah, 0dh, '$' a2 DB 'Alocare esuata', 0ah, 0dh, '$' d DB 'Dezalocare efectuata cu succes', 0ah, 0dh, '$' n DW 7000h ; dimensiunea blocului cnst DB 88h segm DW ? DATA ENDS STIVA SEGMENT STACK 'STACK' DW 150 DUP (?) virf LABEL WORD STIVA ENDS COD SEGMENT ASSUME cs:COD, ds:DATA start: mov ax, DATA mov ds, ax mov ax, STIVA mov ss, ax mov sp, OFFSET virf; Calculeazá numárul de paragrafe alocate programului ín AX mov ax, cs mov bx, es sub ax, bx mov cl, 4 shl ax, cl add ax, OFFSET ultima_instr xor dx, dx mov cx,10h div cx inc ax; Se reduce dimensiunea blocului de memorie alocat programului mov bx, ax mov ah, 4ah int 21h; Se calculeazá numárul de paragrafe necesare pentru a fi alocate

2 - 47

xor dx, dx mov ax, n mov cx,10h div cx cmp ax, 0 jz aloc inc ax aloc: mov bx, ax ; Se efectueazá alocarea mov ah, 48h int 21h jnc ok mov ah, 09h lea dx, a2 int 21h jmp gata ok: mov segm, ax mov ah, 09h lea dx, a1 int 21h cont: mov es, segm ; Se umple blocul alocat xor bx, bx mov cx, n mov dl, cnst trans: mov es:[bx], dl inc bx loop trans; Se dezalocá blocul alocat anterior mov ah, 49h int 21h mov ah, 09h lea dx, d int 21h gata: mov ax, 4c00h int 21hultima_instr: COD ENDS END start

c. Funcþii BIOS pentru controlul ceasului de timp real (INT 1AH)

Pentru ceasul de timp real, BIOS-ul conþine douá proceduri: una pentru tratareaíntreruperilor provenite de la ceasul de timp real ßi alta accesibilá utilizatorilor pentru controlulceasului de timp real. Procedura de tratare a íntreruperilor provenite de la ceasul de timp real esteapelatá de aproximativ 18,21 ori pe secundá. La fiecare apel al procedurii se incrementeazá uncontor format din 4 octeþi a cárui adresa este 40H:6CH. Contorul memoreazá numárul de treceriprin procedurá de la ora 00:00:00. De asemenea, aceastá procedurá verificá dacá contorul a ajuns laechivalentul a 24 ore. Ín acest ultim caz, contorul este reiniþializat la 0 ßi la adresa 40H:70H sememoreazá valoarea 1 (ín mod normal, valoarea acestui octet este 0). Pentru fiecare apel al acesteiproceduri se va apela íntreruperea software INT 1CH.

2 - 48

Procedura pentru controlul ceasului de timp real permite citirea, respectiv iniþializareacontorului de treceri prin procedura de tratare a íntreruperilor provenite de la ceasul de timp real.Pentru controlul ceasului de timp real se pot selecta urmátoarele funcþii:

Funcþia 0 - Citire contor.Ca rezultat al apelului acestei funcþii, registrul CX va conþine partea cea mai semnificativá,

iar registrul DX va conþine partea mai puþin semnificativá a contorului. Registrul AL va conþinevaloarea indicatorului de depáßire a 24 de ore.

Funcþia 1 - Iniþializare contor:Contorul se poate iniþializa ín modul urmátor: cei mai semnificativi 2 octeþi vor primi

valoarea conþinutá ín registrul CX, iar cei mai puþin semnificativi 2 octeþi vor primi valoareaconþinutá ín registrul DX.

Observaþie: Funcþiile 2 7 sunt funcþii specifice sistemelor de tip AT, astfel:÷

Funcþia 2 - Citeßte timpul din contorul nevolatil (CMOS) al ceasului de timp real.La ießire: Registrul CH - ora ín BCD;

Registrul CL - minutul ín BCD; Registrul DH - secunda ín BCD; Flagul CF = 1 dacá ceasul nu este operaþional.

Funcþia 3 - Seteazá timpul ín contorul nevolatil (CMOS) al ceasului de timp real.La intrare: Registrul CH, CL - ora ßi minutul ín BCD;

Registrul DH - secunde ín BCD;Registrul DL = 1 pentru salvarea opþiunii.

Funcþia 4 - Citeßte data din contorul nevolatil (CMOS) al ceasului de timp real.La ießire: Registrul CH - secolul ín BCD;

Registrul CL - anul ín BCD;Registrul DH - luna ín BCD;Registrul DL - ziua ín BCD;Flagul CF = 1 dacá ceasul nu este operaþional.

Funcþia 5 - Seteazá data ín contorul nevolatil (CMOS) al ceasului de timp real.La intrare: Registrul CH, CL - secolul ßi anul ín BCD;

Registrul DH, DL - luna ßi ziua ín BCD.

9. Instrucþiuni pentru sincronizare externáPentru sincronizarea cu evenimentele externe, microprocesoarele I8086/I8088 admit

instrucþiuneaHLT ; Halt

Prin execuþia acestei instrucþiuni, UCP-procesor intrá ín starea HALT. Efectul acesteiinstrucþiuni constá ín aceea cá oferá posibilitatea procesorului sá aßtepte sosirea unei íntrerupericare ar reprezenta realizarea unui eveniment ín proces.

Ießirea din starea HALT se poate face prin íntreruperi de tip NMI, íntreruperi pe pinul INTRcänd IF = 1, precum ßi prin semnalul hardware RESET = 1.

a). La apariþia unei íntreruperi, valorile curente ale indicatorilor de condiþie ßi aleindicatorilor de stare, precum ßi valorile curente ale registrelor CS ßi IP sunt salvate ín stivá ßiprocesorul trece ßi executá subrutina de tratare a íntreruperii respective. Cänd, ín aceastá subrutiná,procesorul íntälneßte instrucþiunea IRET, valorile lui IP, CS ßi registrului F sunt refácute din stivá,dupá care se va executa instrucþiunea care urmeazá imediat dupá HLT.

b). Dacá din HALT se iese cu RESET = 1, atunci íntregul sistem se iniþializeazá.

2 - 49