În cadrul acestei lucrări de laborator se vor prezenta generarea codului mașină pentru o secvență de program scrisă în limbaj de asamblare și vizualizarea ciclurilor mașină ale microprocesorului Z80.
Întreaga activitate a microprocesorului se desfășoară într-o succesiune de cicluri mașină. Execuția unei instrucțiuni înseamnă execuția unei succesiuni de cicluri mașină. Un ciclu mașină este divizat în stări, o stare fiind definită ca o perioadă a tactului. Numărul de stări al unui ciclu mașină diferă în funcție de tipul ciclului și funcție de caracteristicile de timp ale circuitelor de memorie și porturi. Lungimea minimă a unui ciclu este de 3 stări. Un ciclu mașină poate fi prelungit prin înserarea de stări de WAIT.
Tipurile de cicluri pe care le poate executa Z80 sunt următoarele:
Primul ciclu mașină al oricărei instrucțiuni este un ciclu de fetch (Fig 3.1), prin care se aduce din memorie codul instrucțiunii ce urmează a fi executată. În următoarele cicluri, Z80 poate efectua transferuri de date cu memoria externă sau dispozitivele periferice, în funcție de tipul instrucțiunii ce a fost decodificate în ciclul precedent de fetch.
După cum se poate observa și în figura 3.2 acest ciclu mașină este format din patru stări, fiind împărțit în două subcicluri. În primele două stări se aduce efectiv codul instrucțiunii, iar în următoarele se execută un subciclu de refresh.
Activarea semnalului /M1 indică faptul că se aduce cod de instrucțiune, iar /MREQ că se face acces la memorie. Deoarece codul de instrucțiune este citit din memorie se activează semnalul /RD. Procesorul testează pe frontul posterior al tactului în starea T2 linia WAIT, iar dacă este pe 1 logic continuă ciclul. La începutul stării T3 se face preluarea datelor de pe liniile de date. În următoarele două stări se execută un subciclu de refresh prin plasarea pe magistrala de adrese a conținutului registrului R și prin activarea semnalelor /RFSH și /MREQ. Tot în stările T3 și T4 se realizează decodificarea și execuția instrucțiunii citite.
Ciclul de citire (Fig 3.3) se întinde pe durata a trei stări. Activarea semnalelor /MREQ și /RD indică faptul că se face acces de citire din memorie. Datele sunt preluate de către procesor pe frontul căzător din starea a treia. Procesorul testează pe frontul posterior al tactului în starea T2 linia WAIT, iar dacă este pe 1 logic continuă ciclul. Pentru memoriile mai lente se poate activa linia WAIT ceea ce va determina procesorul să introducă o stare suplimentară.
La fel ca și ciclul de citire din memorie și ciclul de scriere în memorie se întinde pe durata a trei stări. Procesorul plasează informațiile pe magistrala de date încă din prima stare. Dacă pe frontul posterior al lui T2 intrarea WAIT este 1 atunci ciclul continuă, iar în caz contrar se vor introduce stări suplimentare de așteptare. Singura deosebire constă în activarea semnalului /WR mai târziu cu o perioadă de tact decât semnalul /RD în ciclul de citire.
Figura 3.4 ilustrează modul de funcționare al microprocesorului Z80 în timpul operațiilor de intrare/ ieșire. Pe durata acestor operații Z80 introduce în mod automat o stare Tw, după T2, pentru a permite dispozitivului periferic adresat să-și decodifice adresa.
Totalitatea instrucțiunilor pe care un microprocesor le poate recunoaște și executa, formează setul de instrucțiuni al microprocesorului respectiv.
O instrucțiune este codificată și reprezentată printr-un anumit număr de octeți ce poartă denumirea de codul mașină al instrucțiunii. Deci codurile instrucțiunilor direct executabile de către microprocesor nu sunt altceva decât numere binare care sunt preluate din memoria sistemului. Fiecare cod declanșează, după decodificarea sa în circuitul de comandă al microprocesorului, o serie de activități ce converg spre efectuarea acelei instrucțiuni. Astfel că procesorul vede un program ca o înșiruire de octeți plasați în memorie începând cu o anumită adresă.
Exemplul 3.1: În continuare se vor prezenta modurile de codificare pentru câteva instrucțiuni.
Mnemonica Z80 |
Codul obiect |
Exemplu |
Observații |
LD r, r | 01 r r |
LD C,A - 01001111b (4Fh) |
- codificarea registrelor este prezentată în Tabelul 3.2. |
LD r, n |
00 r 110 n |
LD B, 3ah - 00000110b (06h) - 00111010b (3ah) |
- instrucțiunea are doi octeți dintre care primul este codul instrucțiunii iar al doilea operandul cu adresare imediată; - citirea primului octet din memorie se face printr-un ciclu de fetch iar citirea operandului printr-un ciclu de citire. |
LD (IX+d), r |
11011101 01110 r d |
LD (IX+10), L - 11011101b (DDh) - 01110101b (75h) - 00001010b (0ah) |
- procesorul execută două cicluri de fetch pentru citirea primilor doi octeți; apoi execută un ciclu de citire pentru operand și un ciclu de scriere a rezultatului în memorie. |
LD dd, nn |
00dd0001 n n |
LD DE, 4000h - 00010001b (11h) - 00000000b (00h) - 01000000b (40h) |
- codificarea registrelor duble este prezentată în tabelul 3.3; - operanzii reprezentați pe doi octeți se plasează în memorie cu octetul mai puțin semnificativ la adresa mai mică. |
BIT b, r |
11001011 01 b r |
BIT 3, A - 11001011b (CBh) - 01011111b (5Fh) |
- bitul testat se codifică pe trei biți. |
JP nn |
11000011 n n |
JP 4000h - 11000011b (C3h) - 00000000b (00h) - 01000000b (40h) |
- adresa absolută se plasează în memorie începând cu octetul mai puțin semnificativ. |
JR e |
00011000 e - 2 |
JR 10
- 00011000b (18h) - 00001000b (08h) JR -4 - 00011000b (18h) - 11110110b (F6h) |
- octetul operand conține adresa relativă față de PC-ul instrucțiunii următoare (e-2) iar e este relativ la PC-ul instrucțiunii JR; - slaturile se pot face în domeniul (-128, +127) față de PC-ul instrucțiunii următoare celei de JR sau (-126, +129) față de PC-ul instrucțiunii JR; - în cazul salturilor înainte operandul instrucțiunii conține numărul de octeți peste care se sare; - în cazul salturilor înapoi operandul conține un număr negativ reprezentat în complement față de 2, și reprezintă tot numărul de octeți peste care se face saltul. |
Tabelul 3.1
r, r |
Registre |
dd |
Registre |
|
000 |
B |
00 |
BC |
|
001 |
C |
01 |
DE |
|
010 |
D |
10 |
HL |
|
011 |
E |
11 |
SP |
|
100 |
H |
|||
101 |
L |
|||
111 |
A |
Tabelele 3.2 și 3.3
Instrucțiunile microprocesorului Z80 pot ocupa în memorie 1, 2, 3 sau 4 octeți în următoarele combinații posibile:
Număr de octeți/ instrucțiune |
Combinații posibile |
Exemple |
1 octet |
1 octet de cod |
LD D, H |
2 octeți |
1 octet de cod + 1 octet de date |
LD H, 37h |
2 octeți de cod |
LDI |
|
3 octeți |
1 octet de cod + 2 octeți de date |
LD BC, 4000h |
2 octeți de cod + 1 octet de date |
LD A, (IX+10) |
|
4 octeți |
2 octeti de cod + 2 octeți de date |
LD IX, 1000h |
3 octeți de cod + 1 octet de date |
BIT 3, (IY+5) |
Tabelul 3.4
Deoarece programarea la nivel de cod mașină este dificilă se folosește programarea la nivel de limbaj de asamblare. Codurile instrucțiunilor se formulează în limbajul de asamblare ca și cuvinte cheie care exprimă funcția reprezentată de codul respectiv. Aceste cuvinte cheie se numesc mnemonici.
Limbajul de asamblare este o imagine fidelă a setului de instrucțiuni, el exprimând cât se poate de exact operațiile elementare pe care o unitate centrală de microprocesor le poate executa. În plus față de setul de instrucțiuni, un limbaj de asamblare mai oferă posibilitatea de definire a variabilelor, constantelor și introducerea unor directive de asamblare.
Între instrucțiunile limbajului de asamblare și codurile binare de instrucțiuni (codurile mașină) ale unui procesor există totdeauna o relație biunivocă: fiecărei instrucțiuni în limbaj de asamblare îi corespunde unul și numai un cod.
O secvență de program scris în limbaj de asamblare respectiv codul mașină asociat este următoarea:
Exemplul 3.2:limbaj asamblare cod mașină
Formatul general al unei instrucțiuni în limbaj de asamblare este următorul:
MNEMONICĂ [operand 1, [operand 2]]
Programul care realizează translatarea din limbajul de asamblare în codul mașină corespunzător se numește asamblor. Sintaxa completă a unei linii de cod recunoscută de asamblor (dependentă de asamblor) este prezentată mai jos:
ETICHETĂ: MNEMONICĂ operand_destinație, operand_sursă ; comentariu
iar pentru definirea unei variabile și respectiv a unei constante sintaxa este:
ETICHETĂ: CAPACITATE secvența_de_inițializare ; comentariu
ETICHETĂ EQU VALOARE
unde avem:
Exemplul 3.3:
Pentru ca un program (ciclurile mașină ale programului) să poată fi vizualizat cu osciloscopul trebuie să îndeplinească următoarele două proprietăți:
Monitorul este un program ce oferă un set minim de operații utile la exploatarea microsistemului.
Câteva dintre comenzile acceptate sunt următoarele:
XXXX număr hexa.
În cadrul laboratorului se vor parcurge următorii pași: