Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Setul de instructiuni al mr z - 80 ( iii ) - microprocesoare

SETUL DE INSTRUCTIUNI AL mR Z - 80 ( III )

1.Obiectul lucrarii

Se continua studiul setului de instructiuni al microprocesorului Z-80 cu urmatoarele grupe: instructiunile de salt, instructiunile aritmetice pe 16 biti, instructiunile de lucru cu acumulatorul si diverse, instructiunile pentru apelul subrutinelor, instructiunile de revenire din subrutine si, instructiunile de restart. Se prezinta aplicatii cu acestea.



2.Breviar teoretic

VII. Grupa instructiunilor de salt

Instructiunile din cadrul acestei grupe actioneaza asupra registrului PC (Programm Counter), provocand schimbarea continutului acestuia. Dar, registrul PC adreseaza memoria in vederea extragerii codului instructiunii ce urmeaza a fi executate de microprocesor. Se forteaza astfel executia urmatoarei instructiuni de la adresa specificata prin constanta pe 16 biti ce se incarca in PC. Practic, acest lucru provoaca un salt in derularea liniara a unui program si de aici denumirea acestei grupe de instructiuni.

Instructiunile de salt la microprocesorul Z-80 sunt de doua tipuri : directe si indirecte.

Salturile directe se caracterizeaza prin faptul ca in PC se depune direct constanta pe 16 biti ce reprezinta adresa de salt.

Salturile indirecte implica transferul de la un alt registru (deci indirect), a adresei de salt, in registrul PC.

mP Z-80 poate efectua doua categorii de instructiuni de salt de tip direct:

- absolute: saltul se face la o adresa absoluta de memorie - numar pe 16 biti;

- relative : saltul se face luand ca referinta valoarea continuta in PC-ul actual. Se indica, folosind codul complement fata de doi, numarul de locatii peste care se sare (inainte sau inapoi fata de PC-ul curent). Cu instructiuni de tip salt relativ se pot scrie programe cu caracter relocabil. Astfel de programe pot fi mutate oriunde in spatiul memoriei si vor putea fi rulate oricand din locul respectiv, obtinand aceleasi rezultate indiferent de acest loc.

Ambele categorii de instructiuni de salt direct prezinta cate doua subcategorii:

- neconditionate: saltul se efectueaza fortat;

- conditionate : saltul se efectueaza tinandu-se seama de valoarea indicatorilor de conditii.

A. Subgrupa instructiunii de salt absolut, neconditionat, direct

JP n16 - ( jump )

Simbolic : PC n16 ; Constanta pe 16 biti - n16 - este transferata neconditionat in registrul PC, provocand un salt la respectiva adresa la rularea programului.

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

JP n16

10

3

C3hn16L n16H

JP 200h

PC←200h

B. Subgrupa instructiunilor de salt absolut, conditionat, direct

Prin intermediul acestor instructiuni se testeaza bistabilii din cadrul registrului indicatorilor de conditii, putandu-se lua decizii in functie de valoarea lor logica. Prin intermediul acestor instructiuni se pot implementa blocurile logice de tip " test " din cadrul organigramelor.

Se pot testa patru din cei sase indicatori: Z, Cy, P/V, S .

Daca conditia testata nu este indeplinita, nu se executa salt si procesorul trece la executia instructiunii imediat urmatoare celei de salt conditionat.

Exista si alte instructiuni ce permit testarea indicatorilor de conditii.

Generic, instructiunile din aceasta grupa (8 instructiuni) se pot scrie:

JP cc, n16- ( jump if cc ) cc I

c c

codificare

( c c c )

SEMNIFICATIE

NZ

0 0 0

not zero - se executa instructiunea (saltul), daca indicatorul Z din registrul F este 0( rezultat nenul ) ;

Z

0 0 1

zero - se executa instructiunea (saltul), daca indicatorul Z din registrul F este 1 ( rezultat nul ) ;

NC

0 1 0

not carry - se executa instructiunea (saltul), daca indicatorul C din registrul F este 0( rezultatul nu este insotit de transport );

C

0 1 1

carry - se executa instructiunea (saltul), daca indicatorul C din registrul F este 1 ( rezultatul este insotit de transport ) ;

PO

1 0 0

parity odd - se executa instructiunea (saltul), daca indicatorul P din registrul F este 0 ( rezultatul obtinut este impar - odd - ) ;

PE

1 0 1

parity even - se executa instructiunea (saltul), daca indicatorul P din registrul F este 1 ( rezultatul obtinut este par - even - ) ;

P

1 1 0

positive - se executa instructiunea (saltul), daca indicatorul S din registrul F este 0 ( rezultatul obtinut este pozitiv ) ;

M

1 1 1

minus - se executa instructiunea (saltul), daca indicatorul S din registrul F este 1 ( rezultatul obtinut este negativ ) ;

OBSERVATIE . Un numar este par daca suma modulo 2 a bitilor sai este 0 ( sau numarul bitilor aflati in " 1 " logic este un numar par ).

Simbolic, aceste instructiuni realizeaza :

PC n16 - daca conditia testata cc este adevarata (se efectueaza salt);

sau PC PC+3 - daca conditia testata cc este falsa (se trece la instructiunea urmatoare).

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

JP cc ,n16

10

3

1 1 c c c 0 1 0n16L n16H

DEC B

JP Z ,200h

PC←200h pt. B←0

c c c

conditia testata

0 0 0

NZ(Z=0)

0 0 1

Z (Z=1)

0 1 0

NC(C=0)

0 1 1

C (C=1)

1 0 0

PO(P=0)

1 0 1

PE(P=1)

1 1 0

P (S=0)

1 1 1

M (S=1)

C. Subgrupa instructiunii de salt relativ, neconditionat, direct

JR e- jump relative (salt relativ neconditionat) ;e - deplasament exprimat in CC2 .

Simbolic, instructiunea realizeaza urmatorul lucru :

PC PC + 2 + e ; Adresa PC + 2 este adresa de referinta ce se ia in calcul la efectuarea saltului.

Pentru calculul deplasamentului se va avea in vedere urmatoarea schema :


Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

JR e

12

2

16he

PC←200h

JR ,02h

PC←204h

O astfel de instructiune efectueaza un salt neconditionat la o adresa de memorie aflata la o distanta relativa fata de adresa instructiunii urmatoare celei de salt (considerata adresa de referinta - vezi figura anterioara). Prin codul instructiunii se precizeaza distanta fata de adresa de referinta unde se va efectua saltul. Distanta este exprimata printr-un numar reprezentat in cod complement fata de 2, denumit deplasament (notat e).

La un deplasament negativ, saltul se face catre inapoi (catre adresele de inceput ale memoriei).

Pentru deplasament pozitiv, saltul se face catre inainte (catre adresele de sfarsit ale memoriei).

Spre exemplu, instructiunea JR 00h , va efectua salt neconditionat la instructiunea imediat urmatoare. InstructiuneaJR 0FEh , va efectua salt chiar pe ea insasi (microprocesorul intrand intr-o " capcana " ).

Cum deplasamentul este exprimat doar pe 8 biti, saltul se poate efectua cu maxim 127 locatii catre inainte, respectiv cu maxim 128 locatii catre inapoi, fata de adresa de referinta.

D. Subgrupa instructiunilor de salt relativ, conditionat, direct

a) JR kk, e - unde kkreprezinta conditia testata, dar spre deosebire de saltul absolut conditionat, kk poate fi doar :

kk I

Simbolic, instructiunea realizeaza urmatorul lucru :

Daca conditia kk este indeplinita se efectueaza salt, adica:

PC PC + 2 + e ; Adresa PC + 2 este adresa de referinta ce se ia in calcul la efectuarea saltului.

- Altfel, nu se efectueaza salt, adica :

PC PC + 2 ; Se trece la adresa instructiunii imediat urmatoare celei de salt relativ.

Apar urmatoarele situatii:

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

JR NC ,e

12

2

30h ,e

L←10h

1FFh: DEC L

200h: JR Z,0FDh

PC←200h+02h-03h

deci PC←1FFh

se repeta secventa de10h ori

JR C ,e

12

2

38h ,e

JR NZ ,e

12

2

20h ,e

JR Z ,e

12

2

28h ,e

b) DJNZ e- decrement and jump relative if not zero ( decrementeaza si salt relativ daca Z = 0 )


Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

DJNZ e

13

2

10he

OBSERVATIE. Secventa urmatoare de instructiuni:

LD B, n8

et1:      DJNZ et1

se constituie intr-o temporizare software. Decrementarea din instructiunea DJNZ se executa repetat (de n8 ori) pana cand B = 0. Folosind astfel de procedee, microprocesorul va putea sa contorizeze intervale de timp.

E. Subgrupa instructiunilor de salt indirect

JP (ss)

Simbolic : PC ss ; Continutul sursei duble ss este transferat neconditionat in registrul PC, provocand un salt la respectiva adresa. Denumirea "indirect" provine din faptul ca in prealabil, adresa (pe 16 biti) se incarca in registrul dublu specificat si apoi (indirect) aceasta ajunge in PC.



ss  I

Apar urmatoarele situatii:

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

JP (HL)

4

1

E9h

HL←100h PC←10h

JR (HL)

PC←100h

JR (IX)

8

2

DDh ,E9h

JR (IY)

8

2

FDh ,E9h

VIII. Grupa instructiunilor aritmetice pe 16 biti

Numarul instructiunilor cuprinse in aceasta grupa este mai redus fata de cel al instructiunilor aritmetice pe 8 biti. Pentru micsorarea numarului de operatii pe care le efectueaza microprocesorul, este de preferat folosirea acestui tip de instructiuni (acolo unde este cazul). Rolul acumulatorului (de la instructiunile aritmetice pe 8 biti) este luat de unul din Registrii HL, IX sau IY.

A. Subgrupa operatiilor de adunare

a). ADD HL, ss

Simbolic : HL HL + ss ; ss = sursa dublass I

b). ADC HL, ss - addition with carry (adunare cu transport)

Simbolic : HL HL + ss + Cy ssI

c) ADD IX, ssd) ADD IY, ss

Simbolic : IX IX + ssSimbolic : IY IY + ss

ss I ssI

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

ADD HL ,ss

0

11

1

0 0 rp1 rp2 1 0 0 1

HL←46h

IX←1Fh

Cy=0

ADC HL ,IX

HL←46h+1Fh+0

HL←65h

ADC HL ,ss

0

15

2

EDh

0 1 rp1 rp2 1 0 1 0

ADD IX ,ss

0

15

2

DDh

0 0 rp1 rp2 1 0 0 1

ADD IY ,ss

0

15

2

FDh

0 0 rp1 rp2 1 0 0 1

B. Subgrupa operatiilor de scadere

SBC HL , ss - substract with carry( scadere cu carry )

Simbolic :HL HL - ss - Cyss I

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

SBC HL ,ss

1

15

2

EDh

0 1 rp1 rp2 0 0 1 0

HL←65h IY←1Fh

Cy=0

SBC HL ,IY

HL←46h

OBSERVATIE . Nu exista alte tipuri de operatii de scadere pe 16 biti ( fara carry sau cu alti registri ).

C. Subgrupa operatiilor de incrementare - decrementare pe 16 biti

1) Incrementarea

INC dd

Simbolic :dd dd + 1 dd I

Apar situatiile:

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

INC rp

6

1

0 0 rp1 rp2 0 0 1 1

HL←100h

INC HL

HL←101h

INC IX

10

2

DDh ,23h

INC IY

10

2

FDh ,23h

rp I

1) Decrementarea

DEC dd

Simbolic :dd dd - 1 dd I

Apar situatiile:

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

INC rp

6

1

0 0 rp1 rp2 1 0 1 1

HL←100h

DEC HL

HL←0FFh

INC IX

10

2

DDh ,2Bh

INC IY

10

2

FDh ,2Bh

rp I

IX. Grupa instructiunilor de lucru cu acumulatorul si registrul indicatorilor de conditii

a) DAA - (decimal adjust accumulator) - ajustarea zecimala a acumulatorului.

Transforma codul binar existent in A intr-un cod zecimal codat binar (cod BCD), dupa efectuarea unor operatii de adunare sau scadere in care sunt implicati operanzi reprezentati in BCD.

Exemplu : Executand o operatie de adunare a doua numere, de exemplu 17 (BCD) si 39 (BCD), se obtine simplu, in aritmetica zecimala, rezultatul 56. Lucrand cu reprezentari binare :

0001 0111 +

0011 1001

0101 0000 = 50

Rezultatul este incorect. Instructiunea DAA ajusteaza acest rezultat pentru a se obtine reprezentarea BCD a sumei :

0101 0000 +

0000 0110

0101 0110 = 56

b) CPL - (complement accumulator) - complementarea acumulatorului

Simbolic : A ; prin aceasta operatie se obtine codul complement fata de 1 ( CC1 ) a datei existente in acumulator.

c) NEG - instructiunea transforma numarul binar existent in acumulator in complementul sau fata de 2.

Simbolic : A 00h - A( A A+01h )

d) CCF - ( complement carry flag ) - complementarea indicatorul carry din registrul F.

Simbolic :Cy Cy

e) SCF - ( set carry flag ) - punein" 1 " logic ( seteaza ) indicatorul carry.

Simbolic :Cy 1

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

DAA

4

1

27h

CPL

1

1

4

1

2Fh

A←00hCPL

A0FFh

NEG

1

8

2

EDh 44h

A←01hNEG

A←0FFh

CCF

0

4

1

3Fh

Cy=0 CCF

Cy=1

SCF

0

0

1

4

1

37h

OBSERVATIE . Carry este singurul indicator de conditii asupra caruia se poate actiona in mod direct, prin instructiuni (cele anterioare). Nu exista instructiune pentru resetarea lui Cy; pentru aceasta se face SCF urmat de CCF.

X. Grupa instructiunilor diverse

a) NOP - ( no operation ) - nici o operatie, procesorul trece la instructiunea urmatoare.

b) HALT - oprirea procesorului; din starea HALT nu se poate iesi decat prin resetarea microprocesorului sau prin primirea unei cereri de intrerupere recunoscuta de acesta.

c) DI -(disable interrupt) - dezactivarea mecanismului de intreruperi mascabile ( IFF1 = 0 )

d) EI - ( enable interrupt) - activarea mecanismului de intreruperi mascabile ( IFF1 = 1 )

e) IM 0 -(interrupt mode 0)- trecere microprocesorul in modul 0 de tratare a intreruperilor mascabile.

