3.2 Introducere la programarea microprocesorului


În această prelegere vom studia diferitele sisteme numerice, limbaje de programare și arhitectura internă a microprocesorului de bază, 8085. 

1. Sistem de numere 

Sistemul de numere este un mod de a reprezenta valoarea oricărui număr în raport cu o valoare de bază. Sistemul de numere poate fi clasificat în funcție de „baza” sa. Fiecare număr are o reprezentare unică într-un sistem de numere. Sisteme numerice diferite au reprezentare diferită a aceluiași număr. În general, sistemele de numere Binar, Octal, Zecimal și Hexazecimal sunt utilizate în programarea microprocesorului. Tabelul 3.2.1 prezintă diferite sisteme de numere și detaliile lor. 

Tabelul 3.2.1 Sisteme de numerotare 

1.1 Reprezentarea numărului 

1.1.1 Conversia oricărui sistem numeric în sistem de numere zecimale: 

Fie B baza sistemului de numere și An, An-1,  ………………… A1, Ao sunt cifrele unui număr dat. Atunci, pentru a o converti în echivalent zecimal, putem folosi următoarea formulă:

 (3.2.1)

Exemplu: care este echivalentul zecimal al (11101011)2

→  Aici, am luat An = 1, An-1 = 1, ……. An-3 = 0, în timp ce n = 8 și B = 2.  

Atunci echivalentul zecimal este (235)10.

1.1.2 Sistem de numere zecimale pentru orice sistem de numere:

Orice număr din sistemul zecimal poate fi schimbat în orice alt sistem de numere, împărțindu-l în mod continuu la baza sistemului de numere cerute și apoi scriind resturile după fiecare pas în ordine inversă.

Să luăm un exemplu de conversie a unui număr zecimal 235 la echivalentul său binar.

Tabelul următor arată procesul de conversie, așa cum s-a menționat mai sus.  

Tabelul 3.2.2 Reprezentarea binară a lui (235)10

→  Echivalentul binar al lui (235)10 este (11101011)2

1.1.3 Sistem hexazecimal:

Acest sistem este folosit pe scară largă în programarea microprocesorului. El facilitează reprezentarea mult mai scurtă a numărului în comparație cu cea obținută prin utilizarea sistemului de numere binare. Sistemul hexazecimal are baza 16 și este ușor de scris și de reținut numerele și literele, adică, de la 0 la 9 și de la A la F. Tabelul 3.2.3 prezintă numerele și literele utilizate în sistemul hexazecimal pentru reprezentarea unui număr.  

Tabelul 3.2.3 Numerele și literele utilizate în sistemul hexazecimal  

Exemplu: Să convertim numărul (235)10 în echivalent hexazecimal. Tabelul 3.2.4  arată conversia acestui număr zecimal.   

Tabelul 3.2.4 Conversia zecimală în hexazecimală  

Atunci, prin aranjarea hexazecimalelor în ordine inversă rezultă (EB)16. Astfel (235)10 = (EB)16.

1.1.4 Zecimal codat binar (BCD)

Codul BCD exprimă fiecare cifră a unui sistem zecimal prin echivalentul său nibble. Folosește șiruri binare pe 4 biți pentru a reprezenta cifrele de la 0 la 9. Figura 3.2.1 prezintă reprezentarea numărului 523 ca 0101 0010 0011 folosind sistemul BCD. Datorită schemei sale de reprezentare mai lungă, acum este foarte rar folosit în programarea micro-electronică. 

 Figura 3.2.1 Sistem de reprezentare BCD 

Exemplu: (235)10 poate fi reprezentat folosind BCD ca 0010 0011 0101.

2. Limbaj de programare de nivel scăzut 

Microprocesoarele recunosc numerele binare și operează în numere binare. Fiecare microprocesor are propriile sale cuvinte, semnificații și limbaje binare. Fiecare mașină are propriul set de instrucțiuni bazate pe modelul CPU al său. Limbajul binar este numit limbaj mașină. Cuvintele asemănătoare englezei sunt folosite pentru a reprezenta instrucțiunile binare ale unei mașini. Aceasta se numește program de limbaj de asamblare. Limbajele de scop general, cum ar fi BASIC, FORTRAN, C etc. sunt denumite  limbaje de nivel înalt. Limbajul mașină și limbajul de asamblare sunt totuși specifice unui microprocesor, prin urmare, acestea sunt denumite ca limbaje de nivel scăzut. 

2.1 Limbaj de asamblare 

În limbajul de asamblare, lungimea unui word-cuvânt este de aproximativ opt biți. Se numește byte-octet. Limbajul de asamblare poate avea 256 de combinații de octeți. Astfel, limbajul are 256 de cuvinte. Pot exista diverse tipare de octeți. Cu ajutorul porților logice electronice, aceste tipare dau un sens specific fiecărei combinații de octeți. Acestea sunt numite „instrucțiuni” . Instrucțiunile sunt formate dintr-un singur cuvânt sau mai multe cuvinte. Setul de instrucțiuni concepute în mașină alcătuiește limbajul mașinii care este specific pentru fiecare sistem bazat pe microprocesor, adică, microcomputer.  

