|
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
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
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
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
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
JR NZ ,e
12
2
JR Z ,e
12
2
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
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
HL←100h PC←10h
JR (HL)
PC←100h
JR (IX)
8
2
JR (IY)
8
2
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
HL←46h
IX←1Fh
Cy=0
ADC HL ,IX
HL←46h+1Fh+0
HL←65h
ADC HL ,ss
0
15
2
ADD IX ,ss
0
15
2
0 0 rp1 rp2 1 0 0 1
ADD IY ,ss
0
15
2
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
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
HL←100h
INC HL
HL←101h
INC IX
10
2
INC IY
10
2
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
HL←100h
DEC HL
HL←0FFh
INC IX
10
2
INC IY
10
2
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
CPL
1
1
4
1
A←00hCPL
A←0FFh
NEG
1
8
2
A←01hNEG
A←0FFh
CCF
0
4
1
Cy=0 CCF
Cy=1
SCF
0
0
1
4
1
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
HALT
4
1
A←00hCPL
A←0FFh
DI
4
1
A←01hNEG
A←0FFh
EI
4
1
Cy=0 CCF
Cy=1
IM 0
8
2
IM 1
8
2
IM 2
8
2
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 :
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.