f) IM 1 - (interrupt mode 1) - provoaca trecerea microprocesorului in modul 1 de tratare a intreruperilor mascabile.

g) IM 2 - (interrupt mode 2) - provoaca trecerea microprocesorului in modul 2 de tratare a intreruperilor mascabile.

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

NOP

4

1

00h

HALT

4

1

76h

A←00hCPL



A0FFh

DI

4

1

F3h

A←01hNEG

A←0FFh

EI

4

1

FBh

Cy=0 CCF

Cy=1

IM 0

8

2

EDh 46h

IM 1

8

2

EDh 56h

IM 2

8

2

EDh 5Eh

OBSERVATIE. Trecerea intr-un mod de tratare a intreruperilor mascabile nu realizeaza si validarea acestui mecanism de intreruperi. In acest scop este necesara rularea unei instructiuni de tip EI .

XI. Grupa instructiunilor pentru apelul subrutinelor

In derularea programelor exista situatii cand un anumit grup de instructiuni se executa repetat.

Pentru a economisi memoria calculatorului, precum si pentru a usura munca programatorului, zona care se repeta se declara subrutina; ea se scrie o singura data in derularea programului si se apeleaza de cate ori este nevoie. Respectiva subrutina se identifica printr-o eticheta a primei instructiuni sau prin adresa acesteia. Orice subrutina trebuie sa aiba la sfarsitul sau logic o instructiune de revenire in programul din care a fost apelata, de tipul RETURN. Sunt doua tipuri de instructiuni pentru apelul subrutinelor :

A. Subgrupa instructiunii pentru apelul neconditionat al subrutinelor

CALL n16 - apel neconditionat al subrutinei aflata la adresa specificata prin constanta pe 16 bitin16.


La apelarea unei subrutine se salveaza in stiva (folosind SP-ul) adresa instructiunii imediat urmatoare celei la care a intervenit apelul subrutinei (adresa continuta in PC). SP-ul se reactualizeaza, indicand adresa ultimei depuneri in stiva, iar in PC se incarca constanta n16 ce specifica adresa subrutinei .

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

CALL n16

17

3

CDh

n16Ln16H

CALL 1234h

CDh 34h 12h

B. Subgrupa instructiunilor pentru apelul conditionat al subrutinelor

Instructiunile din aceasta subgrupa testeaza indicatori din registrul F, luand decizia de apelare a subrutinei doar daca conditia testata este indeplinita. In caz contrar, se trece la instructiunea imediat urmatoare apelului subrutinei. Sunt 8 instructiuni de apel conditionat al subrutinelor (ce testeaza doar 4 indicatori de conditii), desemnate prin mnemonica generica:

CALL cc, n16 - apelul conditionat al subrutinei aflata la adresa n16, in cazul conditiei adevarate cc.

cc I

Simbolic:         Daca conditia testata "cc" este indeplinita se desfasoara aceleasi actiuni ca si la instructiunea CALL n16, in caz contrar trecandu-se la instructiunea imediat urmatoare apelului subrutinei.

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

CALL cc ,n16

17

3

1 1 c c c 1 0 0

n16Ln16H

DEC B

CALL NZ ,1234h

Daca B←0 salt la

Adresa 1234h

Codarea conditiei testate " c c c " se mentine ca si la instructiunile de tip salt conditionat.

XII. Grupa instructiunilor pentru revenirea din subrutine

Orice subrutina trebuie sa se termine din punct de vedere logic cu o instructiune speciala pentru revenirea in programul principal. De remarcat faptul ca nu intotdeauna sfarsitul fizic al unei subrutine (ultima instructiune a acesteia) coincide cu sfarsitul sau logic. Revenirea din subrutina permite refacerea contextului anterior de lucru (reintoarcerea in programul in care a survenit apelul subrutinei ). Exista mai multe tipuri de instructiuni de revenire:

A. Subgrupa instructiunii pentru revenirea neconditionata din subrutina

RET - ( return ) - revenire neconditionata din subrutina


Se reface vechiul PC din momentul apelului subrutinei (in vederea reluarii programului ce a apelat subrutina) , iar SP-ul este reactualizat.

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

RET

10

1

C9h

B. Subgrupa instructiunilor pentru revenirea conditionata din subrutina

Instructiunile din aceasta subgrupa testeaza indicatori din registrul F, luand decizia de revenire din subrutina doar daca conditia testata este indeplinita. In caz contrar, se trece la instructiunea imediat urmatoare, ramanandu-se pe mai departe in subrutina.

Sunt 8 instructiuni de revenire conditionata din subrutine (ce testeaza doar 4 indicatori de conditii), desemnate prin mnemonica generica:

RET cc - revenire conditionata din subrutina, daca conditia testata cc este indeplinita.

cc I

Simbolic : Daca conditia testata "cc" este indeplinita se desfasoara aceleasi actiuni ca si la instructiunea RET, in caz contrar trecandu-se la instructiunea imediat urmatoare celei de revenire din subrutina.

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