Astfel putem spune:

Limbajul mașinii este mediul binar de comunicare printr-un set conceput de instrucțiuni specifice fiecărui computer.” 

Limbajul la nivel de asamblare este un mediu de comunicare cu un computer în care programele sunt scrise în mnemonică. Un limbaj de asamblare este specific unui computer dat. ' 

2.2 Programarea limbajului de asamblare 

Programarea limbajului de asamblare este scrisă în general folosind coduri hexazecimale. Programele pot fi scrise folosind o tastatură specială echipată cu taste hex. De asemenea, programele au instrucțiuni pentru a traduce aceste taste în tipar binar  echivalent lor. 

Datele și instrucțiunile sunt stocate în locații prescrise în memorie. Este scris un cod de operare care îndeplinește sarcina (sarcinile) propusă. Aceste sarcini sunt efectuate pe „operand” (i) prin codul operației. 8085 este un microprocesor de uz general tipic și are lungimea cuvântului pe 8 biți. Acum, să învățăm arhitectura, funcționarea și programarea lui. 

3. Arhitectura internă a microprocesorului 8085

3.1 Șirul de registre 

Microprocesorul 8085 este format din șase registre, un acumulator și un registru de marcaj. Arhitectura tipică este prezentată în figura 3.2.2. Există șase registre de uz general B, C,  D, E, H și L, fiecare având capacitatea de a stoca date pe 8 biți. Acestea sunt combinate ca BC, DE, HL pentru a efectua operațiuni pe 16 biți. În plus față de acest șir de registre, sunt furnizate două registre de 16 biți, adică, registrul de stive și contorul de program. Așa cum s-a discutat în prelegerea anterioară, „contorul de program” este folosit pentru a secvenția executarea instrucțiunilor. Întotdeauna indică adresa de memorie de la care urmează să fie adus următorul octet.  Stack Pointer indică locația memoriei în R/W (Citește și/sau scrie). De asemenea, este denumit ca „stivă”. 

Figura 3.2.2 Arhitectura microprocesorului 8085 

3.2 Acumulator 

Acumulatorul este un registru pe 8 biți (poate stoca date pe 8 biți). Este o parte a unității aritmetice/logice (ALU). În general, după efectuarea operațiilor logice sau aritmetice, rezultatul este stocat în acumulator. Acumulatorul este identificat și ca Registru A.

3.3 Marcaje

ALU din 8085 au cinci flip-flop-uri ale căror stări (set/reset) sunt determinate de datele de rezultat ale altor registre și acumulator.  Acestea sunt denumite ca flag (marcaje) Zero, Carry, Sign, Parity și Auxiliary-Carry.

Zero Flag (Z): Când o operație aritmetică are ca rezultat zero, flip-flop-ul numit marcaj Zero - este setat la 1.  

Carry flag (CY): după adunarea a două numere, dacă suma din acumulator este mai mare de opt biți, atunci flip-flop folosește pentru a indica un transport (carry), numit marcaj Carry  - este setat la 1.  

• S-Sign (S): este setat la 1, dacă bitul D7 al rezultatului = 1; altfel resetează. D7 este prima cifră a unui număr binar.

• P-Parity (P): dacă rezultatul are un număr par de 1, marcajul este setat la 1; pentru un număr impar de 1 marcajul este resetat.

• AC-Auxiliary Carry (AC): într-o operațiune aritmetică, atunci când un transport este generat de cifra D3 și trecut la cifra D4, este setat marcajul AC. În general, acest marcaj este utilizat intern pentru zecimale codate binar (BCD). 

Figura 3.2.2 prezintă un registru de marcaj pe 8 biți, adiacent acumulatorului. Nu este utilizat ca registru. Din opt poziții de biți, cinci poziții sunt utilizate pentru a stoca ieșirile a cinci flipflop-uri.

Aceste marcaj joacă un rol important în procesul decizional al microprocesorului. 

3.4 Registrul/decodorul de instrucțiuni 

Înainte de executarea unei instrucțiuni, aceasta este trimisă la Registrul de Instrucțiuni. Registrul de Instrucțiuni stochează instrucțiunea curentă a oricărui program. Decodorul ia instrucțiunea din memorie, o decodează și apoi o trece la următoarea etapă.

3.5 Registrul de adrese de memorie 

Registrul de adrese de memorie (MAR) deține adresa următoarei instrucțiuni care urmează să fie executată.

3.6 Generator de control 

