|
SETUL DE INSTRUCTIUNI AL mR Z-80 ( I ) - MICROPROCESOARE
1. Obiectul lucrarii
Lucrarea isi propune prezentarea setului de instructiuni al microprocesorului Z-80. Setul de instructiuni este impartit in mai multe grupe. In aceasta lucrare se prezinta grupa instructiunilor de transfer pe 8 biti, cea a transferurilor pe 16 biti si in final lucrul cu stiva. De asemenea, instructiunile respective sunt ilustrate cu aplicatii.
2. Breviar teoretic
Setul de instructiuni al microprocesorului Z-80 este impartit in 16 grupe. Instructiunile sunt reprezentate in memoria microsistemelor pe 1 pana la 4 octeti. O instructiune este formata din codul propriu-zis al acesteia si, optional, din operanzi. Primul sau primii doi octeti reprezinta codul propriu-zis al instructiunii. Urmatorul sau urmatorii doi octeti, daca exista, reprezinta operanzii.
I. Grupa instructiunilor de transfer pe 8 biti :
Instructiunile din aceasta grupa transfera un octet (8 biti) in cadrul executiei, de la o sursa catre o destinatie. Simbolic, acest lucru se reprezinta astfel:
d s
unde d - este destinatia, iar s - sursa. Destinatia si sursa pot fi registri, locatii de memorie etc., motiv pentru care apar mai multe subgrupe ale acestui tip de instructiune. Instructiunile din aceasta grupa lasa nemodificat registrul F al indicatorilor de conditii.
LD r,s - (load r with s ) - incarca registrul r cu sursa s
Simbolic:r s (continutul sursei s trece in registrul r)
r = registru general pe 8 biti al microprocesorului; r I
s I
n8 = constanta pe 8 biti(numar cuprins in gama 00h ,, 0ffh);
e = numar reprezentat in cod complement fata de 2 (CC2) pe 8 biti (deplasament).
NOTA:. O notatie de tipul (XX) reprezinta continutul locatiei de memorie adresat de entitatea XX, aflata in interiorul parantezei, care semnifica chiar adresa locatiei de memorie. Pentru microprocesorul Z-80, adresa unei locatii de memorie este un numar pe 16 biti (cuvant), iar continutul unei locatii de memorie (data) este un numar pe 8 biti (octet). Intotdeauna entitatea XX (care poate fi un registru dublu) trebuie sa reprezinte un numar pe 16 biti.
Cele 5 posibilitati in cadrul acestei subgrupe sunt:
a) LD r,r(incarcarea unui registru de la alt registru)
Simbolic : r r
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD r, r
4
1
0 1 d d d s s s
Daca A = 1Dh
si C = 4Fh
LD A,C
final : A=4Fh
si C=4Fh
d d d = reprezinta codarea destinatiei
ss s = semnifica codarea sursei
Tabelul de codare (valabil pentru toate instructiunile ce contin aceste coduri) se prezinta mai jos:
d d d
(s) (s) (s)
Registrul
0 0 0
0 0 1
0 1 0
0 1 1
B
C
D
E
1 0 0
1 0 1
1 1 0
1 1 1
H
L
(HL)
A
Spre exemplu, instructiunea LD A,C va avea codul masina 0 1 1 1 1 0 0 1 (in binar) sau 79h.
OBSERVATIE. Din punctul de vedere al notatiei, in codul mnemonic al unei instructiuni de transfer, entitatea aflata in partea dreapta (sursa) va trece in entitatea aflata in stanga (destinatia).
b) LD r,n8(incarcarea unui registru simplu cu o constanta pe 8 biti, n8).
Simbolic : r n8
Instructiune
S
Z
H
O
N
C
T
L
Cod masina
Exemplu
LD r, n8
7
2
0 0 d d d 1 1 0
n8
daca A = 1Dh
LD A, 3Fh
final : A = 3Fh
NOTA Instructiunea LD B,7Ah va avea codul masina format din octetii 06h si 7Ah (in aceasta ordine).
c) LD r,(HL)- (incarcarea unui registru cu continutul locatiei de memorie adresat de HL).
Simbolic : r (HL)
Instructiune
S
Z
H
O
N
C
T
L
Cod masina
Exemplu
LD r, (HL)
7
1
0 1 s s s 1 1 0
daca HL = 100h si (100h) =0xF4h
LD D, (HL)
final : D = 0xF4h
Pentru ca instructiunea sa se desfasoare corect, in prealabil este necesar sa se incarce registrul dublu HL, cu adresa locatiei de memorie cu care se va lucra. De exemplu, acest lucru se poate face folosind instructiunile LD H,n8 si LD L,n8 (pentru incarcarea octetului mai semnificativ si respectiv, mai putin semnificativ ai adresei).
Nu exista o instructiune de tipul LD (HL), (HL), care ar avea codul 76h. La intalnirea acestui cod, microprocesorul executa instructiunea HALT (oprire).
Exemplu de instructiune : LD D,(HL) are codul 0 1 0 1 0 1 1 0 (binar) sau 56h.
d) LD r, (IX+e) - (incarcarea registrului r cu continutul locatie de memorie avand adresa IX + e).
Simbolic : r (IX+e)
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD r, (IX+e)
19
3
DDh
0 1 s s s 1 1 0
e
daca IX = 200h si (204h) = 0xF4h
LD D, (IX+04h)
final : D = 0xF4h
(IX+e) = continutul locatiei de memorie adresata indexat cu deplasamentul " e ";
e (deplasament) = numar reprezentat in cod complement fata de 2 (CC2); este folosit pentru a reprezenta numerele binare cu semn.
In acest mod de adresare, adresa operandului implicat in operatie (in cazul nostru, adresa sursei) se gaseste prin insumarea algebrica a continutului registrului index IX cu numarul cu semn "e" (deplasamentul).
Daca e < 0, operandul se afla in spatele locatiei de memorie de referinta, a carei adresa se gaseste in registrul index IX (acest lucru inseamna catre adresa 0000h). Daca e > 0, operandul se afla in fata locatiei de memorie de referinta, adica catre adresa 0FFFFh.
Astfel, prin folosirea deplasamentului (exprimat fata de adresa de referinta indicata de IX) putem sa selectam 255 de locatii (127 catre inainte si 128 catre inapoi).
NOTA. Reprezentarea in CC2 permite transformarea operatiilor de scadere in operatii de adunare. De exemplu :
07h - 03h = 07h + 0FDh = 04h ! ! ! (trunchind rezultatul final la doar 8 biti ). Pentru aceasta operatie, indicatorul de conditii V (overflow) ia valoarea "0"-logic, semnificand nedepasirea gamei de reprezentare pe 8 biti. Daca acest indicator este "1"-logic, rezultatul obtinut trebuie corectat tinand seama de depasire si bitul de transport (carry).
e) LD r,(IY+e)
Simbolic : r (IY+e)
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD r, (IY+e)
19
3
FDh
0 1 s s s 1 1 0
e
daca IY = 200h si (204h) = 0xF4h
LD C, (IY+04h)
final : C = 0xF4h
Exemplu : LD A, (IY +23h) COD MASINA : FDh 7Eh 23h
Practic, toate observatiile facute la instructiunea anterioara raman valabile si pentru registrul index IY.
OBSERVATII. Pentru toate instructiunile ce folosesc registrul index IX, la reprezentarea codului masina apare prefixul 0DDh, iar la cele ce folosesc registrul index IY , prefixul 0FDh.
Nu exista nici o instructiune care sa lege direct registri IX cu IY sau IX cu HL sau IY cu HL.
LD d,r - (load d with r) - incarca destinatia d cu registrul r
Simbolic : d r(continutul registrului r trece in destinatia d)
d I
Apar urmatoarele 4 posibilitati ale acestei instructiuni :
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD r, r
4
1
0 1 d d d s s s
daca IY = 200h
(204h) = 0xF4h
si C = 0Eh
LD (IY+04h) , C
final : (204h) = 0Eh
LD (HL), r
7
1
0 1 1 1 0 s s s
LD (IX+e),r
19
3
DDh
0 1 1 1 0 s s s
e
LD (IY+e),r
19
3
FDh
0 1 1 1 0 s s s
e
LD d,n8 - (load d with data n8) incarcarea unei destinatii cu constanta pe 8 biti , n8
Simbolic : d n8 d I
Apar urmatoarele 3 situatii posibile :
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD (HL) , n8
10
2
36h n8
daca HL=100h si (100h)=0xF4h
LD (HL), 0xF4h
final : (100h)=0xF4h
HL=100h
LD (IX+e), n8
19
4
DDh 36h
n8
e
LD(IY+e) , n8
19
4
FDh 36h
n8
e
LD A,s - (load accumulator from s) - incarca acumulatorul de la o sursa s
Simbolic : A s s I
Apar urmatoarele 5 posibilitati:
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD A , (BC)
7
1
0Ah
daca BC=2400h si (2400h)=0x9Dh
LD A, (BC)
final :
A=0x9Dh
(2400h)=0x9Dh
BC=2400h
LD A , (DE)
7
1
1Ah
LD A , (n16)
13
3
3Ah
n16L n16H
LD A , I
0
0
9
2
EDh 57h
LD A , R
0
0
9
2
EDh 5Fh
NOTA . Reprezentarea unei constante pe 16 biti in memoria microsistemului se face in ordinea ocmps ( n16L ) - partea "low", urmat de ocms ( n16H ) - partea "high". Acest lucru este valabil pentru toate instructiunile care opereaza cu constante pe 16 biti.
OBSERVATIE . Ultimele doua instructiuni reprezinta singurele posibilitati pentru citirea si, respectiv, scrierea informatiilor din si in registri I si R.
LD d,A - (load d with accumulator) - transfera acumulatorul in destinatia d
Simbolic : d A d I
Apar urmatoarele 5 posibilitati:
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD (BC) , A
7
1
02h
daca BC=2400h (2400h)=0x9Dh
si A=0Ch
LD (BC), A
final : (2400h)=0Ch
BC=2400h
LD (DE), A
7
1
12h
LD (n16), A
13
3
32h
n16L n16H
LD I, A
0
0
9
2
Edh 47h
LD R, A
0
0
9
2
Edh 4Fh
OBSERVATIE . Ultimele doua instructiuni reprezinta singurele posibilitati pentru scrierea
si, respectiv, citirea informatiilor in si din registri I si R.
Toate instructiunile de transfer pe 8 biti se pot prezenta unitar in urmatoarea diagrama:
II. Grupa instructiunilor de transfer pe 16 biti :
Instructiunile din aceasta grupa transfera in cadrul executiei, un cuvant (16 biti) de la o sursa dubla catre o destinatie dubla. Sursa si, respectiv, destinatia dubla sunt entitati pe 16 biti. Simbolic, acest lucru se reprezinta astfel :
dd ss
dd - semnifica destinatie dubla, iar ss - sursa dubla. Destinatia si sursa pot fi diverse (registri pereche, locatii de memorie), din acest motiv aparand mai multe subgrupe ale acestui tip de instructiune. Instructiunile din aceasta grupa lasa nemodificat registrul F al indicatorilor de conditii.
LD dd,n16 - Incarcarea unei destinatii duble cu constanta pe 16 biti , n16.
Simbolic : dd n16
dd = destinatie dubla
dd I
Apar urmatoarele situatii :
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD dd , n16
10
3
0 0 rp1 rp2 0 0 0 1 n16L
n16H
LD BC, 2400h
final :
BC=2400h
LD dd , n16 - realizeaza incarcarea unui registru dublu cu constanta pe 16 biti, n16 - pentru registri dubli BC,DE, HL si SP.
Simbolic: dd n16 . Instructiunea incarca partea "low" a constantei n16 (8 biti) in registrul mai putin semnificativ al registrului extins, iar partea "high" a aceleiasi constante este incarcata in registrul mai semnificativ al registrului pereche.
Combinatia rp1, rp2 desemneaza registrul pereche implicat in operatie si este specificata in tabelul urmator:
NOTA. Prin rp1, rp2 se indica atat sursa cat si destinatia. Combinatiile prezentate sunt valabile pentru toate instructiunile ce folosesc registri dubli. |
rp1
rp2
registrul
0
0
BC
0
1
DE
1
0
HL
1
1
SP
AF
De exemplu, instructiunea LD HL,1234h va avea codul masina 0 0 1 0 0 0 0 1 (binar) adica 21h si operanzii 34h si 12h (in aceasta ordine). Instructiunea provoaca incarcarea in H a constantei 12h , iar in L a constantei 34h. La acelasi efect s-ar fi ajuns folosind doua instructiuni de transfer pe 8 biti : LD H,12hsiLD L,34h .
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD IX, n16
14
4
DDh 21h
n16L
n16H
daca IX=2435h
LD IX, 60F3h
final :
IX=60F3h
LD IY, n16
14
4
FDh 21h
n16L
n16H
LD dd,(n16) - Incarcarea unei destinatii duble cu continutul locatiei de memorie cu adresa n16si respectiv, cu continutul locatiei imediat urmatoare ce are adresa n16 + 1.
Simbolic : ddL (n16)- octetul aflat la adresa specificata prin constanta pe16biti , n16, trece in partea " low " a destinatiei duble;
ddH (n16 + 1)- octetul aflat la adresa imediat urmatoare, n16 + 1, trece in partea " high " a destinatiei duble.
dd = destinatie dubladd I
NOTA. Se atrage atentia asupra faptului ca mnemonica instructiunii nu exprima exact ceea ce se executa. Se efectueaza de fapt, doua transferuri pe 8 biti (sau unul pe 16 biti).
Apar urmatoarele cazuri:
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD dd, (n16)
20
4
EDh
0 1 rp1 rp2 1 0 1 1
n16L
n16H
daca IX=2435h
(04FAh)=77h si
(04FBh)=79h
LD IX, (04FAh)
final :
IX=7977h
LD IX, (n16)
20
4
DDh 2Ah
n16L
n16H
LD IX, (n16)
20
4
FDh 2Ah
n16L
n16H
LD dd, (n16) - realizeaza incarcarea unui registru pereche destinatie, dd, de la doua locatii succesive de memorie incepand cu adresa pe 16 biti, n16 - pentru registri BC, DE,HL, SP.
OBSERVATIE. Registrul dublu HL nu se supune acestei reguli de codare si, pentru instructiunea LD HL, (n16) exista urmatorul cod masina : 2Ah , n16L , n16H . Explicatia exceptiei consta in faptul ca microprocesorul Z-80 a fost creat in idea de a fi compatibil cu un alt microprocesor, creat anterior de firma INTEL, denumit 8080. La acest microprocesor exista doar instructiunea de echivalenta pentru LD HL ,(n16), ceilalti registri neavand instructiuni echivalente. A fost pastrat codul masina specificat anterior.
LD IX, (n16) - realizeaza incarcarea registrului index IX cu continutul a doua locatii succesive de memorie.
LD IX, (n16) - realizeaza incarcarea registrului index IY cu continutul a doua locatii succesive de memorie.
LD (n16),ss - Transferarea continutului unei surse duble, ss, in doua locatii succesive de memorie, incepand cu adresa specificata de constanta pe 16 biti , n16.
Simbolic : (n16) ssL - octetul aflat in partea " low " a sursei duble , se transfera in locatia de memorie specificata prin constanta pe 16 biti, n16;
(n16 + 1) ssH - octetul aflat in partea " low " a sursei duble , se transfera in locatia de memorie imediat urmatoare, n16 + 1.
ss I ss = sursa dubla
NOTA. Se atrage atentia asupra faptului ca mnemonica instructiunii nu exprima exact ceea ce se executa . Se efectueaza de fapt, doua transferuri pe 8 biti (sau unul pe 16 biti).
Apar urmatoarele cazuri:
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD (n16), ss
20
4
EDh
0 1 rp1 rp2 0 0 1 1
n16L
n16H
daca BC=040Ah
(04FAh)=77h si
(04FBh)=79h
LD (04FAh), BC
final :
(04FAh)=0Ah si
(04FBh)=04h
LD (n16), IX
20
4
DDh 22h
n16L
n16H
LD (n16), IY
20
4
FDh 22h
n16L
n16H
LD (n16),ss - realizeaza incarcarea a doua locatii succesive de memorie, incepand cu adresa pe 16 biti, n16, cu continutul sursei duble ss - pentru registri BC, DE, HL, SP.
ss I
Totusi, registrul dublu HL nu se supune acestei reguli de codare si pentru instructiunea LD (n16), HL exista urmatorul cod masina : 22h, n16L , n16H . Explicatia exceptiei consta in faptul ca microprocesorul Z-80 a fost creat in ideea de a fi compatibil cu un alt microprocesor, creat anterior de firma INTEL, denumit 8080. La acest microprocesor exista doar instructiunea echivalenta pentru LD (n16), HL, ceilalti registri neavand instructiuni echivalente. A fost pastrat codul masina specificat anterior.
LD (n16),IX - realizeaza transferarea registrului index IX in continutul a doua locatii succesive de memorie.
LD (n16),IY - realizeaza transferarea registrului index IX in continutul a doua locatii succesive de memorie.
LD SP,ss - Transferarea sursei duble ss in registrul SP, cu pastrarea gradului de semnificatie al celor doi octeti ce se transfera.
Simbolic : SP ss ss I ss = sursa dubla
Apar situatiile:
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
LD SP,HL
6
1
F9h
daca SP=0440h
HL=0C00h
LD SP, HL
final :
SP=0C00h
LD SP, IX
10
2
DDh F9h
LD SP, IY
10
2
FDh F9h
PUSH ss - salvarea in stiva a sursei duble ss.
Stiva este o portiune a memoriei RAM externa a procesorului. Adresarea stivei se face prin folosirea registrului SP.
Simbolic : ( SP-1 ) ssH
( SP-2 ) ssL
SP SP-2
ss I
Practic, are loc depunerea a doi octeti in doua locatii succesive de stiva (in ordinea indicata in simbolizarea anterioara), iar registrul SP este reactualizat printr-o dubla decrementare. El indica dupa aceasta operatie, adresa ultimei depuneri in stiva.
OBSERVATIE. Orice operatie cu stiva trebuie sa fie precedata de fixarea bazei stivei prin incarcarea registrului SP cu o constanta pe 16 biti ce exprima adresa bazei stivei.
Apar urmatoarele situatii:
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
PUSH ss
11
1
1 1 rp1 rp2 0 1 0 1
daca SP=0440h
BC=0C0Eh
PUSH BC
final :
SP=043Eh
(043Fh)=0Ch
(043Eh)=0Eh
PUSH, IX
15
2
DDh E5h
PUSH, IY
15
2
FDh E5h
NOTA: PUSH ss- (pentru registri dubli BC, DE, HL, AF).
APLICATIE. Considerand registrul dublu BC si continutul acestuia 4567h si, respectiv, baza stivei fixata la adresa 8100h, se cere analiza efectului instructiunii PUSH BC asupra stivei.
Solutie
Conform structurii instructiunii, depunerea se face secvential (in doua etape) - mai intai se depune in stiva ocms-ul registrului dublu (partea High - registrul B), apoi ocmps-ul (partea Low - registrul C). Prima depunere se face la adresa de stiva 80FFh, iar a doua depunere la adresa 80FEh. Dupa depunere, registrul SP se reactualizeaza, indicand adresa ultimei depuneri in stiva, adica 80FEh. Se observa ca la o depunere in stiva, SP-ul se decrementeaza, apropiindu-se de adresa de inceput a memoriei (stiva creste catre inapoi). Pentru zona de memorie implicata, lucrurile sunt prezentate grafic astfel:
POP dd - restaurarea din stiva a destinatiei duble dd .
Simbolic:ddL (SP)
ddH (SP+1)
SP SP +2 dd I
Practic, are loc extragerea a doi octeti din doua locatii succesive de stiva (in ordinea indicata in simbolizarea anterioara), iar registrul SP este reactualizat printr-o dubla incrementare. El indica dupa aceasta operatie, adresa ultimei depuneri in stiva.
Apar urmatoarele situatii:
Instructiune
S
Z
H
O
N
C
t
L
Cod masina
Exemplu
POP dd
10
1
1 1 rp1 rp2 0 0 0 1
daca
SP=043Eh
(043Fh)=0Ch
(043Eh)=0Eh
POP IX
final :
SP=0440h
IX=0C0Eh
POP, IX
14
2
DDh E1h
POP, IY
14
2
FDh E1h
NOTA: POP dd- (pentru registri dubli BC, DE, HL, AF).
APLICATIE. Sa se analizeze efectul executiei instructiunii POP DE , in conditiile ramase dupa efectuarea aplicatiei anterioare (de la instructiunea PUSH).
Solutie
Conditiile anterioare ramase sunt:
- adresa initiala a varfului stivei SP = 80FE(H)
- continutul de la adresa 80FE(H) = 67(H)
- continutul de la adresa 80FF(H) = 45(H)
Derularea operatiilor efectuate de instructiune poate fi prezentata astfel:
Etapa IE (FE(H))adicaE 67(H)
Etapa II D (FE(H) + 1) = (FF(H)) adicaD 45(H)
Etapa III SP FE(H) + 2 = 100(H)
OBSERVATII.
- Instructiunile PUSH si POP permit utilizatorului folosirea manuala a stivei, prin intermediul registrului SP ce adreseaza aceasta parte de memorie. SP-ul se decrementeaza la depunerile in stiva si se incrementeaza la extragerile din ea. SP-ul actioneaza de asa natura incat stiva este adresata prin tehnica LIFO (Last In First Out). Stiva poate fi accesata si automat de microprocesor, in anumite situatii speciale (apelarea subrutinelor, tratarea cererilor de intrerupere), situatii pentru care in stiva se salveaza si, respectiv, se restaureaza registrul PC (cazul microprocesorului Z-80).
- Instructiunile PUSH AF si POP AF sunt singurele posibilitati de citire si, respectiv, scriere ale registrului F, acesta neavand o alta legatura cu ceilalti registri ai microprocesorului.
3. Probleme rezolvate
a) Incarcati locatia de memorie 8200h cu constanta 55h, locatia cu adresa 8201h cu constanta 66h, locatia 8202h cu constanta 77h si locatia 8203h cu constanta 88h. Se cere ca fiecare transfer sa fie realizat printr-o procedura distincta.
Solutie
Rezolvarea unei probleme in limbaj de asamblare se recomanda a fi facuta in urmatoarele etape:
1. - elaborarea organigramei problemei; se pleaca de la o organigrama generala urmand un proces de detaliere al fiecarui bloc logic pana se ajunge la faza in care este posibila corespondenta cu o instructiune (sau grup de instructiuni) in limbaj de asamblare; pot fi mai multe etape succesive de detaliere, functie de complexitatea problemei.
2. - trecerea in limbaj de asamblare prin echivalarea fiecarui bloc logic din organigrama cu o instructiune sau grup de instructiuni; se obtine in acest fel formatul sursa al programului; se va avea in vedere respectarea regulilor de sintaxa ale directivelor programului asamblor (crossasamblor) si, respectiv, ale instructiunilor .
3. - trecerea in cod masina propriu-zis prin asamblarea programului; asamblarea se poate face manual (prin folosirea de tabele de echivalare) sau automat (cu programe de tip asamblor sau crossasamblor); listing-ul rezultant prezinta adresa instructiunilor si codul masina al acestora.
Aceasta organigrama reprezinta cea mai generala forma de rezolvare a problemei propuse. Intr-o a doua faza a primei etape de rezolvare se va urmari detalierea blocurilor logice in vederea ajungerii in faza in care fiecarui bloc ii corespunde o instructiune (sau grup de instructiuni). Trecerea trebuie facuta avand in vedere particularitatile lucrului in limbaj de asamblare la microprocesorul Z-80 si cerintele problemei. Problema propusa este una cu grad scazut de dificultate si un utilizator experimentat poate trece direct in faza programului sursa fara a mai face detalieri ale organigramei. |
Pentru problema propusa, organigrama generala este urmatoarea :
Organigrama detaliata, precum si formele sursa si respectiv, obiect ale programului sunt prezentate in continuare. In forma sursa a programului se constata prezenta a doua directive ale programului asamblor. Este vorba deORG 100hsiEND . Prima directiva exprima originea programul obiect (locul in care se va depune in memoria microsistemului, in vederea rularii - in cazul nostru 100h) , iar cea de-a doua indica sfarsitul programului.
ORG 8100h LD H,82h 100h: 26h,82h LD L,00h 102h: 2Eh,00h LD (HL),55H 104h: 36h,55h LD A,66h 106h: 3Eh,66h LD B,H 108h: 44h LD C,01h 109h: 0Eh,01h LD (BC),A 10Bh: 02h LD D,77h 10Ch: 16h,77h LD L,02h 10Eh: 2Eh,02h LD (HL),D 111h: 72h LD A,88h 112h: 3Eh,88h LD (8203h),A 114h: 32h,03h,82h END
cati cicli masina sunt necesari pentru rularea fiecarei instructiuni?
- ce valori au registri procesorului Z80 dupa rularea fiecarei instructiuni in parte?
- la sfarsitul rularii programului, care este continutul registrului B ?
- ce modificare se va face pentru a muta valoarea 20h la adresa 8210h si nu la adresa 8200h?
- realizati un program asemanator in care constantele zecimale 10, 45 si 100 sunt depuse la adresele 9000h, 9001h si 9002h.
b) Sa se realizeze un program in care se efectueaza urmatoarele transferuri de date utilizand doar registri index:
Solutie:
Dupa acum s-a aratat in partea teoretica in adresarea indexata se foloseste un deplasament care trebuie exprimat in complement fata de 2. Asadar valorile 10 , -10 , 20 si -20 au urmatoarele echivalente in CC2: 0Ah, 0xF6h, 14h si respectiv 0xECh. In continuare sunt prezentate organigrama, codul sursa si codul masina:
ORG
9100h LD
IX, 8100h 100h: DDh, 21h, 00h, 81h LD
A, 20h 104h: 2Eh, 20h LD
(IX+00h), A 106h: DDh, 77h, 00h LD
(IX+0Ah), 30h 109h: DDh, 36h, 0Ah, 30h LD
(IX-10h), 40h 10Dh: DDh, 36h, F6h, 40h LD
IY, 8100h 111h: FDh, 21h, 00h, 81h LD
B, 50h 115h: 06h, 50h LD
(IY+14h), B 117h: FDh, 70h, 14h LD
C, 60h 11Ah: 0Eh, 60h LD
(IY-14h), C 11Ch: FDh, 71h, ECh END
cati cicli masina sunt necesari pentru rularea fiecarei instructiuni?
- ce valori au registri procesorului Z80 dupa rularea fiecarei instructiune in parte?
recalculati deplasamentele din enuntul problemei si verificati, dupa ce rulati programul, daca octetii respectivi au fost depusi la adresele corecte;
- realizati un program in care sa fie depusa constanta zecimala 23 de la adresa 0A03Dh in 5 locatii consecutive dar numai prin modificarea indexului de deplasament.
c) Sa se realizeze un program in care utilizand instructiuni pe 16 biti se completeaza adresele 8000h, 80001h, 8002h, 8003h, 8004h, 8005h cu valorile 01h, 02h, 03h, 04h, 05h, 06h.
Solutie:
ORG 9300h LD B, 02h 300h: 06h, 02h LD C, 01h 302h: 0Eh, 01h LD (8000h), BC 304h: EDh, 43h, 00h, 80h LD HL, 0403h 308h: 21h, 03h, 04h LD (8002h), HL 30Bh: 22h, 02h, 80h LD IX, 0605h 30Eh: DDh, 21h, 05h, 06h LD (8004h), IX 312h: DDh, 22h, 04h, 80h END
cati cicli masina sunt necesari pentru rularea fiecarei instructiuni?
- de ce este diferit numarul de cicli masina la unele instructiuni?
- ce valori au registri procesorului Z80 dupa rularea fiecarei instructiuni in parte?
- daca dorim sa plasam constanta hexazecimala 3FC9h incepand de la adresa 80D0h, la ce adresa va fi plasat fiecare octet in parte?
d) Realizati un program care sa schimbe intre ele continuturile locatiilor de memorie cu adresele 8602h si 8603h.
Organigrama generala de rezolvare este:
O
operatie directa de schimb intre doua locatii de
memorie nu este posibila in mod direct, printr-o singura
instructiune. Pentru rezolvare vom folosi un registru liber al
microprocesorului (de exemplu registru D), in vederea pastrarii
temporare a unei informatii (de exemplu, cea existenta in
locatia de memorie cu adresa 8603h. Organigrama detaliata care
rezulta, codul sursa si codul masina sunt :
ORG
8200h LD
A, (8602h) 200h: 3Ah, 02h, 86h LD
HL, 8603h 203h: 21h, 03h, 86h LD
D, (HL) 206h: 56h LD
(8603h), A 207h: 32h, 03h, 86h LD
A, D 20Ah: 7Ah LD
(8602h), A 20Bh: 32h, 02h, 86h END
ce modificari apar asupra programului daca vom scrie ORG 8400h in loc de directiva existenta?
- la sfarsitul rularii programului, care este continutul registrului L ?
- care este ultima adresa ocupata pentru programul obiect a acestei probleme?
- rezolvati problema printr-o alta modalitate;
e) Realizati un program care sa schimbe intre ele locatiile de memorie cu adresele 8200h si 8300h utilizand instructiunile de accesare a stivei.
Solutie:
In acest exemplu stiva este folosita pentru salvarea temporara a valorii din locatia 8200h. Salvarea in stiva se face cu instructiunea PUSH ss, in cazul de fata PUSH AF, in A fiind incarcat octetul de la adresa 8200h. Extragerea din stiva s-a facut cu instructiunea POP AF. In continuare sunt prezentate organigrama, codul sursa si codul masina al programului:
ORG 700h LD A, (8200h) 700h: 3Ah, 00h, 82h PUSH AF 703h: F5h LD A, (8300h) 704h: 3Ah, 00h, 83h LD (8200h), A 707h: 32h, 00h, 82h POP AF 70Ah: F1h LD (8300h), A 707h: 32h, 00h, 83h END
- ce valori va avea stiva si specificati adresa indicatorului de stiva dupa rularea fiecarei instructiuni.
- plasati baza stivei la adresa 700h si determinati problemele care apar la rularea programului. Care este cauza acestora?
4. Desfasurarea lucrarii
1. Se va citi si conspecta breviarul teoretic. Se atrage atentia asupra faptului ca toate cunostintele capatate in acest laborator vor fi necesare si in derularea celorlalte lucrari.
2. Se vor studia problemele rezolvate, incercand gasirea altor posibilitati de rezolvare si se va raspunde la intrebarile anexate.
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). Realizati un program care sa efectueze urmatorul schimb de date prezentat in diagrama:
(8401h) B
D (8502h)
b). Realizati un program care sa efectueze urmatorul schimb de date :
(8600h) H
C A
5. Se va raspunde la urmatoarele intrebari:
a). Ce intelegeti prin notatia " (1234h) " ?
b). Exista instructiunea LD (1234h), (5678h) ?
c). Care sunt exprimarile in CC2 pe 8 biti pentru urmatoarele numere zecimale cu semn :
+47 , -125 , -89 , +120 , -64 ?
d). Explicati efectul rularii instructiunilor urmatoare folosind si reprezentarea grafica:
LD IX , 3456h
LD B, (IX + 0FEh)
e). Se considera urmatoarele doua forme de instructiuni :
si LD HL, 5678h
Care sunt asemanarile si deosebirile legate de toate aspectele executiei acestor doua tipuri de instructiuni ?
f). Care va fi continutul stivei dupa rularea urmatoarei secvente de instructiuni:
LD BC, 1234h
LD HL, 5678h
LD SP, 200h
PUSH BC
PUSH HL
g). Cum s-ar putea incarca registrul F cu constanta 00h ?