RET

10

1

1 1 c c c 0 0 0

Conditiile testate "cc" , precum si codarea binara a acestora "ccc" se mentin ca si la instructiunile de tip salt conditionat si apel conditionat de subrutina.

Exemple : RET NZ - return if not zero - cod 0C0h

RET PE - return if parity even - cod 0E8h

OBSERVATIE . Instructiunile de tip salt conditionat, apel conditionat de subrutina precum si cele de revenire conditionata din subrutina formeaza grupa instructiunilor prin care se testeaza indicatorii de conditii. Prin ele se pot implementa in cadrul organigramelor, blocurile logice de decizie.

C. Subgrupa instructiunii pentru revenirea din subrutina de tratare a unei intreruperi mascabile

RETI - ( return from interrupt) - revenire din subrutina ce trateaza intreruperea mascabila.

Simbolic:         Are acelasi efect ca si instructiunea RET, in plus rearmeaza perifericul ce a solicitat intrerupere procesorului, in vederea generarii unei noi intreruperi in viitor. Se reaminteste faptul ca intr-o astfel de situatie si procesorul trebuie rearmat pentru acceptarea unei noi cereri de intrerupere mascabile, prin rularea unei instructiuni EI (enable interrupt).

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

RETI

14

2

EDh 4Dh

D. Subgrupa instructiunii pentru revenirea din subrutina de tratare a unei intreruperi nemascabile

RETN - ( return from non-maskable interrupt) - revenire din subrutina de tratare a intreruperii nemascabile.

Se reaminteste faptul ca la inceputul tratarii unei intreruperi nemascabile, starea bistabilului IFF1 este copiata in bistabilul IFF2, iar IFF1 este adus in starea "0". Astfel, pe timpul tratarii unei intreruperi nemascabile, nu sunt acceptate cererile de intrerupere mascabile.

Simbolic: Este similara cu RET, in plus starea bistabilului IFF2 se copiaza din bistabilul IFF1.Se revine astfel la starea anterioara a mecanismului de intreruperi mascabile.

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

RETN

14

2

EDh 45h

Reguli de lucru cu subrutinele in cadrul programelor

1. In orice program care utilizeaza subrutine va trebui sa se initializeze in prealabil baza stivei prin incarcarea registrului SP cu o constanta pe 16 biti ce reprezinta adresa de baza a stivei. Stiva trebuie creata intr-o zona de memorie RAM.

2. Inceputul subrutinei trebuie individualizat fie printr-o eticheta, fie prin adresa de memorie de la care este plasat corpul subrutinei. In programele sursa, subrutina va fi apelata prin eticheta ce o individualizeaza, iar in programele obiect prin adresa pe 16 biti.

3. Orice subrutina trebuie sa aiba sfarsitul logic marcat printr-o instructiune RETURN (fie conditionata, fie neconditionata). Nu intotdeauna sfarsitul logic coincide cu sfarsitul fizic (ultima instructiune).

4. Daca subrutina, prin executia ei, afecteaza registri procesorului care mai tarziu vor fi folositi dupa revenirea in programul principal, atunci primele instructiuni din corpul subrutinei vor trebui sa salveze in stiva continutul acestor registri. Inainte de revenirea in programul principal, registri salvati vor fi restaurati din stiva, in ordinea inversa depunerii lor (pastrand mecanismul de adresare a stivei de tip LIFO). Vor fi folosite in acest scop instructiuni de tip

PUSH si POP.

Exemplu :

XIII. Grupa instructiunilor de restart

Aceste instructiuni sunt in fond tot instructiuni pentru apelul neconditionat al subrutinelor, dar care sunt scrise la adrese fixe, rezervate de memorie, in pagina 0 a acesteia. Pagina 0 a memoriei este reprezentata de acele locatii de memorie pentru care ocms-ul adresei este 00h (256 locatii cuprinse intre 0000h si 00FFh). Sunt 8 instructiuni de tip RESTART avand mnemonica generica:

RST i i I


unde ni I , ( functie de valoarea lui i ).

Instructiune

S

Z

H

O

N

C

t

L

Cod masina

Exemplu

RST i

11

1

1 1 i i i 1 1 1

i i i este functie de i (din codul instructiunii RST i)

Spre exemplu, instructiunea RST 7 este echivalenta cu instructiunea CALL 0038h sau instructiunea RST 1 este echivalenta cu CALL 0008h.

Deosebirea intre instructiunile CALL n16 si RST i , consta in numarul de octeti prin care se reprezinta in memorie ( CALL - 3 octeti , respectiv RST - 1 octet ). Pe de alta parte, CALL poate apela o subrutina aflata oriunde in memorie, in schimb RST apeleaza doar subrutine scrise in pagina 0 a memoriei, la adrese rezervate.



 


i

ii i

0

0 0 0

1

0 0 1

2

0 1 0

3