În microprocesor, Generatorul de control generează un semnal care execută operațiunile conform cu instrucțiunile decodate. De fapt, creează un semnal (informație) care are detalii despre conexiunile dintre diferite blocuri ale microprocesorului, astfel încât  datele să ajungă la locul respectiv.

3.7 Selectorul de registru 

Selectorul de registru este practic un controler logic care direcționează comutarea între diferite registre ale microprocesorului. 

3.8 Registre de uz general 

Microprocesorul are câteva registre suplimentare care pot fi utilizate pentru a stoca date suplimentare în timpul unui program. 

4. Programare în 8085 

Așa cum am menționat în secțiunea de mai sus, o substituire simplă și foarte eficientă la codurile binare ar putea fi folosirea cuvintelor standard în engleză pentru a finaliza orice sarcină. De exemplu, adunarea a două numere poate fi reprezentată de ADD.  Astfel de coduri sunt denumite coduri mnemonice (abrevieri ale instrucțiunilor) iar acel limbaj se numește limbaj de asamblare. Majoritatea procesoarelor timpurii, inclusiv 8085, sunt programate folosind mnemonice. Dar, codurile limbajului de asamblare ar trebui convertite într-unul binar, astfel încât microprocesorul să poată identifica instrucțiunile date. Această operație este făcută de Assembler. În limbajul de asamblare, instrucțiunile sunt compuse din două segmente care sunt următoarele: 

1. Cod de Operație (Op): El depinde de care operație este de realizat. De exemplu for operația OR, avem Op Code “OR”.  

2. Operanzi: operandul este obiectul pe care trebuie să se efectueze operațiunea necesară. Operațiile, în general, sunt făcute pe date stocate în registre.

4.1 Clasificarea instrucțiunilor: 

• Transfer de date

• Aritmetice

• Logice

• Controlul programului 

4.1.1 Transfer de date 

1. Load: Citește conținut din locația de memorie specificată și o copiază în locația registrului specificat în CPU. 

2. Store: Copiază conținutul unui registru specificat în locația de memorie specificată.

4.1.2 Aritmetică

1. Add: Adăugă conținut al unei locații de memorie specificate la datele dintr-un anumit registru.

2. Decrement: scade 1 din conținutul locației specificate.

3. Compare: indică dacă conținutul unui registru este mai mare, mai mic sau egal cu conținutul locației de memorie specificate. 

4.1.3 Logică

1. AND: Instrucțiunea efectuează operațiunea logică AND cu conținutul locației de memorie specificate și a datelor dintr-un registru. Numerele sunt făcute AND bit cu bit. 

2. OR: Instrucțiunea efectuează operațiunea logică OR cu conținutul locației de memorie specificate și datele dintr-un registru. Numerele sunt făcute OR bit cu bit. 

3. Logical Shift: Instrucțiunea de schimbare logică presupune mutarea unui model de biți în registru într-un loc la stânga sau la dreapta, mutând un zero la capătul numărului. 

4.1.4 Controlul programului: 

1. Jump: Această instrucțiune schimbă secvența în care se efectuează pașii programului. În mod normal, contorul de program  determină realizarea secvențială a programului într-o secvență numerică strictă. Dar, JUMP determină contorul de program să sară la o altă locație specificată din program. 

2. Branch: Aceasta este o instrucțiune condițională care poate „ramifica” dacă rezultă „zero” sau „ramifică” dacă rezultă „plus” la o operațiune. Branch a urmat, de asemenea, dacă apar condiții corecte în procesul de luare a deciziilor. 

3. Halt: Această instrucțiune oprește toate activitățile ulterioare ale microprocesorului.

4.2 Exemplu: Deși conceptul de bază rămâne același, totuși, codurile Op pot fi diferite pentru diverse microprocesoare. Un exemplu de program pentru 8085 este următorul. 

1. Adăugați un număr de 8 biți 16F la Acumulator                                       ADI16F 

2. Adunați conținutul Registrului D la Acumulator                                      ADD D 

3. Extrageți un număr de 8 biți 32H de la Acumulator                             SUI 32H

4. Extrageți conținutul Registrului B de la Acumulator                               SUB B

5. Incrementați conținutul Registrului D cu 1                                                   INR D 

6. Scădeți conținutului Registrului C cu 1                                                           DCR C 

7. Încărcați un număr de 8 biți 15H în registrul D                                 MVI D, 15H 

8. Copiați din Registrul B în Registrul C                                                           MOV C, B 

4.3 Eșantion de program

Scrieți instrucțiunile pentru a încărca două numere hexazecimale 36B și 419 în registrele C, respectiv D. Adunați numerele și stocați rezultatul în locația de memorie B244D. 

Cod de abreviere a instrucțiunilor:

MVI C, 36B // Registrul de încărcare C cu 36B

MVI D, 419 // Registrul de încărcare D cu 419

ADD D        // Adunați doi octeți și salvați suma în C

STA B244D // Stocați suma în locația de memorie B244D

HLT            // Termină