|
SETUL DE INSTRUCTIUNI AL mR Z - 80 ( IV )
1.Obiectul lucrarii
Se finalizeaza studiul setului de instructiuni al microprocesorului Z-80 cu urmatoarele grupe:
- instructiunile de rotatie si deplasari;
- instructiunile de lucru cu circuitele de intrare-iesire ( I/O );
Se prezinta aplicatii cu acestea.
2.Breviar teoretic
XIV. Grupa instructiunilor de rotatie si deplasare
A . Subgrupa instructiunilor de rotatie
a). RLC s - (rotate left with carry) - rotatie la stanga cu carry
Simbolic:
s I Apar situatiile:
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
RLC r
0
0
8
2
0 0 0 0 0 s s s
initial A ←20h
RLC A
final A ← 40h
daca HL ← 100h
initial (100h) 30h
RLC (HL)
final (100h) = 60h
RLC (HL)
0
0
15
2
CBh, 06h
RLC (IX + e)
0
0
23
4
DDh, CBh
e, 06h
RLC (IY + e)
0
0
23
4
FDh, CBh
e, 06h
b). RL s - (rotate left through carry) - rotatie la stanga prin intermediul bitului carry
Simbolic:
s I Apar situatiile:
Instructiune
S
Z
H
O
N
C
T
L
Cod masina
Exemplu
RL A
0
0
4
2
initial A← 20h
RL A
final A←40h
daca Cy =0 sau
A←41h daca
Cy =1
RL r
0
0
8
2
0 0 0 1 0 s s s
RL (HL)
0
0
15
2
CBh, 16h
RL (IX + e)
0
0
23
4
DDh, CBh
e, 16h
RL (IY + e)
0
0
23
4
FDh, CBh
e, 16h
c). RRC s - (rotate right with carry) - rotatie la dreapta cu carry
Simbolic:
s I Apar situatiile:
Instructiune
S
Z
H
O
N
C
T
L
Cod masina
Exemplu
RRC A
0
0
4
2
Daca IX←100h e=0
initial (100h)=40h
RRC (IX+e)
final (100h) = 20h
initial A←80h
RRC A
final A←40h
RRC r
0
0
8
2
0 0 0 0 1 s s s
RRC (HL)
0
0
15
2
CBh, 0Eh
RRC (IX + e)
0
0
23
4
DDh, CBh
e, 0Eh
RRC (IY + e)
0
0
23
4
FDh, CBh
e, 0Eh
d). RR s - (rotate right through carry) - rotatie la dreapta prin intermediul bitului carry
Simbolic:
s I Apar situatiile :
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
RR A
0
0
4
2
daca IX←100h e=0
initial (100h)=40h
RR (IX+e)
final (100h) = 20h
daca Cy =0 sau
(100h)=21h daca
Cy =1
RR r
0
0
8
2
0 0 0 1 1 s s s
RR (HL)
0
0
15
2
CBh, 1Eh
RR (IX + e)
0
0
23
4
DDh, CBh
e, 1Eh
RR (IY + e)
0
0
23
4
FDh, CBh
e, 1Eh
OBSERVATIE . La microprocesorul Z-80, pentru acumulator exista in plus 4 instructiuni de rotatie, dar care sunt compatibile cu cele descrise anterior. Diferenta intre cele doua tipuri de instructiuni apare doar din punctul de vedere al mnemonicii folosite si al codului masina propriu-zis. Aceste instructiuni au aparut ca urmare a echivalentei software dintre microprocesoarele Z-80 si 8080. La 8080 existau instructiuni de rotatie doar pentru acumulator (codul masina avand 1 octet).
Exista urmatoarele echivalente:
B . Subgrupa instructiunilor de deplasare
a). SLA s - (shift left arithmetic) - deplasare stanga aritmetica
s I
In primul bit D0 (bitul cmps) se aplica "0" logic si are loc deplasarea cu o pozitie spre stanga a celorlalti biti. Ultimul bit D7 (bitul cms), trece in indicatorul carry din registrul indicatorilor de conditii F.
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
SLA r
0
0
8
2
0 0 1 0 0 s s s
daca X←100h e=0
initial (100h)=80h
SLA (IX+e)
final (100h) = 0h
iar Cy =1
SLA (HL)
0
0
15
2
CBh, 26h
SLA (IX + e)
0
0
23
4
DDh, CBh
e, 26h
SLA (IY + e)
0
0
23
4
FDh, CBh
e, 26h
b). SRA s - (shift right arithmetic) - deplasare dreapta aritmetica
s I
Bitul D7 (cms) se deplaseaza la dreapta si se repeta. Ceilalti biti se deplaseaza cu o pozitie spre dreapta, iar ultimul bit D0 (cmps) trece in indicatorul carry din registrul indicatorilor de conditii F.
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
SRA r
0
0
8
2
0 0 1 0 1 s s s
initial B←81h
SRA B
final B=0C0h si
Cy=1
SRA (HL)
0
0
15
2
CBh, 2Eh
SRA (IX + e)
0
0
23
4
DDh, CBh
e, 2h
SRA (IY + e)
0
0
23
4
FDh, CBh
e, 2Eh
c). SRL s - (shift right logic) - deplasare dreapta logica
s I
In bitul D7 (cms), se aplica "0" logic si are loc o deplasare spre dreapta cu o pozitie a tuturor bitilor. Ultimul bit D0 (cmps) trece in indicatorul carry din registrul indicatorilor de conditii F.
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
SRL r
0
0
8
2
0 0 1 1 1 s s s
initial B←81h
SRL B
Final B←40h si Cy=1
daca IY←200h e=0
initial (20h)=44h
SRL (IY+e)
final(20h)=22h Cy=0
SRL (HL)
0
0
15
2
CBh, 3Eh
SRL (IX + e)
0
0
23
4
DDh, CBh
e, 3Eh
SRL (IY + e)
0
0
23
4
FDh, CBh
e, 3Eh
OBSERVATIE. Instructiunile de deplasare, precum si cele de rotatie pot fi folosite pentru efectuarea operatiilor aritmetice de inmultire si impartire. Sa consideram numarul binar 00000100 ( 2 ) , adica 4 (1 0 ).
In cazul unei deplasari la stanga (situatia unei instructiuni SLA), se obtine numarul 00001000 (2) , adica 8 (10) . Dupa inca o deplasare la stanga se obtine 00010000 ( 2 ) , adica 10 ( 16) . Rezulta ca o deplasare aritmetica stanga echivaleaza cu o inmultire cu 2. In mod similar, o deplasare logica la dreapta echivaleaza cu o impartire cu 2.
Intr-un alt exemplu, sa consideram operatia de inmultire a numerelor 4 si 5 pentru care rezultatul este 20. In binar, folosind tehnica produselor partiale, operatia se deruleaza astfel :
00000100 x - deinmultitul
00000101 - inmultitorul
-----------
00000100 - primul produs partial
000000000 - al doilea produs partial
0000010000 - al treilea produs partial
----- ----- -------
000001000100 - rezultatul20 ( 1 0 )
Se observa ca produsele partiale nenule apar pentru situatiile in care bitii corespunzatori din cadrul deinmultitului sunt "1" logic. In aceste situatii, produsul partial reprezinta chiar deinmultitul, deplasat la stanga cu acel numar de pozitii, corespunzator pozitiei bitului din inmultitor pentru care se efectueaza respectivul produs partial. Deplasarea se va putea realiza fie cu instructiuni de deplasare, fie cu instructiuni de rotatie avand grija ca pe pozitia bitului cmps sa se aplice "0" logic.
C. Subgrupa operatiilor de rotatie la nivel de nibble
a). RLD - (rotate left one digit) - rotatie la nivel de nibble la stanga, intre acumulator si o locatie de memorie adresata de HL. Se face conform urmatoarei scheme, in care nibble - ul superior din A nu este afectat:
A (HL)
b). RRD- (rotate right one digit) - rotatie la nivel de nibble la dreapta, intre acumulator si o locatie de memorie adresata de HL. Se face conform urmatoarei scheme, in care nibble-ul superior din A nu este afectat:
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
RLD
0
0
18
2
6Fh
A←85h HL←200h (200h)=01h
RLD
A←80h (200)=18h
RRD
0
0
18
2
67h
A←85h HL←200h
(200h)=01h
RRD
A←81h (200h)=05h
OBSERVATIE . Operatiile RLD si RRD pot fi folosite pentru despartirea in nibble ai unui octet. Sa consideram in urmatorul exemplu A = 00h si (HL) = 29h. Dupa operatia RRD , obtinem A = 09h si (HL) = 02h, adica cei doi nibble constituenti ai octetului initial au fost despartiti, formandu-se doi noi octeti care au pe primii patru biti mai semnificativi "0" logic.
XV ) . Grupa instructiunilor la nivel de bit
a). BITb , s - testeaza bitul b din cadrul surseis.
s I ; b I
Simbolic : Z sb; bitul b al sursei s, negat trece in indicatorul de conditii Z .
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
BIT b ,r
1
0
8
2
0 1 b b b s s s
B←81h
BIT 7 ,B
rezulta Z=0
BIT 0,B
rezulta Z=1
BIT b ,(HL)
1
0
12
2
CBh
01 b b b 1 1 0
BIT b ,(IX + e)
1
0
20
4
DDh, CBh ,e
0 1 b b b 1 1 0
BIT b ,(IY +e)
1
0
20
4
FDh, CBh, e
0 1 b b b 1 1 0
b). SET b , s- setarea bitului b din sursa s
s I ; b I
Simbolic : sb 1 Apar situatiile :
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
SET b ,r
8
2
1 1 b b b s s s
HL←200h
(200h)=00h
SET 7,(HL)
(200h)=80h
SET b ,(HL)
15
2
CBh
1 1 b b b 1 1 0
SET b ,(IX + e)
23
4
DDh, CBh ,e
1 1 b b b 1 1 0
SET b ,(IY +e)
23
4
FDh, CBh, e
1 1 b b b 1 1 0
c). RES b , s- resetarea unui bit din sursa s
s I ; b I
Simbolic :sb 0
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
RES b ,r
8
2
1 0 b b b s s s
HL←200h
(200h)=80h
RES 7,(HL)
(200h)=00h
RES b ,(HL)
15
2
CBh
1 0 b b b 1 1 0
RES b ,(IX + e)
23
4
DDh, CBh ,e
1 0 b b b 1 1 0
RES b ,(IY +e)
23
4
FDh, CBh, e
1 0 b b b 1 1 0
XVI ) . Grupa instructiunilor de intrare - iesire
Prin intermediul instructiunilor din aceasta grupa, procesorul poate sa interactioneze cu circuitele I/O. In cadrul executiei acestor instructiuni, apar cicli de tip citire I/O, respectiv, scriere I/O, cicli in care semnalul IORQ se activeaza.
A. Subgrupa instructiunilor de citire a porturilor de intrare
a). IN A , (n8)- transfera in A continutul portului de intrare cu adresa specificata prin constanta pe 8 biti, n8.
Simbolic :A (n8)
b). IN r , (C) - transfera in registrul general r, continutul portului de intrare cu adresa pe 8 biti, precizata in registrul C.
Simbolic :r (C)
c). INI - (input & increment) - citeste portul de intrare si incrementeaza
Simbolic :
Instructiunea depune in memorie, la adresa specificata de registrul dublu HL, continutul portului de intrare adresat prin intermediul continutului registrului C. Adresa de memorie (continutul registrului dublu HL ) se incrementeaza la executia instructiunii, in vederea pregatirii unei depuneri ulterioare, prin aceeasi instructiune. Registrul B poate fi folosit pe post de contor al numarului de citiri ce se vor efectua, el decrementandu-se la fiecare citire si depunere.
Pentru ca instructiunea sa se deruleze corect este necesar ca in prealabil sa incarcam:
- in registrul C, adresa pe 8 biti a portului de intrare;
- in registrul HL, adresa de inceput a zonei de memorie in care se va face depunerea;
- in registrul B, numarul de citiri si depuneri ce se vor efectua, daca instructiunea va fi rulata repetat.
d). INIR - (input, increment & repeat) - citeste, incrementeaza si repeta
Simbolic :
Sunt valabile toate observatiile prezentate la instructiunea anterioara, cu precizarea ca se executa repetat pana cand B = 0. Numarul maxim de repetari este dat de capacitatea maxima a lui B, adica 255.
e). IND - (input & decrement) - citeste si decrementeaza
Simbolic :
Sunt valabile observatiile de la instructiunea INI, cu precizarea ca in HL, initial, trebuie sa se incarce adresa de sfarsit a zonei in care se va face depunerea; la executie repetata a instructiunii, transferurile se fac de la sfarsitul zonei de memorie catre inceputul acesteia.
f). INDR - (input, decrement & repeat) - citeste, decrementeaza si repeta
Simbolic :
Aceasta instructiune este practic instructiunea anterioara IND, executata repetat de numarul indicat de registrul B.
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
IN A ,(n8)
11
2
n8
(29h)=44h
IN A ,(29h)
A←44h
HL←200h C←20h
B←10h (20h)=55h
IND
(200h)=55h B←0Fh
IN r ,(C)
0
12
2
EDh
01 d d d 0 0 0
INI
1
16
2
EDh A2h
INIR
1
1
16
2
EDh B2h
IND
1
16
2
EDh
AAh
INDR
1
1
16
2
EDh
BAh
B. Subgrupa instructiunilor de scriere a porturilor de iesire
a). OUT ( n8 ) , A - transfera continutul acumulatorului la portul de iesire cu adresa specificata de constanta pe 8 biti, n8.
Simbolic : (n8) A
b). OUT (C) , r- transfera continutul acumulatorului la portul de iesire cu adresa specificata in registrul C; in prealabil, in registrul C trebuie incarcata adresa portului de iesire in care se vor depune datele.
Simbolic : (C) r
c). OUTI - (output & increment)- iesire si incrementare ;
Simbolic:
Pentru ca aceasta instructiune sa se deruleze corect este necesar sa incarcam:
- in registrul C, adresa portului de iesire cu care se va lucra ;
- in registrul dublu HL, adresa de inceput a zonei de memorie de la care se va face preluarea in vederea transferului ;
- in registrul B, numarul de preluari si scrieri ce se vor efectua , daca instructiunea se va efectua repetat.
Instructiunea se autopregateste pentru o noua rulare, prin incrementarea lui HL si decrementarea lui B.
d). OTIR - (output, increment & repeat)- iesire , incrementare si repeta
Simbolic :
Este practic instructiunea anterioara (INI), dar executata repetat de numarul de ori indicat de registrul B.
e). OUTD - (output & decrement ) - iesire si decrementare
Simbolic:
Sunt valabile precizarile de la instructiunea OUTI, cu observatia ca in registrul HL, in prealabil, trebuie incarcata adresa de sfarsit a zonei de memorie de la care se fac preluarile. La executia repetata a instructiunii, preluarile din memorie se fac de la adresa de sfarsit catre adresa de inceput a zonei.
f). OTDR - (output, decrement & repeat) - iesire , decrementare si repetare
|
Simbolic: (C) (HL)
HL HL - 1 - se repeta pana cand B=0
B B - 1
Sunt valabile precizarile facute la instructiunea anterioara, cu observatia ca instructiunea se executa repetat de numarul de ori indicat de registrul B.
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
OUT (n8) ,A
11
2
n8
A←44h
OUT A ,(33h)
(33h)=44h
HL←200h C←20h
B←10h (200h)=35h
OUTI
(20h)=35h B←0Fh
OUT (C) ,r
12
2
EDh
0 1 s s s 0 0 1
OUTI
1
16
2
EDh A3h
OTIR
1
1
16
2
EDh B3h
OUTD
1
16
2
EDh
ABh
OTDR
1
1
16
2
EDh
BBh
3. PROBLEME REZOLVATE
1 Se considera un sir de numere aflat in memoria unui microsistem cu microprocesor Z-80, incepand cu adresa 9000h. Marimea sirului este de 100 numere, reprezentate pe un octet. Sa se codeze acest sir prin schimbarea nibble-ului superior cu nibble-ul inferior din fiecare octet si plasarea noului sir incepand cu adresa 9100h.
Solutie:
Operatie de codare consta in efectuarea a patru rotatii la stanga (sau la dreapta) a bitilor fiecarui octet. Rezolvarea este prezentata in continuare:
ORG 100h
LD HL, 9000h
LD B, 64h
LD IX, 9100h
ET1: LD A, (HL)
RLCA
RLCA
RLCA
RLCA
LD (IX+0h), A
INC HL
INC IX
DEC B
JP NZ, ET1
END
2. In memoria unui microsistem cu microprocesor Z-80 se gaseste la adresa 8000h un numar reprezentat pe un octet. Sa se efectueze asupra sa urmatoarele operatii :
a) sa se inmulteasca cu 2 si sa se plaseze rezultatul incepand cu adresa 8010h
b) sa se inmulteasca cu 8 si sa se plaseze rezultatul incepand cu adresa 8020h
c) sa se imparta la 2 si sa se plaseze catul la adresa 8030h si restul la adresa 8031h
d) sa se imparta la 8 si sa se plaseze catul la adresa 8040h si restul la adresa 8041h
Operatiile vor fi efectuate prin instructiuni de deplasare.
Solutie:
a)
ORG
4000h LD
A, (8000h) LD
C, A LD
B, 0h RL
B LD
(8010h), BC END
b)
ORG
4000h LD
A, (8000h) LD
C, A LD
B, 0h RL
B RL
B RL
B LD
(8020h), BC END
c)
ORG
4000h LD
A, (8000h) LD
C, A LD
B, 0h SRL
C RL
B LD
(8030h),BC END
d)
ORG
4000h LD
A, (8000h) LD
C, A LD
B, 0h SRL
C RL
B SRL
C RL
B SRL
C RL
B LD
(8040h), BC END
3. Sa se realizeze un program care sa converteasca in cod ascii orice numar hexazecimal exprimat pe un octet. Initial numarul se afla in memorie la locatia cu adresa 8200h. Rezultatul va fi depus incepand cu adresa 8300h.
Solutie
Practic, problema cere ca plecand de la octetul exprimat in binar (hexazecimal), sa obtinem doi octeti care reprezinta codurile ASCII ale celor doua "jumatati" (nibble) ale octetului initial. In cod ASCII cifrele, de la 0 pana la 9, au codurile ASCII cuprinse intre 30h si 39h, respectiv. Pentru literele mari (majusculele) codurile ASCII incep de la 41h (pentru "A"), continuand cu pastrarea ordinii alfabetice. Tinand seama de aceste particularitati ale codului ASCII, este nevoie de o corectie care trebuie facuta in felul urmator :
- daca numarul binar (hexazecimal) este cuprins intre 00h si 09h, corectia se face prin adunare cu 30h.
De exemplu : 03h are in cod ASCII echivalentul 33h
corectia implica: 03h + 30h = 33h
- daca numarul binar (hexazecimal) este cuprins intre 0Ah si 0Fh, corectia se face prin adunare cu 37h.
De exemplu : 0Bh are in cod ASCII echivalentul 42h
corectia implica: 0Bh + 37h = 42h
Pentru rezolvarea problemei cerute rezulta ca va trebui sa "spargem" octetul de convertit in doua parti, obtinandu-se astfel doi octeti in care cei doi nibble ai octetului initial sa apara pe pozitiile cmps ale acestora. Cei 4 biti mai semnificativi ai acestor doi octeti trebuie sa fie 0. Va urma testul de apartenenta in una din cele doua categorii anterioare (cifra sau litera) si realizarea corectiei corespunzatoare.
Spre exemplu, pentru numarul binar 10110011( 2 ) , va trebui afisat in hexazecimal B3h. In acest sens va trebui sa obtinem doi octeti 42h (codul ASCII pentru B) si 33h (codul ASCII pentru 3).
Organizam programul sub forma unui program principal ce apeleaza o subrutina care realizeaza conversia ASCII.
* program principal *
subrutina de conversie in cod ascii *
Initial, subrutina ce realizeaza conversia (CONV_ASCII) primeste in acumulator octetul de convertit. Subrutina foloseste locatia de memorie cu adresa 8201h, pentru executia instructiunii RRD, in vederea despartirii in nibble ai octetului. Dupa operatia RRD, in acumulator se obtine ocmps-ul din viitorul echivalent ASCII, iar in locatia de memorie adresata de registrul HL, ocms-ul. Urmeaza corectia ASCII pentru rezultatul din acumulator si plasarea acestuia in registrul E, respectiv, corectia continutului locatiei de memorie adresata de HL si plasarea rezultatului obtinut in registrul D. In concluzie, subrutina de conversie ASCII primeste in A octetul de convertit si plaseaza rezultatul (2 octeti) in registrii D si E.
In format sursa si respectiv, obiect se obtine:
;* program principal *
ORG 100h
LD SP,100h 100h :31h 00h 01h
LD HL,200h 103h :21h 00h 02h
LD A, (HL) 106h :7Eh
CALL CONV_ASCII 107h :CDh 00h 03h
LD A, D 10Ah : 7Ah
LD (8300h), A 10Bh : 32h00h 83h
LD A, E 10Eh : 7Bh
LD (8301h), A 10Fh : 32h01h 83h
HALT 112h :76h
;* subrutina de conversie ASCII *
ORG 300h
CONV_ASCII: LD HL,201h 300h :21h 01h 02h
LD (HL),A 303h :77h
LD A,00h 304h :3Eh00h
RRD 306h :EDh 67h
CP 0Ah 308h : FEh 0Ah
JP Z ,ET130Ah :CAh 10h 03h
JP C ,ET230Dh :DAh 15h 03h
ET1 : DD A,37h 310h :C6h37h
JP,ET3 312h :C3h17h 03h
ET2 : ADD A,30h 315h :C6h30h
ET3 : LD E,A 317h :5Fh
LD A,(HL) 318h :7Eh
CP 0Ah 319h :FEh0Ah
JP Z, ET4 31Bh :CAh 21h 03h
JP C, ET5 31Eh :DAh 26h 03h
ET4 : ADD A,37h 321h :C6h 37h
JP ET6 323h :C3h 28h 03h
ET5 : ADD A,30h 326h :C6h 30h
ET6 : LD D,A 328h :57h
RET 329h :C9h
4. Se considera doua numere binare reprezentate pe cate un octet fiecare. Primul numar este plasat in memorie la adresa 8300h, iar cel de-al doilea numar la adresa 8400h. Se cere realizarea unui program pentru efectuarea operatiei de inmultire intre cele doua numere cu plasarea rezultatului in memorie de la adresa 8500h, incepand cu ocmps-ul.
Solutie:
Un algoritm rapid de efectuare a operatiei de inmultire presupune obtinerea de produse partiale si cumularea lor imediat dupa obtinere intr-un produs partial. Aceasta metoda a fost explicata pe larg la prezentarea instructiunii SRL (vezi mai sus).
Pentru situatia inmultirii a 2 octeti sunt necesare urmatoarele locatii:
- 2 octeti pentru cumularea produselor partiale si obtinerea rezultatului final.Vom folosi pentru aceasta registrul dublu HL.
OBS: - registrul HL permite operatii de genul:
HL ← HL + DE sau HL ← HL + BC
- la initializare HL ← 0h
-pentru obtinerea produselor partiale vom folosi registrul dublu DE
OBS: - la initializare D ← 0h si E ← deinmultit
- vom pastra inmultitorul in registrul C. Asupra acestuia la fiecare pas se va efectua o operatie de shift-are la dreapta. Algoritmul se va incheia in momentul in care C devine 0h
Se va avea in vedere situatia in care unul din cei doi operanzi e zero, caz in care rezultatul e 0 si nu mai e necesara efectuarea operatiei de inmultire.
O alta masura de optimizare consta in determinarea celui mai mare dintre operanzi si considerarea lui ca deinmultit. In acest fel se reduce numarul de pasi pe care algoritmul il face.
* programul sursa *
ORG 2000h
LD HL, 0h
LD D, 0h
LD A, (8300h)
CP 0h
JP Z, ET1
LD B, A
LD A, (8400h)
CP 0h
JP Z, ET1
CP B
JP NC, ET2
LD E, A
LD C, B
JP ET3
ET2: LD C, A
LD E, B
ET3: SRL C
JP NC, ET4
ADD HL, DE
ET4: SLA E
RL D
LD A, C
CP 0h
JP NZ, ET3
ET1: LD (8500h), HL
END
5. Se considera un numar binar reprezentat pe un octet si plasat in memoria unui microsistem la adresa 8500h. Se cere realizarea unui program pentru obtinerea echivalentului sau BCD si plasarea acestuia in memorie de la adresa 8600h incepand cu ocmps. Rezolvarea se va efectua pe caz general.
Solutie:
Se considera numarul binar : 11010111(2) = D7h
Formula de calcul a valorii zecimale este:
Pe caz genereal avem : Xn Xn-1 Xn-2Xn-3 ..-X1 X0
In formula de mai sus prin scoaterea de factor comun pe 2 in mod repetat se ajunge la formula:
Valoarea zecimala = 2( .2(2(2Xn + Xn-1) + Xn-2) + Xn-3 ...) + X0
La fiecare pas se dubleaza numarul precedent si se aduna bitul urmator. Dupa n pasi se ajunge la numarul zecimal cautat.
La dublarea numarului trebuie avut in vedere ca asupra lui trebuie aplicata o corectie zecimala. Aceasta se face prin instructiunea DAA. Reamintim ca aceasta instructiune este valabila operatia a fost una artimetica si numarul supus operatiei a fost exprimat in BCD.
In rezolvarea problemei s-au folosit urmatoarele locatii:
registrul C pentru pastrarea numarului binar. El va fi deplasat la stanga cu o pozitie la fiecare pas in vederea obtinerii numarului bitilor numarului de convertit
registrul B pentru mentinerea numarului de biti al numarului binar de convertit ( in acest caz B = 8)
rezultatul unei astfel de conversii se reprezinta pe 2 octeti si pentru aceasta s-a folosit registrul HL. Initial acesta este initializat co 0h
Organigrama si listingul programului sunt prezentate mai jos:
ORG 0A000h
LD A, (8500h)
LD C, A
LD HL, 0h
LD B , 0h
ET1:
LD A, L
ADC A, A
DAA
LD L, A
LD A, H
ADC A, A
DAA
LD H, A
DEC B
JP NZ, ET1
LD A, L
LD (8600h), A
LD A, H
LD (8601h), A
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 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). Se considera doua numere reprezentate pe cate 6 octeti fiecare. Primul numar este plasat in memoria unui microsistem cu microprocesor Z-80, incepand cu adresa 1000h si cu octetul cel mai putin semnificativ, iar al doilea numar de la adresa 2000h , tot incepand cu octetul cel mai putin semnificativ. Se cere realizarea operatiei de adunare intre cele doua numere cu plasarea rezultatului de la adresa 3000h incepand cu octetul cel mai putin semnificativ. Adunarea se va trata pe caz general, iar algoritmul se doreste cat mai optim cu putinta.
b). Se considera doua numere binare reprezentate pe cate un octet fiecare. Primul numar este plasat in memorie la adresa 300h, iar cel de-al doilea numar la adresa 400h. Se cere realizarea unui program pentru efectuarea operatiei de inmultire intre cele doua numere cu plasarea rezultatului in memorie de la adresa 500h, incepand cu ocmps-ul.
c). Se considera doua numere reprezentate pe cate doi octeti fiecare. Primul numar este plasat in memoria unui microsistem de la adresa 200h, incepand cu ocmps-ul, iar cel de-al doilea numar se afla la adresa 300h, incepand tot cu ocmps-ul. Se cere realizarea operatiei de inmultire intre cele doua numere (tratare pe caz general) cu plasarea rezultatului incepand cu adresa 400h si cu ocmps-ul.
d). Se considera un numar binar reprezentat pe un octet si plasat in memoria unui microsistem la adresa 500h. Se cere realizarea unui program pentru obtinerea echivalentului sau BCD si plasarea acestuia in memorie de la adresa 600h incepand cu ocmps. Rezolvarea se va efectua pe caz general.
e). Se considera un numar BCD mai mic decat 255(10) . Acest numar este plasat in memoria unui microsistem de la adresa 700h, incepand cu ocmps. Se cere realizarea unui program pentru obtinerea echivalentului sau binar si plasarea acestuia in memorie de la adresa 800h.