0 1 1

4

1 0 0

5

1 0 1

6

1 1 0

7

1 1 1

3. PROBLEME REZOLVATE

1. Realizati un program in care locatiile de adrese ale zonei de memorie cuprinse intre adresele 200h si 300h vor fi initializate cu constanta 55h.

Solutie

Vom folosi un registru dublu (16 biti) , pentru adresarea locatiei de memorie - alegem registrul HL. Vom folosi un registru simplu (8 biti) , pentru pastrarea constantei - alegem registrul B.

Modalitatea de rezolvare implica folosirea acestor registri pe post de registri indicatori (pointeri). Initial, in ei trebuie incarcate valorile initiale (operatia de initializare). Algoritmul de rezolvare trebuie conceput de asa natura incat eficienta programarii sa fie cat mai mare. Se impune realizarea unei bucle de program, in corpul buclei realizandu-se operatiile de transfer a datei in locatia de memorie si de incrementare a adresei. Iesirea din bucla se va realiza dupa atingerea adresei de sfarsit a zonei de memorie - 300h. Organigrama generala de rezolvare a acestei probleme este prezentata in cele ce urmeaza.

Explicitarea blocului de decizie:


Posibilitati de realizare a acestui test (echivalente situatiei date) :

1)


Se compara H cu A


2).

Se compara A cu o constanta pe 8 biti

3)


OBSERVATIE. In situatia 3), testul L = 00h este posibil sa se realizeze doar prin analizarea indicatorului Z. Astfel, daca se va utiliza operatia de incrementare a registrului L (incrementare pe 8 biti), in momentul in care L devine 00h (la atingerea adresei 300h), indicatorul Z trece in "1" logic.

In aceasta versiune (3), programul sursa si echivalentul sau obiect sunt:

ORG 8100h

LD HL,8200h 8100h: 21h, 00h, 82h

LD B,55h 8103h: 06h, 55h

et1:      LD (HL),B 8105h: 70h

INC L 8106h: 2Ch

JP NZ , et1 8107h: C2h, 05h, 01h

HALT 810Ah: 76h

END

Rezolvare in cazul primei variante:

ORG 8100h

LD HL,8200h 8100h: 21h, 00h, 82h

LD B,55h 8103h: 06h, 55h

et1:      LD (HL),B 8105h: 70h

INC HL 8106h: 23h

LD A,03h 8107h: 3Eh, 03h

CP H 8109h: BCh

JPNZ et1 810Ah: C2h, 05h, 01h

LD A,L 810Dh: 7Dh

CP 00h 810Eh: FEh, 00h

JPNZ et1 8110h: C2h, 05h, 01h

HALT 8113h: 76h

END

urmariti programul pas cu pas si observati care sunt valorile registrului PC pe parcursul rularii lui;

- modificati programul pentru a initializa locatiile zonei de memorie cu constanta 30 dar in ordine descrescatoare a adreselor;

- ce modificari aduceti programului daca se pune conditia de sfarsit de sir inaintea instructiunii de initializare locatiilor de memorie cu constanta 55h?

2. Realizati un program de masurare a timpului (temporizare) software

Solutie

O solutie a acestei probleme se bazeaza pe efectuarea unor instructiuni a caror durata de executie este riguros controlata. Dupa cum se cunoaste (vezi cursul) o instructiune este formata din mai multi cicli masina. La randul sau, un ciclu masina este format din mai multe perioade elementare (numar specific pentru fiecare instructiune), practic perioade ale semnalului de ceas care se aplica microprocesorului. Cum semnalul de ceas este accesibil utilizatorului, rezulta ca durata de executie a unei instructiuni este cunoscuta. O posibila organigrama a unui program de temporizare este urmatoarea:



Implementarea organigramei genereaza urmatorul program sursa si echivalentul sau obiect:

ORG 8200h

TMP:    LD B,K1 8200h : 06h, K1h * 7T

ET2 : LD C,K2 8202h : 0Eh, K2h * 7T

ET1 : DEC C 8204h : 0Dh * 4T

JP NZ,ET1 8205h : C2h, 04h, 02h * 10T

DEC B 8208h: 05h * 4T

JP NZ,ET2 8209h : C2h, 02h, 02h * 10T

HALT 820Ch : 76h * 4T

END


In partea dreapta sunt prezentate numarul perioadelor elementare de ceas ( T ) care se aplica microprocesorului si pe durata carora se executa respectivele instructiuni. Tinand seama de cele doua constante K1 si K2 si de formatul organigramei, rezulta urmatorul calcul al timpului de executie al temporizarii ( t ):

t = 7T + [ 7T + (4T + 10T) * K2 + 4T + 10T] * K1 + 4T = 11T + (21T + 14T * K2) * K1

Determinarea lui T este simpla. Se pleaca de la frecventa semnalului de ceas ce se aplica microprocesorului (de obicei chiar frecventa cristalului de cuartz) si se inverseaza respectiva valoare.

OBSERVATIE . Problema se pune de obicei invers . Se dau t, T si se cere sa se determine K1 si K2. In acest caz se alege K1 in intervalul 00h, , 0FFh si se calculeaza K2 folosind formula de mai sus (in conditiile acestei organigrame).

Exemplu : Se da f = 2,5 Mhz (frecventa semnalului de ceas ce se aplica microprocesorului). Se cer valorile lui K1 si K2 pentru care t=0,2 secunde (in conditiile problemei anterioare).

Rezolvare

Din f = 2,5 Mhz TT = 400 ns . Alegem spre exemplu, K1 = 250 (0FAh). Va rezulta din formula de mai sus :

K2 = [(t -11T) / K1 - 21T] / 14 T

Dupa calcule se obtine K2 = 141,3 ; alegem rotunjit la intreg K2 = 141, adica 8Dh. Se poate recalcula valoarea temporizarii rezultate cu cele doua valori pentru K1 si K2. Daca eroarea la care s-a ajuns nu este satisfacatoare, calculul se poate relua cu o noua valoare pentru K1, obtinand un nou K2.

3. Se dau doua siruri de cate 100 de octeti plasati de la adresele 9100h respectiv 9200h. Sa se realizeze un program in care se schimba intre ele elementele celor doua siruri. Se doreste ca operatia de schimb a celor doua locatii de memorie sa fie facuta intr-o subrutina.

SOLUTIE :

ORG 8200h

200h :LD SP, 8100h

201h :LD D, 64h

203h :LD HL, 9100h    

206h :LD IX, 9200h

20Ah :ET1: CALL EXCH

20Dh :DEC D

210h :JP NZ ET1

211h :HALT

END


Initial se folosesc registri dubli HL si IX pentru adresarea indirecta a elementelor celor doua siruri, valorile acestora salvandu-se in registri B si C. In subrutina se face schimbul propriu-zis .Registrul D contorizeaza numarul de schimburi acesta fiind testat de fiecare data cu ajutorul unui bloc de decizie astfel se asigura oprirea programului dupa terminarea schimburilor.

Este necesara transformarea 100 =64h.

Cand se executa instructiunea CALL EXCH in stiva aflata la 8100h se salveaza adresa instructiunii imediat urmatoare (20Dh) si anume (80FF) : 0Dh iar la (80FE) : 02h.



ORG 8300h

EXCH:  LD B, (HL)

LD C, (IX+e)

LD (IX+e), B

LD (HL), C

INC HL

INC IX

RET

4. Sa se realizeze un program in care sa se ordoneze crescator un sir de 100 de octeti situat incepand de la adresa 500h folosind metoda bulelor de aer .

Solutie :

Metoda bulelor de aer presupune urmatoarele:

Se compara primele 2 elemente ale sirului si in cazul nostru cel mai mare trece in pozitia a doua apoi se continua comparatia cu elementele 2 si 3 ; 3 si 4 pana la sfarsitul sirului. In cadrul procesului de comparatie la fiecare schimbare ce are loc se pune valoarea 1 in registrul E ce este folosit pe post de semafor. Daca la testarea acestui semafor se gaseste in el valoarea 0 (deci in urma comparari nu s-a facut nici un schimb) inseamna ca sirul a fost ordonat si programul se opreste. In program se foloseste un contor care tine numarul de elemente ale sirului ramase de comparat [reg. C].


Organigrama



6.Sa se realizeze un program in care sa se determine minimul dintr-un sir de 50 de octeti situat in memorie incepand cu adresa 100h .Rezultatul se va plasa la locatia adresei de memorie 280h.

Problema se rezolva prin compararea primului element al sirului cu celelalte pe rand .

Daca prin comparare se gaseste un numar mai mic decat precedentul atunci se renunta la acesta comparatia continuand cu numarul mai mic.

Organigrama :


ORG 3000h

LD B, 32h

LD HL, 100h

LD A ,(HL)

ET1: INC HL

LD D, (HL)

CP D

JP C, ET2

LD A, D

ET2: DEC B

JP NZ, ET1

LD (280h), A

HALT

END

5. Sa se realizeze un program in care se decodifica un sir de 100 de octeti codat dupa formula M=N XOR 25h (XOR =SAU exclusiv). Sirul se afla pozitionat incepand de la adresa 9200h.

Pentru rezolvarea problemei se aplica sirului din nou operatia sau exclusiv cu numarul 25h deoarece (op1 XOR 25h) XOR 25h = op1.

Se foloseste registrul B care contorizeaza trecerea prin toate elementele sirului, iar in registrul A se introduce constanta 25h. Se aplica operatia XOR pe rand fiecarui element dupa care se recopiaza pe pozitia sa inapoi in sir.

ORG 8000h

LD B, 64h

LD HL, 9200h

ET1: LD A, 25h

XOR (HL)

LD (HL), A

INC HL

DEC B

JP NZ, ET1

HALT

END

7.Se d un sir de100 de octeti situat in memorie de la adresa 2000h .Sa se imparta sirul in doua subsiruri unul cu numerele impare de tip zecimal iar celalalt cu numerele pare de acelasi tip. Primul sir va fi plasat in memorie incepand cu adresa 2100h iar al doilea incepand cu 2200h .

Solutie :

Pentru rezolvare este necesara separarea numerelor pare de tip zecimal de cele impare tinand cont de conditia ca un numar e par in zecimal daca ultimul bit al sau este "0"logic ,iar la cele impare este "1"logic .

Folosind operatia logica "si"(and) intre valoarea 01h si fiecare numar din sir in functie de valoarea rezultatului se obtin cele doua subsiruri .Se stie ca op1 Λ 00h =00h si op1 Λ 0FFh=op1.

Organigrama :

ORG 5000h

LD IX, 2200h

LD IY, 2100h

LD B, 64h

LD HL, 2000h

ET1: LD A, 01h

AND (HL)

JP NZ, ET2

LD A, (HL)

LD (IX+e), A

INC IX

JP ET3

ET2: LD A, (HL)

LD (IY+e), A

INC IY

ET3: INC HL

DEC B

JP NZ, ET1

HALT

END

4. DESFASURAREA LUCRARII

1. Se vor citi si prelua in scris toate informatiile teoretice prezentate pana in acest moment. Se atrage atentia ca aceste informatii vor fi folosite si la desfasurarea altor lucrari de laborator.

2. Se vor studia problemele rezolvate, incercand gasirea altor posibilitati de rezolvare.

3. Programele obiect ale problemelor rezolvate vor fi simulate in mediul de dezvoltare IAR si apoi introduse in memoria microsistemelor existente in laborator (prin intermediul programului monitor) si se vor rula. Se va observa efectul rularii si buna lor executie.

4. Se vor rezolva urmatoarele probleme propuse si se va urmari executia corecta prin introducerea programelor obiect in memoria microsistemelor si rulare:

a) Realizati un program care va initializa continutul locatiilor de memorie cu adresele cuprinse intre 300h si 350h cu numere incepand de la 00h in ordine crescatoare.

b) Realizati un program care va initializa continutul locatiilor de memorie cu adresele cuprinse intre 100h si 150h cu numere pare binar in ordine crescatoare incepand cu constanta 24h

c) Sa se realizeze un program in care sa se ordoneze descrescator un sir de 100 de octeti situat incepand de la adresa 8500h folosind metoda bulelor de aer .

d) Sa se rezolve problema de mai sus prin aflarea minimelor sau a maximelor.

e) Sa se realizeze un program in care se depune in memorie, de la adresa 400h, constantele hexazecimale pare, reprezentate pe un octet, in ordine crescatoare, incepand cu 00h.

f) Sa se realizeze un program in care se depune in memorie, de la adresa 500h, constantele hexazecimale impare, reprezentate pe un octet, in ordine descrescatoare, incepand cu 0FFh.

g). Sa se depuna in memorie, de la adresa 600h, rezultatul operatiei SAU EXCLUSIV intre locatiile corespunzatoare celor doua zone de memorie folosite la problemele anterioare. (Astfel, la locatia 600h se va depune rezultatul operatiei SAU EXCLUSIV intre continutul locatiilor 400h si 500h si asa mai departe).

h). Se considera un sir format din 150 numere binare reprezentate pe un octet. Sirul se afla plasat in memoria unui microsistem de la adresa 800h. Sa se realizeze un program care desparte termenii acestui sir, formand doua subsiruri ce se vor scrie in memorie de la adresele 900h si 0a00h. In primul subsir vor fi trecute continuturile locatiilor de la adresele pare din primul sir, iar in al doilea subsir vor fi scrise continuturile locatiilor aflate la adresele impare din primul sir.

i). Sa se realizeze un program de aflare a maximului dintr-un sir de 50 de octeti situat in memorie incepand de la adresa 100h .Rezultatul se va plasa la adresa 130h .Sa se afle apoi cate numere din sir sunt egale cu maximul.

j). Se da un sir de100 de octeti situat in memorie de la adresa 2000h .Sa se realizeze u program care imparte sirul in doua subsiruri: unul cu numerele impare de tip binar iar celalalt cu numerele pare de acelasi tip. Primul sir va fi plasat in memorie incepand cu adresa 2100h iar al doilea incepand cu 2200h .

k).La acelasi sir ca la punctul anterior sa se afle cel mai mic (sau mare) numar par zecimal si apoi binar.

biologie

botanica






Upload!

Trimite cercetarea ta!
Trimite si tu un document!
NU trimiteti referate, proiecte sau alte forme de lucrari stiintifice, lucrari pentru examenele de evaluare pe parcursul anilor de studiu, precum si lucrari de finalizare a studiilor universitare de licenta, masterat si/sau de doctorat. Aceste documente nu vor fi publicate.