Sunteți pe pagina 1din 164

Microprocesoare Indrumar de laborator

Dan NICULA Alexandru PIUKOVICI August, 1999


1

Radu GAVRUS

TRANSILVANIA Email: nicula@vega.unitbv.ro

1 Universitatea

Braov, s

Catedra

de

Electronic a

i s

Calculatoare,

Prefat a
Prima parte a laboratorului cuprinde aplicatii cu macheta didactic MPF1-B Microprofessor, a echipat cu microprocesor Z80. Lucrrile propuse au mai multe scopuri: a a Exersarea unui limbaj de asamblare prin studierea tipurilor de instructiuni, modurilor de adresare i a modului de transformare a instructiunilor de asamblare cod main. s n s a Studierea unei scheme minimale a unui sistem cu microprocesor i a modului de ins terfatare dintre microprocesor, memorie i periferice. s Studierea microprocesorului ca sistem digital prin vizualizarea cu osciloscopul i analis zorul logic a semnalelor generate de acesta. Partea a doua a laboratorului particularizeaz informatiile generale dob a ndite la cursul de Microprocesoare pentru familia de microprocesoare Intel 80x86. S necesare dou justicri: nt a a De ce 80x86? Pentru c microprocesoarele compatibile Intel 80x86 echipeaz majoritatea a a calculatoarelor personale existente prezent pe piat. Calculatoarele cu microprocen a soare 80x86 pot rula trei sisteme de operare foarte rsp a ndite: DOS, Windows, Linux. Aplicatiile care ruleaz pe aceste calculatoare necesit de multe ori module scrise lim a a n baj de asamblare. Totodat, un numr mare de alte sisteme digitale (plci de achizitie i a a a s prelucrare de date, sisteme de automatizare i control) contin microprocesoare din aceast s a familie. De ce 8086 i nu ultima generatie Intel? Pentru c aceste lucrri de laborator au scopul s a a de a prezenta elementele de baz ale utilizrii unui microprocesor i de a oferi teme pentru a a s exersarea programrii limbaj de asamblare. Procesorul 8086 reprezint un standard a n a al arhitecturilor 80x86. Folosirea facilitilor existente la cei mai noi membrii ai familiei at (gestiunea memoriei, multitasking, instructiuni multimedia) va tratat la disciplinele a Aplicatii ale calculatoarelor, Sisteme de operare i Multimedia. s

Ce este un sistem cu microprocesor? Un sistem cu microprocesor, deseori numit calculator, contine trei mari blocuri constitutive, conectate aa cum se prezint gura 1. Aceste blocuri s s a n nt: Unitatea central de prelucrare, microprocesorul (Central Processing Unit - CP U ); a Memoria; Dispozitivele de intrare/ieire (Input/Output = I/O). s

Unitatea central de prelucrare implementat sub forma unui chip microprocesor, este a a piesa central a oricrui sistem de calcul. CP U realizeaz prelucrri numerice (adunri, a a a a a

2
Bus de adrese

CPU Microprocesor

Memorie

Dispozitive I/O

Bus de date

Bus de control

Figura 1: Schema bloc a unui sistem cu microprocesor. scderi, a nmultiri, etc.) i operatii logice asupra uxului de date. Operatiile realizate s de CP U s controlate printr-o secvent de instructiuni grupate nt a ntr-un program. Programele i datele s s nt nmagazinate memorie. CP U citete c o instructiune din n s te memorie, o decodic i apoi o execut. procesul de executie, CP U poate citi/scrie as a In date din/ memorie. Un microprocesor se structureaz dou blocuri functionale: calea n a n a de date i calea de control. Elementele esentiale din calea de date s registrele i unitatea s nt s logico-aritmetic (Arithmetic Logic Unit = ALU ). a Registrele reprezint locatii de memorie temporare aate interiorul CP U . Registrele s a n nt e dedicate (program counter, status register), e generale. Unitatea logico-aritmetic este unitatea care realizeaz prelucrarea efectiv a datelor. Oa a a peratiile realizate de ALU s e logice (operanzi interpretati ca o multime de biti), e nt aritmetice (operanzi interpretati ca numere exprimate baza doi). n Calea de control coordoneaz activitatea microprocesorului i realizeaz secventialitatea exea s a cutiei programelor. Circuitele din calea de control decodic instructiunea i lanseaz a s a comenzi pentru unitile interne i externe scopul executrii acesteia. at s n a Memoria nmagazineaz programele i datele. Programul de initializare i gestionare a resura s s selor sistemului (monitor, sistem de operare) este mentinut ntr-o memorie ROM. Restul spatiului de memorie este ocupat de memorie RAM. Dispozitivele de intrare/ieire denumite i periferice, reprezint mijloacele de comunicare s s a ale microprocesorului cu lumea exterioar. Tastatura, monitorul sau imprimanta s a nt controlate de ctre CP U prin intermediul porturilor de intrare/ieire. a s Magistralele de adrese, date i control interconecteaz unitatea central cu memoria i s a a s dispozitivele I/O. Pe bus-ul de date se transfer bidirectional informatii codicate binar, a interpretate ca date sau ca instructiuni. Bus-ul de adrese unidirectional este folosit de CP U pentru a transmite adrese ctre memorie i dispozitive I/O. Pe bus-ul de control a s se transmit comenzi de la CP U spre memorie i spre dispozitivele I/O. s Intreruperile s situatii care microprocesorul si suspend executia secvential a progrant n a a mului pentru a deservi apelul venit de la un periferic. De obicei, ntr-un sistem exist a mai multe dispozitive care pot lansa cereri de ntrerupere. Pentru a putea servite toate, ntreruperile trebuiesc ierarhizate prin asocierea unor prioriti. at

3 Accesul direct la memorie (Direct Memory Access - DM A) reprezint o solutie de transfer a rapid a datelor de la un periferic memorie fr ca acestea s mai treac prin micron aa a a procesor. Prin utilizarea DM A, CP U pred controlul magistralelor ctre un dispozitiv a a periferic care controleaz transferarea datelor direct memoria sistemului. a n Modurile de adresare reprezint totalitatea modalitilor de determinare a adreselor pentru a at accesarea memoriei externe.

Contributia autorilor este urmtoarea: a Dan Nicula (coordonator) - Partea a II-a, Lucrrile 6, 7, 8, 9, 10, 11 i anexele a s Alexandru Piukovici - Partea I, Lucrrile 1, 2 i 3 a s Radu Gvru - Partea I, Lucrrile 4 i 5 a s a s

Fiierele cu programele propuse ca exemple cadrul laboratoarelor pot accesate prin ftp s n anonim de la adresa ftp://vega.unitbv.ro/pub/microp. Orice fel de observatie referitoare la acest ndrumar poate fcut prin e-mail nicula@vega.unitbv.ro. a a

Cuprins
I Microprocesorul Z80 7
9 23 33 43 55

1 Prezentarea machetei cu microprocesor Z80 2 Vederea programatorului asupra procesorului Z80 3 Aajul i tastatura MPF1-B s s 4 Aplicatii cu circuitul Z80-PIO 5 Aplicatii cu circuitul Z80-CTC

II

Microprocesorul 8086

69
71 93 105 117 133 141

6 Arhitectura i organizarea microprocesorului 8086 s 7 Programarea limbaj de asamblare 8086 n 8 Declararea datelor i a segmentelor s 9 Programarea cu ntreruperi software 10 Notiuni avansate de programare limbaj de asamblare n 11 Teme de programare limbaj de asamblare n

III

Anexe

145
147 157

A Utilizarea Turbo Debugger B Schemele machetei MPF1-B microprofessor

CUPRINS

Partea I Microprocesorul Z80

Lucrarea 1 Prezentarea machetei cu microprocesor Z80


Aceast lucrare prezint microprocesorul Z80 i sistemul MPF1-B Microprofessor. S prezena a s nt tate functiile tastelor, facilitile oferite de programul monitor, harta memoriei i adresele por at s turilor de comand. a

1.1

Microprocesorul Z80

Microprocesorul Z80 este un procesor pe 8 biti (unitatea logico-aritmetic accept operanzi a a reprezentati pe 8 biti). Magistrala de date este de 8 biti iar magistrala de adrese de 16 biti 16 (spatiul de memorie este de 2 = 64KB). Setul de instructiuni contine 158 de instructiuni. Microprocesorul Z80 are urmtoarele caracteristici: a genereaz semnalul de refresh pentru memoria DRAM; a are un pin pentru primirea unei ntreruperi nemascabile; implementeaz un mecanism de tratare a a ntreruperilor vectorizate; contine un set dublu de registre; setul de instructiuni contine instructiuni pentru adresarea indexat a memoriei; a setul de instructiuni contine instructiuni pentru prelucrarea unor blocuri de date din locatii adiacente de memorie. Din familia Z80 fac parte urmtoarele circuite specializate: a controler de port paralel Z80-PIO; controler de port serial Z80-SIO; controler DMA; circuit timer Z80-CTC. 9

10

LUCRAREA 1. PREZENTAREA MACHETEI CU MICROPROCESOR Z80

Z80 poate functiona i cu porturi de la alte familii de microprocesoare: s I8255 - interfat paralel cu trei porturi; a a I8251 - interfat serial cu dou porturi. a a a Structura intern a procesorului Z80 este prezentat gura 1.1. a a n

BUS DATE BUFFER DATE ALU F F

B D H
Machine Cycle 1 Memory Request I/O Request Write Read Refresh Maskable Interrupt Unmaskable Interrupt Bus Request Bus Acknowledge Clock Reset Halt Wait

C E L

B D H

C E L

TEMP2 TEMP1 A A

Bus Intern

IFF1 IFF2 MOD

IR W Z R I IX IY SP PC BUFFER ADRESE

Circuit de comanda si control

BUS ADRESE

Figura 1.1: Structura intern a microprocesorului Z80. a

1.1.1

Registrele procesorului

Registre specializate Registrele din aceast categorie au roluri bine determinate cadrul procesorului, av i unele a n nd s sarcini implicite: PC - Program Counter (16 biti) utilizat pentru memorarea adresei instructiunii care urmeaz a executat; a a SP - Stack Pointer (16 biti) utilizat pentru memorarea adresei v rfului stivei. Stiva crete s spre adrese mici;

1.1. MICROPROCESORUL Z80

11

IR - Instruction Register (8 biti) registru invizibil pentru programator, folosit pentru memorarea codului instructiunii curente; A - Accumulator (8 biti) utilizat ca registru implicit multe operatii aritmetice i logice, n s A - registru secundar; F - Flag Register (8 biti) utilizat pentru memorarea indicatorilor de stare. Structura cuv ntului de stare este prezentat tabelul 1.1: a n 7 6 S Z 5 4 3 X H X 2 1 0 P N C

Tabelul 1.1: Structura registrului de stare i indicatori. s Semnicatia bitilor din cuv ntul de stare este urmtoarea: a S - Sign este setat dac rezultatul unei operatii aritmetice este negativ; a Z - Zero este setat dac rezultatul unei operatii aritmetice este zero; a H - Half Carry este setat dac exist semitransport, de la bitul 3 la bitul 4 (se a a folosete la corectia zecimal DAA); s a P/V - Parity/Overow este setat dac numrul de biti de valoare 1 din cuv a a nt este par (pentru paritate), sau dac exist o depire de domeniu (pentru operatii a a as aritmetice); N - Name of the last operation este setat dac ultima operatie a fost adunare (india cator folosit pentru instructiunea DAA); C - Carry este setat dac exist transport de la bitul cel mai semnicativ (MSB); a a X - bit a crui valoare nu conteaz. a a R - Refresh Register (7 biti) utilizat pentru memorarea adresei de refresh; I - Interrupt Register (8 biti) utilizat pentru identicarea sursei care a cauzat ntreruperea (utilizat modul 2 de n ntreruperi, IM2). Registre de uz general Registrele din aceast categorie au rolul de a pstra datele imediata vecintate a ALU pentru a a n a a putea accesate i prelucrate rapid: s B, C - registre generale de c 8 biti care se pot accesa prin intermediul unor instructiuni te ca un registru dublu de 16 biti numit BC; D, E - registre generale de c 8 biti care se pot accesa prin intermediul unor instructiuni te ca un registru dublu de 16 biti numit DE; H, L - registre generale de c 8 biti care se pot accesa prin intermediul unor instructiuni te ca un registru dublu de 16 biti numit HL. Aceste registre se folosesc, anumite instructiuni, n pentru adresare indirect; a IX, IY - registre index de c 16 biti utilizate la adresare indexat; te a

12

LUCRAREA 1. PREZENTAREA MACHETEI CU MICROPROCESOR Z80 B, C, D, E, H, L - registre secundare al cror continut se poate interschimba cu a continutul registrelor B, C, D, E, H, L prin executarea instructiunii EXX.

Registre de manevr a Registrele din aceast categorie s invizibile pentru programator, ind folosite de ctre proa nt a cesor ca locatii de memorie temporare: W, Z - registre de c 8 biti care se pot accesa i ca un registru dublu de 16 biti numit te s WZ, utilizat de ctre procesor pentru memorarea adreselor salturilor neconditionate; a T - Temporar Register utilizat de ctre procesor pentru diverse instructiuni; a DB - Data Buer registru tampon bidirectional de 8 biti utilizat la interfata dintre pro cesor i lumea exterioar; s a AB - Address Buer registru de 16 biti care izoleaz magistrala de adrese intern de cea a a extern. a

1.1.2

Circuite de comand i control as

Circuitele de comand i control au functia de a genera exterior semnalele de comand de as n a la procesor i de a gestiona modul de lucru cu s ntreruperile. Alturi de registrul IR care se a n memoreaz codul instructiunii care se execut, circuitele de comand mai contin: a a a IFF1, IFF2 - bistabile de validare/inhibare a ntreruperilor; MOD - registru de 2 biti utilizat pentru memorarea modului de ntrerupere activ la un moment dat: IM0, IM1, IM2. Semnalele de intrare i ieire ale circuitelor de comand i control s prezentate gura 1.1. s s as nt n

1.1.3

Unitatea aritmetic i logic as a

Unitatea aritmetic i logic este de 8 biti. Operatiile aritmetice executate s a s a nt: adunare, scdere, incrementare i decrementare. Operatiile logice executate s a s nt: OR, AND, XOR, NOT, comparare (la nivel de bit). Procesorul poate executa i operatii cu un singur operand, s deplasri i rotiri. Odat cu generarea rezultatului operatiei aritmetice/logice se seteaz i a s a a s indicatorii din registrul de indicatori F .

1.1.4

Ciclurile procesorului

Denirea celor trei ciclii ce caracterizeaz functionarea procesorului este prezentat gura a a n 1.2. Aceti ciclii s s nt: Ciclul de ceas (Clock Cycle - CC) are durata perioadei semnalului de ceas. Ciclul main (Machine Cycle - MC) este format din unul sau mai multi ciclii de ceas. Pe dus a rata unui ciclu main se desfoar o activitate intermediar, bine denit, cu o nalitate s a as a a a clar. a

1.2. MACHETA DE LABORATOR MPF1-B MICROPROFESSOR

13

Ciclul instructiune (Instruction Cycle - IC) este format din unul sau mai multi ciclii main. s a Pe durata unui ciclu instructiune se desfoar toate actiunile legate de executia unei as a instructiuni. Ciclurile main ale procesorului Z80 s s a nt: citirea codului operatiei (Fetch - M1); citirea unui operand din memorie (Read); scrierea unui operand memorie (Write); n citirea unui operand dintr-un port (In); scrierea unui operand ntr-un port (Out); ciclul intern; acceptarea cererii de ntrerupere; acceptarea cererii de magistrale.
Ciclul clock

T1

T2 Ciclul masina (FETCH)

T3

T4

T1

T2 Ciclul masina (READ)

T3

Ciclul instructiune

Figura 1.2: Ciclul instructiune pentru o operatie de citire din memorie.

1.2
1.2.1

Macheta de laborator MPF1-B Microprofessor


Descriere hardware

Macheta didactic MPF1-B Microprofessor contine un sistem cu microprocesor Z80. Frecventa a semnalului de ceas este de 1.79 MHz. Sistemul dispune de dou tipuri de memorie: o memorie a ROM de capacitate 6 KB, care s n nt nscrise programele productorului, i o memorie RAM a s de capacitate 2 KB. Sistemul mai are posibilitatea de extindere a memoriei, av rezervat nd pentru aceasta un spatiu de 8 KB. Zona de memorie ROM se ntinde ntre adresele 0000H 17FFH. Sistemul dispune de un program monitor care este nscris EPROM-ul U6 i ocup n s a spatiul 0000H - 0FFFH. De la adresa 0800H este stocat un program de transfer ntre un calculator compatibil IBM PC i macheta de laborator MPF1-B. Memoria RAM este de tip static s (deci nu are nevoie de re mprosptarea informatiei) i ocup zona 1800H - 1FFFH. Conform a s a

14

LUCRAREA 1. PREZENTAREA MACHETEI CU MICROPROCESOR Z80

specicatiilor tehnice ale MPF1-B, 80 de octeti din memoria RAM (1FAFH - 1FFFH) s nt folositi de programul monitor. Se recomand ca acest spatiu s nu se efectueze a n a nscrieri. Spatiul rezervat pentru extindere (2000H - 3FFFH) poate ocupat cu un alt EPROM sau cu o memorie RAM de tip static. Harta memoriei poate congurat cu ajutorul unor jumperi (JP3, JP4, JP5) aati pe machet, a a conform tabelului 1.2. U6 U7 JP3 JP4 JP5 4K (0000H - 0FFFH) 4K (2000H - 2FFFH) 2 - 3 2 - 1 2 - 3 4K (0000H - 0FFFH) 8K (2000H - 3FFFH) 2 - 3 2 - 3 2 - 1 6K (0000H - 1FFFH) 8K (2000H - 3FFFH) 2 - 1 2 - 3 2 - 1 Tabelul 1.2: Congurarea memoriei. gura 1.3 este prezentat harta memoriei sistemului MPF1-B. In a
3FFF SPATIU REZERVAT PENTRU EXTINDERE 2000 1FFF U7

ROM/RAM 8K

RAM DISPONIBIL

U8

RAM 2K

UTILIZATORULUI 1800 17FF 0800 PROGRAM DE U6 TRANSFER PROGRAM MONITOR


PAM

ROM 6K

0000

Figura 1.3: Harta memoriei sistemului MPF1-B. Sistemul dispune de trei circuite specializate care folosesc porturi de intrare/ieire. Interfata s paralel PIO dispune de dou porturi paralele (16 biti) i ocup urmtoarele adrese: a a s a a 80H - portul A; 81H - portul B; 82H - controlul portului A;

1.2. MACHETA DE LABORATOR MPF1-B MICROPROFESSOR 80H - controlul portului B. Circuitul counter/timer CTC ocup urmtoarele adrese: a a 40H - canalul 0; 41H - canalul 1; 42H - canalul 2; 43H - registrul de control.

15

Al treilea circuit de care dispune sistemul este interfata paralel programabil 8255 din familia a a Intel. Aceasta are un total de 24 linii paralele care s folosite la scanarea tastaturii i la nt s controlul aajului. Adresele ocupate de acest circuit s s nt: 00H - portul A; 01H - portul B; 02H - portul C; 03H - registrul de control. Portul A are bitii conectati astfel: - bitul 7 - la intrarea de citire de la un dispozitiv de stocare magnetic; a - bitul 6 - la tasta User Key activ stare low; a n - bitii 5-0 - la ase r s nduri ale tastaturii. Portul B controleaz cele 7 segmente i punctele aajului. Toti bitii de ieire s activi a s s s nt n stare high. Portul C are bitii conectati astfel: - bitul 7 - la ieirea de scriere a unui dispozitiv de stocare pe band magnetic; s a a - bitul 6 - la tasta [MONI]; - bitii 5-0 - la ase coloane ale tastaturii i ale aajului. Bitul 0 corespunde primei cifre de la s s s dreapta, iar bitul 5 primei cifre de la st nga. Toti bitii s activi stare high. nt n Portul C mai este conectat i la difuzorul de pe machet i la led-ul TONE-OUT. Led-ul este s as aprins c ieirea este 0 logic. Aajul este format din 6 celule cu 7 segmente. Tastatura nd s n s contine 36 taste din care 19 corespund anumitor functii, 16 reprezint cifrele sistemului de a numrare hexazecimal i o tast pe care poate denit de ctre utilizator. Ceasul sistemului a s a a a este generat cu ajutorul unui oscilator cu cristal de cuart cu frecventa de 3, 58M Hz. Acest semnal este divizat i apoi aplicat la intrarea de ceas a microprocesorului Z80. s Initializarea sistemului se poate face dou moduri. Primul mod este punerea sub tensiune, n a caz care au loc urmtoarele actiuni: n a 1. Bistabilul de activare a ntreruperilor este resetat (IF F = 0); 2. Registrul de ntreruperi este resetat (I = 0); 3. Modul de ntreruperi este setat cu valoarea zero (M OD = 0);

16

LUCRAREA 1. PREZENTAREA MACHETEI CU MICROPROCESOR Z80 4. Registrul PC este arcat cu valoarea 1800H; nc 5. Registrul SP este arcat cu valoarea 1F9FH; nc 6. Se elimin punctele de oprire setate de utilizator; a 7. Adresa rutinei de tratare a ntreruperilor este setat la valoarea 0066H (aceast adres se a a a memoreaz la adresele 1FFEH i 1FFFH); a s 8. Semntura machetei, uPF-1, va dela pe aaj. a s

Al doilea mod de initializare este prin activarea tastei de reset [RS]. acest caz, au loc actiunile In de la punctele 1-5. Rutina de tratare a ntreruperilor i punctele de oprire rm neafectate, s a n iar semntura machetei nu mai deleaz pe aaj. a a s

1.2.2

Descriere software

Sistemul dispune de un program monitor care permite introducerea programelor de la tastatur, a vericarea i rularea lor pas cu pas. s Tastele i semnicatia acestora este prezentat tabelul 1.3. s a n Operatii de baz a Initializarea sistemului se face prin apsarea tastei de reset [RS]. Examinarea i modicarea a s datelor din memorie se realizeaz folosind tastele adrese [ADDR] i date [DATA]. Pentru veria s carea unei date din memorie se tasteaz [ADDR] i adresa la care se gsete data respectiv. a s a s a La apsarea tastei [ADDR] vor aprea 4 puncte dreptul primelor 4 cifre din st a a n nga aajului s (cifrele care reprezint adresa locatiei de memorie). Cele 4 puncte semnic faptul c este activ a a a c mpul de introducere a adresei. Cifrele care vor introduse, vor reprezenta adresa locatiei de memorie ce va accesat. Primele dou cifre din dreapta vor reprezenta data stocat la adresa a a a aat st s a n nga. Pentru vizualizarea datei de la adresa urmtoare se va tasta [+], iar pentru a vizualizarea datei de la adresa anterioar se va tasta [-]. Pentru modicarea datei de la adresa a aat trebuie ca punctele s se ae c s a a n mpul de date. Acest lucru se obtine aps tasta a nd [DATA]. momentul care punctele se a c In n a n mpul de date, se pot modica datele. Utilizatorul poate modica numai datele dintre adresele 1800H i 1FFFH (zona memoriei RAM). De s asemenea, utilizatorul trebuie s evite modicarea datelor stocate zona 1FA0H i 1FFFH, a n s deoarece aceast zon este folosit de programul monitor. a a a Examinarea i modicarea datelor stocate registre se face cu tastele [REG] i [DATA]. Pentru s n s vericarea continutului unui registru se apas tasta [REG] urmat de tasta pe care este a a nscris numele registrului (tastele de introducere a datelor). partea drept se aeaz numele In a s a registrului iar partea st a datele memorate. Registrele de 8 biti s grupate c dou n ng nt te a astfel: AF, BC, DE, HL i AF, BC, DE, HL, reprezentate cu puncte l a nume. Registrul s ng I i bistabilul de validare a s ntreruperilor s grupate nt mpreun. Pentru modicarea datelor, a se apas tasta [DATA], dup care apar dou puncte zona corespunztoare celui de-al doilea a a a n a registru (pozitiile 3-4). Dup ce se modic valoarea memorat, se apas tasta [+] i se trece a a a a s la pozitiile 1-2, corespunztoare primului registru. a Registrul de indicatori are o reprezentare particular. Sistemul MPF1-B decodic acest rega a istru i aeaz grupuri de 4 biti astfel: s l s a n

1.2. MACHETA DE LABORATOR MPF1-B MICROPROFESSOR Tast a [RS] [ADDR] [REG] [DATA] [PC] [+] [-] [STEP] [SBR] [CBR] [MONI] [GO] [INS] [DEL] [MOVE] [RELA] [TAPE WR] [TAPE RD] [INTR] [USER KEY] Semnicatie (ReSet) Semnal de initializare a sistemului (ADDRess) Introducerea unei valori c n mpul de adres a (REGister) Selectarea unui registru al crui continut este vizualizat a (DATA) Introducerea unei valori c n mpul de date Tranfer controlul programului la valoarea curent a registrului PC a a Incrementare valoare aat (dat sau adres) s a a a Decrementare valoare aat (dat sau adres) s a a a (STEP) Rularea unei instructiuni din programul utilizatorului (Set Break Point) Stabilete un punct de oprire programul s n utilizatorului (Clear Brak Point) Anuleaz punctul de oprire din programul a utilizatorului (MONItor) Terminarea programului curent i redarea controlului progras mului monitor (GO) Comand de lansare executie a programului aat memorie la a n n adresa aat pe display s a (INSert) Inserarea unui byte memorie n (DELete) Stergerea unui byte din memorie (MOVE) Copierea unui bloc de date dintr-un loc altul n (RELAtive) Calcularea i inserarea unei adrese relative pentru s instructiuni de salt (TAPE WRite) Scriere pe band magnetic (ieire serial) a a s a (TAPE ReaD) Citire de pe band magnetic (intrare serial) a a a (INTeRrupt) Semnal conectat la pinul de ntreruperi mascabile al procesorului Tast a crei semnicatie poate modicat de ctre utilizator a a a a Tabelul 1.3: Semnicatia tastelor sistemului MPF1-B. grupul S, Z, H - [S Z x H]; grupul P/V, N, C - [x P/V N C]. La apsarea tastei [PC] registrul PC se a n nscrie cea mai mic adres din RAM (1800H). a a Vericarea i rularea programelor pas cu pas s

17

Adresa de nceput a programului arcat memorie este stabilit prin apsarea tastei [ADDR]. nc n a a Dup aparitia adresei pe partea din st a nga a aajului, lansarea executie a programului se s n face prin apsarea tastei [GO]. Tasta [STEP] este similar tastei [GO], cu deosebirea c acest a a a n caz procesorul va executa o singur instructiune, dup care controlul este redat programului a a monitor. Programul monitor aeaz noua valoare a registrului PC. Utilizatorul poate modis a ca i verica registrele sau continutul memoriei la ecare pas. Tastele [GO] i [STEP] s s s nt functionale numai c aajul este format standard: Adres-Dat. Rularea unui program nd s n a a de dimensiuni mari pas cu pas consum mult timp. Pentru evitarea acestui lucru se poate a xa un punct de oprire program cu ajutorul tastei [SBR]. Astfel, programul se va executa n

18

LUCRAREA 1. PREZENTAREA MACHETEI CU MICROPROCESOR Z80

p a la acest punct, dup care se d controlul programului monitor. acest moment se pot n a a In vizualiza i modica date din memorie. Fixarea punctului de oprire se face aps tasta [SBR], s a nd atunci c este aat adresa la care se dorete xarea punctului de oprire. nd s a s Intr-un program se poate xa un singur punct de oprire, care este simbolizat prin aarea punctelor at zona s t n de adrese, c i zona de date a aajului. Nu este permis xarea unui punct de oprire t s n s a n zona memoriei ROM. Dac o instructiune are mai multi octeti, punctul de oprire trebuie xat a la primul octet al instructiunii, altfel vor aprea erori. a Eliminarea punctului de oprire se face aps orice moment tasta [CBR]. Dup apsarea a nd n a a cazul care un program se blocheaz acestei taste, pe aaj va aprea: [F.F.F.F.-F.F.]. In s a n a sau intr bucl innit, se poate apsa tasta [MONI] pentru ca sistemul s dea din nou a n a a a a controlul programului monitor. Pe display se va aa continutul registrului PC. De asemenea, s dup executia unei instructiuni HALT, se poate apsa tasta [MONI] pentru a reda controlul a a programului monitor, iar PC va lua valoarea adresei instructiunii urmtoare. a Functii pentru simplicarea utilizrii machetei a Transferarea unui bloc de memorie se face cu tasta [MOVE]. Operatia permite mutarea unui bloc de date dintr-o zon alta a memoriei. Succesiunea tastelor care trebuie apsate pentru a n a a muta blocul cuprins ntre adresele 1800H i 18FFH la adresa 1810H este prezentat tabelul s a n 1.4. Tast apsat a a a Aaj s Comentarii [MOVE] x.x.x.x.-s S semnic adresa de a nceput a blocului de date (Start) [1][8][0][0] 1.8.0.0.-s Adresa de nceput a blocului a fost xat la adresa a 1800H [+] x.x.x.x.-e E semnic adresa de sf sit a blocului de date (End) a r [1][8][F][F] 1.8.F.F.-e Adresa de sf sit a blocului a fost xat la adresa 18FFH r a [+] x.x.x.x.-d D semnic adresa de destinatie (Destination) a [1][8][1][0] 1.8.1.0.-d Adresa de destinatie a blocului a fost xat la adresa a 1810H [GO] 1810-x.x. Comanda executiv pentru mutarea blocului de date a Tabelul 1.4: Mutarea unui bloc de date memorie. n Stergerea unui byte de date se face cu ajutorul tastei [DEL]. Tasta este functional numai c a nd aajul este formatul standard Adres-Dat. Tasta se apas momentul care este aat s n a a a n n s a data de la adresa de unde se dorete tergerea. Toate datele de deasupra s translatate s s nt n jos cu o pozitie ( nspre adresele mici), iar la adresa 1DFFH se ncarc valoarea 00H. Zona de a memorie care se pot face tergeri este 1800H i 1DFFH. n s s Inserarea unui byte de date se face cu ajutorul tastei [INS]. Tasta este functional numai c a nd aajul este format standard Adres-Dat. Tasta se apas momentul care este aat s n a a a n n s a adresa la care se dorete inserarea datei respective. Succesiunea tastelor care trebuie apsate s a pentru a insera un byte memorie este prezentat tabelul 1.5. Continutul locatiilor de n a n memorie nainte i dup operatia de inserare este prezentat tabelul 1.6. s a n Zona de memorie care se pot face inserri este n a ntre 1800H i 1DFFH. La inserare, baitul de s la adresa 1DFFH se pierde.

1.2. MACHETA DE LABORATOR MPF1-B MICROPROFESSOR Tast apsat a a a [ADDR][1802] [INS] [3][3] Aaj s Comentarii 1.8.0.2.-22 Stabilete adresa dup care se dorete inserarea unui s a s byte 1803-0.0. La apsarea tastei de inserare se a nscrie 00 la adresa urmtoare a 1803-3.3. Se introduce valoare baitului inserat ( acest caz 33) n Tabelul 1.5: Inserarea unui byte memorie. n Adrese Date nainte de inserare Date dup inserare a 1800 00 00 1801 11 11 1802 22 22 1803 44 33 inserare 33H 1804 55 44 1805 66 55 Tabelul 1.6: Continutul memoriei la inserarea unui byte.

19

Calculul adresei relative, necesare instructiunilor JR i DJNZ, se poate face cu ajutorul tastei s [RELA]. Se consider cazul unei instructiuni JR aat memorie la adresa 1800H. Saltul a a n trebuie fcut la adresa 1804H. Succesiunea tastelor care trebuie apsate este prezentat a a a n tabelul 1.7. Instructiunea JR de la adresa 1800H are doi baiti. Dup executia acesteia, registrul a PC are valoarea 1802H. Rezult c pentru a face saltul la adresa 1804H, PC ar trebui a a nsumat cu 02H. Intreruperea unui program Intreruperile nemascabile s folosite numai de programul monitor. Pinul 16 al procesorului nt (INT) este conectat la tasta [INTR]. La executia codului din programul monitor de la adresa 0038H controlul este transferat rutinei care ncepe la adresa stocat locatiile 1FFEH i a n s 1FFFH. timpul acestui proces, starea procesorului este afectat. Continutul original de In a la adresele 1FFEH i 1FFFH este 0066H. Instructiunea de la adresa 0038H este executat s a n urmtoarele situatii: a 1. Este acceptat o a ntrerupere de mod 1; 2. Se execut instructiunea RST 38H (cod FFH); a 3. Magistrala de date este trecut 1 logic. Dac o a n a ntrerupere de mod 0 este acceptat a fr vector de aa ntrerupere, se execut instructiunea RST 38H; a 4. C un program nd ncearc s sar la o adres inexistent. a a a a a Dac nu se modic adresa memorat locatiile 1FFEH i 1FFFH, efectul executrii instructiunii a a a n s a de la adresa 0038H este acelai cu cel produs de apsarea tastei [MONI], sau de atingerea s a

20

LUCRAREA 1. PREZENTAREA MACHETEI CU MICROPROCESOR Z80 Tast apsat a a a Aaj s Comentarii [RELA] x.x.x.x.-s Se introduce adresa de start, adic adresa la care se a a a instructiunea JR [1][8][0][0] 1.8.0.0.-s Adresa instructiunii de salt este, acest caz, 1800H n [+] x.x.x.x.-d Se introduce adresa de destinatie, adic adresa la care a se face saltul [1][8][0][4] 1.8.0.4.-d Adresa la care se face saltul este, acest caz, 1804H n [GO] 1801-0.2. Sistemul MPF1-B prelucreaz valorile introduse i ina s troduce numrul relativ cu care se face saltul la adresa a ce urmeaz instructiunii JR. acest caz, de la 1801H a In la 1804H s 2 baiti (JR ocup 2 octeti de la adresele nt a 1800H i 1801H) s Tabelul 1.7: Calculul unei adrese relative de salt.

unui punct de oprire program. Utilizatorul poate s-i deneasc propria rutin de servire n as a a modic continutul locatiilor 1FFEH i 1FFFH. nd s Instructiunea RST 30H are acelai efect cu cel al unui punct de oprire. Se numete software s s break deoarece nu implic partea hardware. De obicei, este folosit la sf a a rsitul unei aplicatii utilizator. De asemenea, se utilizeaz atunci c se dorete stabilirea mai multor puncte de a nd s oprire ntr-un program. La ecare oprire a aplicatiei utilizator, programul monitor veric valoarea memorat reg a a n istrul SP. Dac stiva programului utilizatorului se suprapune peste cea de sistem, se semnala izeaz o eroare prin aparitia pe aaj a mesajului: [SYS-SP]. a s

1.2.3

Program de transfer ntre PC i MPF1-B s

Editarea programului surs a Fiierul surs se poate edita cu orice editor de texte (NCEDIT, EDIT). Se recomand folosirea s a a editorului CWE.EXE deoarece acesta contine meniuri specice editrii unui cod surs Z80 i a a s ofer posibilitatea consultrii interactive a unei documentatii referitoare la setul de instructiuni a a i directivele de asamblare Z80. s Codul surs trebuie s a a nceap obligatoriu cu directiva ORG care specic adresa de memorie a a unde se va plasa programul transferat pe machet. Zona de memorie RAM este 1800H - 1FFFH. a Se recomand arcarea programului a nc ncep cu adresa 1800H. nd Prelucrarea programului surs a Asamblarea ierului surs <lename.s> se face cu comanda: s a asm800 <lename.s> -s asm816 -l-o <lename.o> Rezultatul asamblrii const obtinerea ierelor obiect <lename.o> i listing <lename.l>. a a n s s Link-editarea ierului obiect <lename.o> se face cu comanda: s

1.2. MACHETA DE LABORATOR MPF1-B MICROPROFESSOR mlink <lename.o> -e 00000 -o <lename.bin> Rezultatul link-editrii const obtinerea ierului binar <lename.bin>. a a n s Conversia ierului binar <lename.bin> format Intel HEX se face cu comanda: s n mload <lename.bin> -i-o <lename.hex>

21

Rezultatul conversiei const obtinerea ierului format Intel hex <lename.hex>. Acest a n s n ier va arcat memoria RAM de pe machet, la adresa specicat prin directiva ORG. s nc n a a Prelucrarea automat a ierului surs, p a la obtinerea formatului hex, poate fcut prin a s a n a a lansarea executie a ierului batch XASM.BAT cu comanda: n s xasm < lename.s > Ca rezultat, se obtin ierele: s <lename.o> - ier obiect obtinut urma asamblrii; s n a <lename.l> - ier listing ce contine adresele i codul programului; s s <lename.bin> - ier binar obtinut urma link-editrii; s n a <lename.hex> - ier format Intel Hex care contine imaginea programului memorie. s n n Transferul programului de la PC la machet a Transferul programului ntre PC i macheta cu Z80 se face prin legtur serial s a a a ntre portul calculatorului PC COM1 i un pin al portului paralel 8255 al machetei. Etapele transferrii s a unui program ntre PC i machet s detaliate continuare. s a nt n 1. Se lanseaz executie programul de receptie de pe macheta cu Z80. Programul se a a n a memoria ROM la adresa 0800H. Ateptarea transferului de la PC este semnalizat pe n s a machet prin aparitia pe aaj a patru linii orizontale (_ _ _ _). a s 2. Se lanseaz executie programul de transmisie de pe PC cu comanda: a n comm <lename.hex> Inceperea transmisiunii este semnalizat prin aparitia pe aajul machetei a patru linii a s verticale (| | | |). Dac transferul s-a efectuat fr erori, pe aajul machetei va aprea mesajul Good. Altfel a aa s a v-a aprea un mesaj de eroare. a Executia programului utilizatorului Se introduce adresa de nceput a programului utilizatorului prin apsarea tastei [ADDR]. a Lansarea executie se realizez prin apsarea tastei [GO]. n a a

22

LUCRAREA 1. PREZENTAREA MACHETEI CU MICROPROCESOR Z80

1.3

Experimente

I. Urmriti pe schema machetei blocul de selectie a memoriei i explicati continutul tabelului a s 1.2. II. arcati urmtorul program memoria RAM a machetei: Inc a n Adres a 1800 1802 1803 1804 1805 1806 Cod main s a 3E00 3C 47 04 48 FB Instructiuni Z80 LD A, 0 INC A LB B, A INC B LD C, B EI

Justicati codul main plec de la instructiunile scrise limbaj de asamblare. s a nd n III. Rulati programul. Ce valori vor avea registrele A, B, C, la terminarea programului? IV. Executati programul pas cu pas. La ecare pas, vizualizati continutul registrelor A, B, C. V. Modicati programul astfel t, dup rulare, registrul C s contin valoarea 6. nc a a a VI. Editati codul pe un PC, utiliz editorul CWE.EXE. Asamblati programul i transferati-l nd s pe machet. Rulati programul transferat. a

Lucrarea 2 Vederea programatorului asupra procesorului Z80


Aceast lucrare prezint setul de instructiuni al microprocesorului Z80 i modul de utilizare a a a s machetei de laborator. Se vor exersa programe simple, care pot asamblate manual. Introducerea programelor se va face at manual c i prin transferul codului asamblat de la calculatorul t t s PC unde este conectat macheta. a

2.1

Moduri de adresare

Modul care operanzii s adui pentru a procesati de ctre microprocesor, calea pe care i se n nt s a comunic microprocesorului adresa la care se a stocat operandul cutat, se numete mod de a a a s adresare. Codul unei instructiuni trebuie s contin i informatii asupra a ceea ce are de fcut a as a instructiunea respectiv, nu numai adresa datelor implicate de aceasta. Adresarea registrelor, a a celulelor de memorie i a dispozitivelor de intrare/ieire difer esential. Microprocesorul Z80 s s a are urmtoarele registre simpli (de 8 biti): A, B, C, D, E, H, L. Adresele celor apte registre a s 16 pot codicate pe 3 biti. Spatiul de memorie adresabil este 2 = 64K. Pentru a adresa a o celul de memorie, este necesar o adres de 16 biti. Pentru adresarea unui dispozitiv de a a a intrare/ieire este necesar o adres de 8 biti. s a a Microprocesorul Z80 are 6 moduri de adresare, prezentate continuare. n Adresare imediat. Acest adresare este folosit ori de c ori corpul unei instructiuni a a a te nglobeaz i data care reprezint obiectul acelei instructiuni. as a Limbaj de asamblare LD A, 55H Cod main s a 3E55H

LD DE, 6AF5H

11F56AH

AND 8EH

E68EH

;^ncarc registrul A I a ;cu valoarea 55H. Data (55H) este un ;octet de sine stttor n c^mpul de a a ^ ;doi octeti ai instructiunii. ;^ncarc registrul dublu DE cu I a ;valoarea hexazecimal 6AF5H. a ;Data este un cuv^nt de doi octeti ;^n c^mpul celor trei ai instructiunii. ;Se execut o operatie logic ntre a a ^ 23

24

LUCRAREA 2. VEDEREA PROGRAMATORULUI ASUPRA PROCESORULUI Z80 ;continutul registrului acumulator ;i numrul 8EH. s a Adresare implicit. Aceast adresare este folosit dac toate informatiile necesare pena a a a tru localizarea datei care reprezint obiectul unei instructiuni s a nt ncorporate codul n acesteia. Limbaj de asamblare LD C, D Cod main s a 4AH

ADD HL, BC

09H

LD DE, 6AF5H

11F56A

;Transfer continutul registrului D n a ^ ;registrul C. At^t adresa initial a a ;datei c^t si adresa ei de destinatie ;s^nt specificate n octetul de cod ^ ;Continutul registrului dublu HL este ;adunat cu cel al registrului dublu BC, ;ambii operanzi se specific implicit, a ;^n octetul de cod. ;Operandul surs este adresat imediat, a ;iar operandul destinatie este adresat ;implicit, ca fiind n registrul DE. ^

Adresare indirect. Aceast adresare este folosit dac adresa unui operand este continut a a a a a ntr-un registru sau o locatie de memorie. Adresarea indirect prin memorie se folosete a s ntr-un singur caz: atunci c Z80 accept o nd a ntrerupere modul 2, adresa de n nceput a subrutinei de tratare a ntreruperii este determinat folosind aceast tehnic. a a a Limbaj de asamblare ADC (HL) Cod main s a 8EH

PUSH DE

D5H

LD A, (BC)

0AH

;Adun la acumulatorul numrul stocat a a ;^n memorie, la adresa continut n a ^ ;registrul dublu HL, iar apoi este ;adugat si valoarea bitului de a a ;transport. ;Continutul registrelor D si E este ;salvat n memorie la adresa urmtoare ^ a ;din stiv, ncep^nd cu registrul D. a ^ ;Adresa la care se face transferul este ;continut n indicatorul de stiv SP, a ^ a ;al crui continut este decrementat a ;dup fiecare transfer. a ;Se ncarc continutul registrului A, ^ a ;de la adresa continut n registrul a ^ ;dublu BC.

Adresare direct. Aceast adresare este folosit dac corpul unei instructiuni apare a a a a n adresa efectiv a operandului ce constituie obiectul instructiunii. Adresarea direct se a a folosete la instructiunile de transfer s ntre registre i memorie, precum i la instructiunile s s de salt. Limbaj de asamblare LD (1784H), A Cod main s a 328417H

;Transfer continutul acumulatorului a

2.1. MODURI DE ADRESARE

25 ;^n memorie, la adresa 1784H. Adresarea ;folosit este implicit pentru a a ;determinarea sursei (reg. A) si direct a ;pentru specificarea destinatiei (1784H). ;Transfer continutul acumulatorului a ;la dispozitivul de ieire s ;de la adresa 80H. Adresa sursei este ;specificat implicit iar cea a a ;destinatiei (portul cu adresa 80H) ;direct. ;Apel de subrutin. Continutul registrului a ;PC este salvat n stiva adresat de ^ a ;indicatorul de stiv SP, dup care se a a ;execut un salt la adresa de nceput a a ^ ;subrutinei (7778H).

OUT (80H), A

D380H

CALL 7778H

CD7877H

Adresare relativ. Aceast adresare este folosit dac adresa locatiei de memorie care a a a a n se gsete operandul se obtine adug o valoare la continutul curent al registrului PC. a s a nd Limbaj de asamblare JR +05H Cod main s a 1803H

;Execut un salt la adresa a ;care se calculeaz nsum^nd valoarea a ^ ;curent a registrului PC cu a ;valoarea (deplasamentul) inclus n a ^ ;c^mpul instructiunii.

Adresare indexat. Aceast adresare este folosit dac adresa unui operand se obtine a a a a adug un deplasament (indice) la un registru de baz (index). Z80 are dou registre a nd a a de 16 biti, IX i IY, care pot folosite ca registre de baz. Tehnica de adresare indexat s a a este ecient cazul care datele s organizate a n n nt ntr-un tabel. Consider c ecare nd a element din tabel ocup un octet i c adresa de a s a nceput (adresa de baz) a tabelului a se ncarc registrul index IX sau IY, atunci regsirea unei date dorite se poate face a n a specic ndu-i doar indicele. Limbaj de asamblare LD E, (IX+25H) Cod main s a DD5E25H

RES 7, (IY+69H)

FDCB69BEH

;Transfer un octet din memorie n a ^ ;registrul E. Adreasa celulei de memorie ;surs se obtine nsum^nd continutul a ^ ;registrului de baz IX si valoarea a ;deplasamentului +25H din c^mpul ;instructiunii. ;Sterge (^nscrie 0) bitul ;cel mai semnificativ al octetului din ;memorie, octet a crui adres se obtine a a ;^nsum^nd continutul registrului de baz a ;(index) IY si valoarea numeric (indice) a ;69H continut n c^mpul instructiunii. a ^ ;Instructiunea ocup 4 octeti, a ;din care trei octeti s^nt rezervati ;pentru cod.

26

LUCRAREA 2. VEDEREA PROGRAMATORULUI ASUPRA PROCESORULUI Z80

2.2

Instructiuni de transfer

Majoritatea operatiilor de tranfer de date se realizeaz cu ajutorul instructiunii LD. Operatiile a permit ca operanzii s e de 8 sau 16 bitii. Procesorul poate s execute dou instructiuni a a a pentru interschimbarea datelor din registre: EX i EXX. Pentru operatii cu stiva se pot folosi s instructiunile PUSH i POP, iar pentru transferul blocurilor de date, instructiunile LDx i s s LDxR. Instructiunile de transfer pot avea unul, doi sau nici un operand. De asemenea, aceste instructiuni mai pot clasicate dup sensul de transmitere a datelor i tipul operanzilor: a s

Tipul transferului registru <- registru registru <- memorie registru <- val. imediata memorie <- registru memorie <- memorie memorie <- val. imediata

Exemple LD A, B ; LD A, (HL) ; LD A, 25H ; LD (HL), A ; LDD ; LD (HL), 5BH

LD POP LD PUSH LDIR

HL, BC AF HL, 125BH BC

Modul de stocare a unei date pe 16 biti memorie este little endian (octetul mai putin n semnicativ este stocat la adresa mai mic). a

Adresa

Limbaj main s a

Limbaj de asamblare ORG 1800H

Comentarii ;directiv a ;necesar dac programul a a ;se transfer pe machet a a ;contorul operatiei LDIR ;adresa destinatiei ;adresa sursei ;se salveaz BC n stiv a ^ a ;se reface registrul BC ;^ntoarcere la programul ;monitor

1800 1802 1805 1808 180B 180C 180E 180F 1810

3E88 011000 112018 216600 C5 EDB0 C1 77 FF

LD LD LD LD PUSH LDIR POP LD RST

A, 88H BC, 10H DE, 1820H HL, 0066H BC BC (HL), A 38H

Instructiunea RST 38H este necesar la sf situl codului deoarece, dup terminarea programului, a r a acest fel, se pot verica datele controlul sistemului este preluat de programul monitor. In obtinute. Dac se vizualizeaz un registru care contine o dat pe 16 biti (adres) i se apas tasta [ADDR], a a a a s a sistemul va aa continutul memoriei de la adresa memorat tregistru. Re s a n ntoarcerea n programul utilizatorului se va face aps tasta [PC]. Instructiunea LDIR, ind o instructiune a nd repetitiv, va executat mai multi pai, astfel t utilizatorul poate urmri ce se mpl a a n s nc a nt a la ecare etap a instructiunii. a

2.3. INSTRUCTIUNI ARITMETICE SI LOGICE

27

2.3

Instructiuni aritmetice i logice s

Operatiile aritmetice pot avea operanzi pe 8 sau 16 biti. Operatiile aritmetice cu date de 8 biti au ca prim operand obligatoriu registrul acumulator (A), iar rezultatul este stocat tot registrul A. Operatiile cu date pe 16 biti au ca surse unul din registrele HL, IX sau IY. n Instructiunile logice s operatii pe 8 biti i au ce registru surs nt s a ntotdeauna acumulatorul. Operatiile aritmetice i logice afecteaz indicatorii functie de rezultatele acestora: s a n Carry este setat urma operatiilor cu semn sau fr semn dac rezultatul este un numr n aa a a ce nu poate reprezentat pe 8 biti. Indicatorul este setat i atunci c se genereaz s nd a mprumuturi la operatia de scdere. Acest indicator poate folosit drept conditie la a instructiunile de salt sau ca element de legtur la adunarea numerelor mari, ce se a a reprezint pe 24 sau 32 de biti. a Parity/Overow este setat la depirea domeniului de reprezentare a numerelor cu semn as complement fat de 2 ( n a ntre -128 i +127) la operatii aritmetice, sau cazul care s n n rezultatul unei operatii logice are un numr par de biti 1. a Zero este setat atunci c acumulatorul devine zero urma unei operatii aritmetice sau nd n logice. Sign este setat atunci c cel mai semnicativ bit al acumulatorului este 1 (reprezent nd nd faptul c numrul din acumulator este interpretat drept un numr negativ). a a a Adresa 1800 1801 1802 1804 1805 1806 1807 1809 180A 180C 180D Limbaj main s a AF 3D 06FF 90 05 88 0E0F A1 06F5 80 FF Limbaj de asamblare ORG 1800H XOR A DEC A LD B, 0FFH SUB A DEC B ADC B LD C, 0FH AND C LD B, 0F5H ADD B RST 38H END Comentarii ;A=0, Z=1 ;A=0FFH, C=1 ;A=0, Z=1 ;B=0FEH ;A=FFH ;A=0FH, P/V=0 ;A=4, C=1

2.4

Instructiuni de salt i de ciclare s

Instructiunile de salt se pot clasica, dup adresa la care se face saltul, salturi: a n Absolute - caz care argumentul instructiunii este chiar adresa de memorie a destinatiei. n Relative - se calculeaz un deplasament (pozitiv sau negativ) fat de adresa curent. a a a Aceste instructiuni se folosesc cazul salturilor mici deoarece ocup mai putin spatiu n a n memorie (2 octeti, fat de 3 c ocup un salt absolut). a t a

28

LUCRAREA 2. VEDEREA PROGRAMATORULUI ASUPRA PROCESORULUI Z80

Acest tip de instructiuni se mai pot clasica i dup felul care se face saltul: s a n Conditionate - se efectueaz functie de valorile unor indicatori, dac acetia respect a n a s a sau nu conditia de salt. Neconditionate. Uneori, programe este nevoie ca anumite prti din cod s e executate de mai multe ori. n a a Pentru realizarea acestui lucru se stabilete mai i un contor, care se va arca numrul s nt n nc a programele mai de executii ale buclei, i apoi se folosete o instructiune de salt conditionat. In s s complexe, pot s apar chiar i bucle imbricate. a a s continuare, este prezentat un program care poate folosit la calcularea sumei dintre operanzii In aati ntr-un bloc de memorie (1900-190FH). Rezultatul va memorat registrul DE. n Adresa 1800 1802 1803 1806 1807 1808 1809 Limbaj main s a 0E10 AF 210019 57 86 23 3001 XXX: Eticheta Limbaj de asamblare LD C,10 XOR A LD HL, 1900H LD D, A Comentarii ;C-contor ;A=0 ;adresa de nceput a ^ ;datelor; HL pointer ;registrul D va memora ;transporturile, D=0 ;se obtine urmtoarea a ;dat a ;dac nu s-a generat a ;transport, se efectueaz a ;un salt relativ la ;adresa YYY ;dac s-a generat a ;transport, registrul D ;se incrementeaz a ;decrementare contor ;repet p^n se adun a a a ;toate datele ;se ncarc A n E, ^ a ^ ;rezultatul este n DE ^ ;^ntoarcere n programul ^ ;monitor

ADD A, (HL) INC HL JR NC, YYY

180B

14

INC D

180C 180D 180F 1810

0D 20F8 5F FF

YYY:

DEC C JR NZ, XXX LD E, A

RST 38H

2.5

Stiva

cadrul proiectrii programelor, stiva este o sectiune a memoriei care un singur port pentru In a intrri i ieiri. Datele s a s s nt nscrise i citite stiv cu ajutorul acestui port. Prima dat care s n a a se salveaz stiv se plaseaz la baza ei (bottom of stack). Data a n a a nscris cel mai recent a n stiv este plasat v a a n rful acesteia (top of stack). Din aceste motive, stiva este considerat a o memorie LIFO (Last-In First-Out). Pentru a deni o stiv la a nceputul zonei de memorie

2.5. STIVA

29

RAM, cea mai mare adres este incrementat cu 1 i dup aceea este stocat registrul stiv a a s a a n a (SP) al microprocesorului. Urmtorul program ilustreaz operatiile cu stiva: a a Limbaj de asamblare LD SP, 1FAFH DEC SP LD (SP), H Comentarii ;sectiunea RAM cu adrese mai mici sau egale cu ;1FAFH este considerat stiv a a ;SP este decrementat, deci adresa de baz a a ;stivei este 1FAEH ;^ncarc continutul registrului H n memorie a ^ ;(RAM), la adresa 1FAEH ;decrementare SP ;plaseaza continutul registrului L n v^rful ^ ;stivei ;registrul A este stocat n v^rful stivei ^ ;plaseaz continutul registrului F n v^rful a ^ ;stivei ;extrage un octet din v^rful stivei, acesta este ;stocat n registrul C ^ ;SP incrementat cu 1. SP este deplasat spre ;v^rful stivei ;extrage un octet din v^rful stivei ;^ncarc n E octetul din v^rful stivei a ^ ;^ncarc n D octetul din v^rful stivei. a ^ ;Acesta dat a fost prima salvat n stiv a a ^ a ;SP are valoarea initial a

DEC SP LD (SP), L DEC LD DEC LD SP (SP), A SP (SP), F

... LD C, (SP) INC SP LD INC LD INC LD B, (SP) SP E, (SP) SP D,(SP)

INC SP

cadrul operatiilor cu stiva, din programului anterior prezentat, datele pot stocate memoIn n ria RAM folosind SP ca i pointer. SP este decrementat cu 1 ori de c ori un octet este salvat s te stiv, deci dimensiunea stivei crete. Similar, SP este incrementat cu 1 ori de c ori un n a s te octet este citit din stiv, deci dimensiunea stivei scade. Stiva poate folosit pentru a stoca a a temporar adrese sau date pe 16 biti. Microprocesorul Z80 dispune de instructiuni care permit salvarea/recuperarea regitrilor dubli s n/din stiv (PUSH/POP). timpul acestor operatii a In SP este decrementat/incrementat cu 2. Urmtorul program este echivalent cu cel prezentat a anterior. Limbaj de asamblare LD SP, 1FAFH PUSH HL PUSH AF POP BC POP DE Comentarii ;identic a ;identic a ;identic a ;identic a ;identic a

cu cu cu cu cu

prima instructiune instructiunile 2, 3, 4, 5 instructiunile 6, 7, 8, 9 instructiunile 10, 11, 12, 13 instructiunile 14, 15, 16, 17

cadrul unui program, este foarte important ca numrul instructiunilor de tip PUSH s e In a a egal cu cel al instructiunilor de tip POP.

30

LUCRAREA 2. VEDEREA PROGRAMATORULUI ASUPRA PROCESORULUI Z80

2.6

Subrutine

Programele de tip aritmetic (adunri, scderi, a a nmultiri sau artiri), de control a tastaturii i mp s a aajului sau altele, s des folosite ca prti ale unor aplicatii de dimensiuni mari. Pentru a s nt a economisi memorie i a reduce posibilitatea de aparitie a erorilor, subrutinele s des folosite s nt n cadrul programelor. Pentru manipularea subrutinelor se folosesc instructiunile CALL i RET. s Subrutinele pot executate neconditionat, functie de anumite conditii sau indicatori. n cazul apelului unei subrutine dintr-un program principal (CALL), se execut operatiile In a prezentate exemplul urmtor: n a CALL 1A38H ;apelul subrutinei de la adresa 1A38H

Apelul de procedur este echivalent cu: a PUSH JP PC 1A38H ;salveaz contorul program PC n stiv a ^ a ;salt la adresa 1A38H si continu executia a

Spre deosebire de instructiunle de salt, dup executarea unei subrutine, controlul programului a este transferat instructiunii care urmeaz dup apelul subrutinei. Instructiunea RET nu are a a nevoie de nici un operand, este codicat pe un octet i are acelai efect ca i instructiunea a s s s POP PC. RET ;re^ntoarcere la programul principal si continu a ;executia

Instructiunea de revenire din procedur este echivalent cu: a a POP PC ;se reface continutul PC, din stiv, dup care a a ;programul se execut conform valorii PC-ului a

gura 2.1 este prezentat forma general a unui program care contine apeluri de subrutine. In a a
Program Principal
CALL 1

Subrutina 1

CALL 2 CALL 1 RET

Subrutina 2

CALL 2

RET

Figura 2.1: Apeluri de subrutine. cazul unui apel de subrutin din programul principal, trebuie considerate urmtoarele In a a observatii:

2.7. EXPERIMENTE

31

Registrele care nu trebuie s e afectate de ctre subrutin vor salvate stiv de ctre a a a n a a programul apelant, nainte de apelul subrutinei. Modalitatea prin care rezultatele, obtinute urma executiei subrutinei, se transfer n a n programul principal este stabilit de programator. a

2.7

Experimente

I. Scrieti un program care s a ncarce registrele microprocesorului urmtoarele valori, n a folosind instructiuni de transfer pe 16 biti: B=12, C=34, D=56, E=78, H=9, L=A. Asamblati-l i apoi vericati-l pe macheta MPF1-B. s II. Transferati pe machet codul executabil de la exemplul sectiunii 2.2. Executati progra a mul. Vericati dac s-au copiat cei 16 octeti de la adresa 0066H la adresa 1820H. Rulati a programul pas cu pas i urmriti actiunile ecrei instructiuni. Vericati continutul res a a gistrelor afectate nainte i dup instructiuni. s a III. Scrieti un program limbaj de asamblare care s tearg continutul memoriei n a s a ntre adresele 1850H - 186FH. Rulati-l pe machet i vericati rezultatele. as IV. Scrieti un program limbaj de asamblare care seteaz continutul memoriei n a ntre adresele 1840H - 184FH cu urmtoarele valori: 0, 1, ..., F. Asamblati-l i apoi vericati-l pe a s macheta MPF1-B. V. Urmtorul program este folosit pentru a aduna un operand de 16 biti aat memorie a n la adresele 1A00H - 1A01H cu continutul registrului dublu DE. Rezultatul va stocat n registrul dublu HL. ORG LD ADD LD LD ADC LD RST 1800H A, (1A00H) A, E L, A A, (1A01H) A, D H, A 38H

Rulati programul pe machet i urmriti rezultatele. Modicati programul de mai sus a s a pentru o operatie de scdere. a VI. Urmtorele linii de cod pot folosite pentru a arti 256 de octeti din memorie 16 a mp n blocuri. Adresa de nceput este 1900H. LD LD LOOP2: LD LOOP1: LD DEC DJNZ DEC HL, 19FFH C, 0FH B, 10H (HL), C HL LOOP1 C

32

LUCRAREA 2. VEDEREA PROGRAMATORULUI ASUPRA PROCESORULUI Z80 JP RST NZ, LOOP2 38H

Setati valoarea ecrui bloc de date modul urmtor: 1H pentru blocul 1, 2H pentru a n a blocul 2, ... , 0FH pentru blocul 16.

Lucrarea 3 Aajul i tastatura MPF1-B s s


3.1 Aajul s

Macheta Microprofessor MPF1-B contine un display format din ase aoare cu 7 segmente s s (plus punctul zecimal). Figura 3.1 prezint asocierea dintre cele 7 segmente i literele cu care a s s denumite acestea. Fiecare aor contine 8 LED-uri (7 asociate segmentelor i unul asociat nt s s punctului zecimal). Cele 8 LED-uri s conectate cu anodul comun. nt n
a f g e d c p b

Figura 3.1: Denumirea celor 7 segmente ale unui aor. s Comandarea concurent a celor ase aaje ar necesita un numr de 48 semnale, determinat a s s a astfel: (6 aaje) (8 semnale de date) = 48 semnale. s Comandarea secvential a celor ase aaje ar necesita un numr de 14 semnale, determinat a s s a astfel: (6 semnale de selectie a aajului) + (8 semnale de date) = 14 semnale. s Tin cont de inertia ochiului uman, comandarea secvential a aajelor cu o frecvent mare nd a s a (cel putin de 40 de ori pe secund), poate crea impresia c aajele s aprinse simultan. Liniile a a s nt de date pentru segmente s notate cu Sa, Sb, Sc, Sd, Se, Sf, Sg i Sp. Liniile de selectie a nt s aajului comandat la un moment dat s notate cu D0, D1, D2, D3, D4, D5. s nt Pentru a comanda aajul machetei s folosite porturile A i B ale circuitului port paralel s nt s I8255, aa cum se este prezentat gura 3.3. Portul B (liniile PB0 - PB7) este folosit ca port s n de ieire pentru liniile de date ale aoarelor (Sa, Sb, Sc, Sd, Se, Sf, Sg). Portul C (liniile PC0 s s PC5) este folosit ca port de ieire pentru semnalele de comand (D0, D1, D2, D3, D4, D5). Prin s a portul C se selecteaz aorul care se lumineaz. Prin portul B se specic segmentele luminate a s a a din cadrul aajului selectat prin portul C. Toate segmentele s controlate de semnale active s nt 1. n 33

34

LUCRAREA 3. AFISAJUL SI TASTATURA MPF1-B

3.2

Tastatura

Deoarece reactia unui calculator este mult mai rapid dec cea a utilizatorului, tastatura trebuie a t scanat repetat p a momentul care se detecteaz o tast apsat. O tast oscileaz pentru a n n n a a a a a a gura 3.2 este prezentat un timp scurt momentul care este apsat sau eliberat. In n n a a a a diagrama rspunsului, timp, cazul operatiilor de apsare, respectiv de eliberare, a unei a n n a taste.
oscilatii la apasare oscilatii la eliberare

tasta eliberata

tasta apasata

tasta eliberata

tasta apasata

TIMP Tn Tn+1 Tn+2 Tn+3 Tn+4 Tn+5 Tn+6

Figura 3.2: Rspuns timp la scanarea tastaturii. a n Datorit oscilatiilor mecanice, dac viteza de scanare a tastaturii este prea mare,apsarea unei a a a taste poate interpretat ca dou sau mai multe apsri succesive. Pentru a evita aceast lucru, a a aa perioada de scanare trebuie s e mai mare dec perioada oscilatiilor. Perioada oscilatiilor nu a t este mai mare de 10 ms. Perioada de scanare trebuie aleas a ntre 10 ms i 50 ms. gura 3.2, s In sgetile indic momentele de timp c este examinat tastatura. La momentul Tn+2 , programul a a nd a monitor detecteaz o tast apsat i identic codul acesteia. La momentul Tn+3 tasta este, a a a as a din nou, gsit apsat. Deoarece tasta a fost detectat apsat timpul precedentei scanri, a a a a a a a n a monitorul nu consider aceast actiune ca ind o nou apsare (tasta nu a fost eliberat a a a a a n acest interval). Doar dac tasta este detectat ca ind eliberat la momentul Tn+4 sau Tn+5 , a a a atunci se consider o nou apsare a acesteia. Un program care obtine date de la tastatur a a a a n acest mod, este lipsit de erori. Practic, nu conteaz intervalul de timp c o tast este apsat. a t a a a Structura tastaturii, prezentat gura 3.3, const dintr-un numr de linii dispuse form a n a a n a ecare nod de intersectie este pozitionat o tast. Cele 6 linii orizontale i cele matricial. In a a a s momentul care este 6 linii verticale formeaz, 36 de puncte de contact pentru tastatur. In a a n actionat o tast, se va crea un contact electric a a ntre o linie i o coloan a matricei. Cele ase s a s linii orizontale (PA0 - PA5), s conectate la portul de intrare A al circuitului port paralel nt I8255. Dac nici o tast nu este apsat, atunci cele 6 linii s conectate la tensiunea de a a a a nt alimentare (+5V) prin 6 rezistoare. Coloanele matricii s conectate la portul de ieire C nt s (PC0 - PC5), care la r ndul lui este conectat i la aaj. s s Microprocesorul selecteaz cea mai din drepta coloan cu ajutorul liniei PC0. Tensiunile celor a a 6 linii ale matricei s evaluate secvential. La nt nceputul procesului de scanare a tastaturii, un numrtor este setat la zero, portul C va avea valoarea 11000001, deci PC5 - PC0 se aa vor gsi starea logic 000001. timpul c se scaneaz tastatura, PC6 i PC7 trebuie s a n a In t a s a e stare 1, deoarece PC6 este conectat la semnalul BREAK, iar PC7 la ieirea de difuzor. n s Tensiunile liniilor tastaturii se citesc succesiv. Dac o tast este apsat (pe linia respectiv se a a a a a detecteaz o tensiune nul), ea poate identicat cu ajutorul pozitiei liniei cadrul portului. a a a n Dac nici o tast din prima coloan nu este apsat, atunci microprocesorul va forta pe portul a a a a a C urmtoarea valoare a numrtorului (11000010), select a doua coloan. a aa nd a

3.3. SUBRUTINELE PROGRAMULUI MONITOR


+5V +5V

35

100

10

PB0 PB1 PB2 PB3

1A 2A 3A 4A

75491

1E 2E 3E 4E

+5V

100 PB4 PB5 PB6 PB7

10

1A 2A 3A 4A

75491

1E 2E 3E 4E

I8255
PC0 PC1 PC2 PC3 PC4 PC5

+5V

D5 D4 D3 D2 D1
1A 2A 3A 4A 5A 6A

D0

75492

1Y 2Y 3Y 4Y 5Y 6Y

+5V

4.7 K PA0 PA1 PA2 PA3 PA4 PA5 4.7 K

Figura 3.3: Structura display-ului i a tastaturii machetei MPF1-B. s

Procesul de scanare al tastaturii se desfoar succesiv din partea dreapt spre st as a a nga, i de s sus jos. Fiecare tast este codat: de c ori o tast examinat este gsit neapsat, se n a a te a a a a a a incrementeaz valoarea numrtorului. momentul care se identic o tast apsat, codul a aa In n a a a a pozitiei acelei taste este chiar valoarea numrtorului. aa tabelele 3.1 i 3.2 s descrise codul pozitiei i codul intern al ecrei taste. In s nt s a

3.3

Subrutinele programului monitor

Programul monitor contine 8 subrutine ce pot apelate i din programele utilizatorului. s Adresele, descrierea i parametrii subrutinelor SCAN1, SCAN, HEX7, HEX7SG, RAMCHK i s s TONE s prezentate tabelele 3.3, 3.4, 3.5, 3.6, 3.7, 3.8. nt n

36 1E SBR 1F 20 DATA 21 + 22 INS 23 MOVE

LUCRAREA 3. AFISAJUL SI TASTATURA MPF1-B 18 12 CBR 0 19 13 PC 4 1A 14 REG 8 1B 15 ADDR C 1C 16 DEL GO 1D 17 RELA TPWR 0C 1 0D 5 0E 9 0F E 10 STEP 11 TPRD 06 2 07 6 0B A 09 E 0A 0B 00 3 01 7 02 B 03 F 04 05

Tabelul 3.1: Codul pozitiei tastelor. 15 SBR 11 14 DATA 10 + 16 INS 1C MOVE 1A 00 CBR 0 18 04 PC 4 1B 08 REG 8 19 0C ADDR C 17 12 DEL GO 1D 1E RELA TPWR 01 1 05 5 09 9 0D E 13 STEP 1F TPRD 02 2 06 6 0A A 0E E 22 23 03 3 07 7 0B B 0F F 20 21

Tabelul 3.2: Codul intern al tastelor.

3.4

Exemple

Exemplul 1: Aarea mesajului HELP US p a c se apas tasta STEP. s n nd a ORG LD CALL CP JR HALT 1800H IX, HELP SCAN 13H NZ, DISP

DISP:

;codul intern al tastei STEP

HELP:

ORG 2000H DEFB 0AEH DEFB 0B5H

; "S" ; "U"

3.4. EXEMPLE SCAN1 Adres a Functie Intrare Ieire s 0624H Scaneaz tastatura i aajul timp de 1 ciclu, de la dreapta a s s la st nga. Timpul de executie este de 9.97ms. IX este un pointer la buer-ul de aare. s (1) Indicatorul carry este setat dac nu s-a apsat nici o tast; a a a (2) Dac a fost apsat o tast, indicatorul carry este resetat a a a a i codul pozitiei tastei este memorat registrul A. s n AF, AF, BC, BC, DE. (1) S necesari 6 octeti pentru memorarea celor 6 pant ttern-uri; (2) IX este un pointer spre cuv ntul ce corespunde r ndului din dreapta. IX+5 indic cuv a ntul ce corespunde r ndului din st nga. Tabelul 3.3: Subrutina SCAN1. SCAN Adres a Functie 05FEH Similar cu cea a rutinei SCAN1 cu 2 exceptii: a (1) SCAN1 scaneaz un ciclu, pe c SCAN scaneaz p a a nd a n se apas o tast; a a (2) SCAN1 ntoarce pozitia tastei apsate, timp ce SCAN a n ntoarce codul tastei apsate. a IX este un pointer la buer-ul de aare. s Registrul A contine codul intern al tastei apsate. a AF, AF, B, BC, DE, HL. Tabelul 3.4: Subrutina SCAN. DEFB DEFB DEFB DEFB SCAN EQU END 01FH 085H 08FH 037H 05FEH ; ; ; ; "P" "L" "E" "H"

37

Registre afectate Observatii

Intrare Ieire s Registre afectate

Exemplul 2: Aarea cu intermitent a mesajului HELP US, folosind rutina SCAN1. Fiecare pattern este s a aat timp de 500 ms prin executarea rutinei SCAN de 50 de ori. Valoarea registrului B s determin frecventa de aare. a s ORG 1800H LD HL, BLANK PUSH HL

38

LUCRAREA 3. AFISAJUL SI TASTATURA MPF1-B HEX7 Adres a Functie Intrare Ieire s Registre afectate 0689H Convertete o cifr baza 16 formatul de aare cu 7 s a n n s segmente. Cei mai putin semnicativi 4 biti ai registrului A contin cifra, exprimat baza 16. a n Rezultatul este memorat registrul A. n AF. Tabelul 3.5: Subrutina HEX7. HEX7SG Adres a Functie Intrare 0678H Convertete dou cifre din baza 16 formatul de aare cu s a n s 7 segmente. Cei mai putin semnicativi 4 biti ai registrului A contin prima cifr, iar cei mai semnicativi 4 biti ai registrului A contin a a doua cifr. a Primul pattern de aat este memorat la adresa din registrul s HL, iar al doilea este memorat la adresa urmtoare (continutul a registrului HL, plus 1). AF, HL. Tabelul 3.6: Subrutina HEX7SG.

Ieire s

Registre afectate

LD EX LD HALFSEC: CALL DJNZ JR LOOP: ORG DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB

IX, HELP (SP), IX B, 50 SCAN1 HALFSEC LOOP 1820H 0AEH 0B5H 01FH 085H 08FH 037H 0 0 0 0 0 0

HELP:

; ; ; ; ; ;

"S" "U" "P" "L" "E" "H"

BLANK:

3.4. EXEMPLE RAMCHK Adres a Functie Intrare Ieire s Registre afectate 05F6H Veric dac o anumit adres este RAM. a a a a n Adresa care trebuie memorat este stocat HL. a a n Dac adresa este RAM, indicatorul de zero este setat, altfel a n este resetat. AF. Tabelul 3.7: Subrutina RAMCHK. TONE Adres a Functie Intrare 05E4H Genereaz un sunet. a Registrul C controleaz frecventa sunetului. Perioada este a aproximativ egal cu (44 + C 13) 2 0.56s, iar frecventa a este 200/(10 + 3 C)kHz. AF. Tabelul 3.8: Subrutina TONE. SCAN1 EQU END 0624H

39

Registre afectate

Exemplul 3: Aarea codului intern al tastei apsate. s a ORG LD CALL LD CALL JR ORG DEFB DEFB DEFB DEFB DEFB DEFB EQU EQU END 1800H IX, OUTBUF SCAN HL, OUTBUF HEX7SEG LOOP 1900H 0 0 0 0 0 0 05FEH 0678H

LOOP:

OUTBUF:

SCAN HEX7SG

Pentru a aa codul pozitiei tastei apsate, programul trebuie modicat dup cum urmeaz: s a a a

40 ORG LD CALL JR LD CALL JR 1800H IX, OUTBUF SCAN1 C, LOOP HL, OUTBUF HEX7SEG LOOP

LUCRAREA 3. AFISAJUL SI TASTATURA MPF1-B

LOOP:

Exemplul 4: Se convertesc trei octeti din memorie formatul apte segmente. Rezultatul este stocat n s n memorie la adresele 1903H - 1908H, dup care este aat. a s ORG LD LD LD LD CALL INC DJNZ 1800H DE, BYTE0 HL, OUTBUF B, 3 A, (DE) HEX7SEG DE LOOP

LOOP:

LD IX, OUTBUF CALL SCAN HALT ORG DEFB DEFB DEFB 1900H 10H 32H 45H

BYTE0:

OUTBUF: SCAN HEX7SEG

DEFS 6 EQU EQU END 05FEH 0678H

Cei trei octeti de date s stocati la adresele 1900H - 1902H. nt

3.5

Experimente

I. Transferati codul executabil de la Exemplul 1 pe machet, dup care executati programul. a a arcati memorie la adresa 1808H valoarea 1AH. Aps tasta CBR, mesajul nu va Inc n a nd mai aprea pe aaj. De ce? Setati continutul memoriei a s ntre adresele 1820H - 1822H cu valorile 3FH, BDH, 85H. Ce se va aa pe display? Scrieti un program care s aeze s a s SYS-SP p a c se apas tasta PC. n nd a

3.5. EXPERIMENTE

41

II. Transferati codul executabil de la Exemplul 2 pe machet, dup care executati programul. a a Setati continutul locatiei de memorie 180BH cu valoarea 01. Ce se va aa pe display? s Dar pentru valoarea 05? III. Pentru Exemplul 3 setati continutul zonei de memorie 1900H - 1905H la valoarea FFH. Ce se va aa? s IV. Modicati programul de la Exemplul 4, astfel t s se aeze secventa 333446. nc a s

42

LUCRAREA 3. AFISAJUL SI TASTATURA MPF1-B

Lucrarea 4 Aplicatii cu circuitul Z80-PIO


Aceast lucrare prezint modul de lucru al circuitului port paralel Z80-PIO, comanda cu acest a a circuit a unor dispozitive aate pe placa de aplicatii, precum i c s teva programe care s exema plice aceast problematic. a a

4.1
4.1.1

Interfata paralel programabil Z80-PIO a a


Arhitectura intern a circuitului Z80-PIO a

Z80-PIO (Parallel Input/Output - engl.) este o interfat paralel programabil prevzut cu o a a a a a unitate de comand i dou porturi paralele de 8 biti de date i 2 semnale de conversatie (Ready as a s i Strob) cu ajutorul crora se controleaz transferul de date. Cele dou porturi furnizeaz o s a a a a interfat compatibil TTL a a ntre procesor i dispozitivele periferice. Porturile, denumite A s i B, pot programate ca porturi de intrare sau porturi de ieire, la nivel de octet sau de s s bit. Portul A poate programat i pentru a lucra bidirectional. functie de indicatorii de s In stare ai echipamentelor periferice, se pot genera ntreruperi programabile. Figura 4.1 prezint a arhitectura intern a circuitului Z80-PIO. Simbolul bloc asociat acestui circuit este prezentat a gura 4.2. n Pinii circuitului au urmtoarea semnicatie: a Semnale generale: CLK (System Clock) - Semnal de ceas comun tuturor circuitelor din sistemul cu microprocesor Z80. /RESET (Reset) - Semnal de initializare. Magistrala de date: D0-D7 (System Data Bus) - Magistral bidirectionl conectat la magistrala de date a procea a a sorului. Semnalele de control (primite de la procesor): SEL.PB/NPA (Port B or A Select) [intrare, High=B, Low=A] - Semnal de selectie a portului accesat timpul unui transfer de date n ntre procesor i PIO. Pentru aceast selectie se folosete s a s bitul A0 al magistralei de adrese a procesorului. SEL.CTRL/NDATA (Control or Data Select) [intrare, High=C, Low=D] - Semnal care de43

44

LUCRAREA 4. APLICATII CU CIRCUITUL Z80-PIO


CONTROL

LOGICA INTERNA
DATE D0-D7

NASTB ARDY

PORT A 8
DATE PA0-PA7

NCE NM1 6 NIORQ NRD SEL.PB/NPA SEL.CTRL/NDATA

I N T E R F A T A

DE COMANDA

DATE

BLOC DE COMANDA INTRERUPERI PORT B

PB0-PB7 NBSTB BRDY

CONTROL

LINII INTRERUPERI

IN.EN.IN IN.EN.OUT NINT

Figura 4.1: Arhitectura circuitului Z80-PIO.

nete tipul de date care se transfer s a ntre procesor i PIO. Dac semnalul este starea 1, s a n cuv ntul este interpretat ca o comand, altfel ca o dat. Pentru aceast selectie se folosete a a a s bitul A1 al magistralei de adrese a procesorului. /CE (Chip Enable) [intrare, activ stare Low] - Semnal de validare a circuitului PIO. Se a n obtine prin decodicarea magistralei de adrese. /M1 (Machine Cycle 1) [intrare de la procesor, activ stare Low] - Semnal de la procesor a n utilizat ca impuls de sincronizare pentru a controla mai multe operatii interne ale circuitului PIO. C semnalele /M1 i /RD s active simultan, procesorul nd s nt ncarc o dat din memorie. a a Semnalul /M1 mai are a dou functii cadrul circuitului PIO: sincronizeaz logica de nc a n a ntreruperi din PIO i initializeaz circuitul PIO momentul aparitiei semnalului /M1, fr s a n aa ca unul din semnalele /RD sau /IORQ s e active. a /IORQ (Input/Output Request) [intrare de la procesor, activ stare Low] - Semnal de la pron cesor utilizat mpreun cu SEL.PB/NPA, SEL.CTRL/NDATA, /CE i /RD pentru a transfera a s comenzi i date s ntre procesor i circuitul PIO. C /CE, /RD i /IORQ s active portul s nd s nt adresat de SEL.PB/NPA scrie date procesor (operatie de citire). C /RD nu este activ n nd portul adresat de SEL.PB/NPA este nscris cu date sau informatii de control de la procesor, n functie de starea semnalului SEL.CTRL/NDATA. Dac /IORQ i /M1 s simultan active procesorul anunt acceptarea unei a s nt a ntreruperi. Portul care a cerut ntreruperea pune mod automat vectorul lui de n ntrerupere pe magistrala de date a procesorului, cazul care dispozitivul periferic care a cerut n n ntreruperea are prioritatea cea mai mare. /RD (Read Cycle Status) [intrare de la procesor, activ stare Low] - Dac semnalul /RD este n a activ sau o operatie de intrare/ieire este curs de desfurare,/RD este folosit s n as mpreun cu a semnalele SEL.PB/NPA, SEL.CTRL/NDATA, /CE i /IORQ pentru a se transfera date de la s

4.1. INTERFATA PARALELA PROGRAMABILA Z80-PIO


19 20 1 40 39 38 3 2 23 24 22 4 35 36 37 5 6 25 D0 D1 D2 D3 D4 D5 D6 D7 /INT IEI IEO /CE /RD /IORQ /M1 C/D B/A CLK PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 ARDY /ASTB PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 BRDY /BSTB 15 14 13 12 10 9 8 7 18 16 27 28 29 30 31 32 33 34 21 17

45

Magistrala de date a procesorului (8 biti)

Magistrala de date a portului A (8 biti) Linii dialog port A

Interrupt request In.En.In. In.En.Out Chip Enable Read I/O Request Machine Cycle 1 Control/NData Port B/NA Clock

Magistrala de date a portului B (8 biti) Linii dialog port B

Z80-PIO
Figura 4.2: Simbolul bloc al circuitului Z80-PIO. circuitul PIO spre procesor. Semnalele de ntrerupere: IN.EN.IN (IEI) (Interrupt Enable In) [intrare, activ stare High] - Semnal de validare a n ntreruperilor. Este folosit pentru a forma un lant de prioriti la cererile de at ntrerupere, c nd se utilizeaz mai multe dispozitive periferice comandate prin a ntreruperi. Starea logic 1 a a aceastei linii semnic faptul c nici un alt dispozitiv cu prioritate mai mare nu este servit de a a procesor printr-o rutin de tratare a a ntreruperii. IN.EN.OUT (IEO) (Interrupt Enable Out) [ieire, activ stare High] - Semnal de validare s n a ntreruperilor. Este cel de-al doilea semnal necesar pentru a forma lantul de prioriti la at ntreruperi. Starea logic a acestui semnal este 1 numai dac i IEI este 1 logic i dac a a s n s a procesorul nu deservete o s ntrerupere de la acest circuit PIO. Altfel acest semnal blocheaz a cererile de ntrerupere pentru dispozitivele mai putin prioritare, timp ce un dispozitiv cu n prioritate mai mare este deservit de procesor printr-o rutin specic. a a /INT (Interrupt Request) [ieire, activ stare Low] - Cerere de s n ntrerupere adresat procea sorului. Semnalele porturilor: PA0-PA7 (Port A Bus) [intrri/ieiri, active stare High, 3-state] - Magistral bidirectional de a s n a a date. Pe aceast magistral se realizeaz transferul de date a a a ntre portul A al PIO i dispozitivul s periferic. /ASTB (Port A Strobe Pulse From Peripheral Device) [intrare, activ stare Low] - Semnicatia n semnalului depinde de modul de functionare ales pentru portul A dup cum urmeaz: a a

Mod de ieire: frontul cresctor al semnalului emis de ctre dispozitivul periferic semnaleaz s a a a c acesta a primit data furnizat de circuitul PIO. a a

46

LUCRAREA 4. APLICATII CU CIRCUITUL Z80-PIO

Mod de intrare: pulsul emis de ctre dispozitivul periferic semnaleaz c acesta este gata s a a a a scrie date de la portul A. Datele s arcate PIO numai c acest semnal este activ. nt nc n nd Mod bidirectional: c semnalul este activ datele din registrul de ieire al portului A s nd s nt transferate pe magistrala de date a portului A (bidirectional). Frontul cresctor al a a semnalului emis de ctre dispozitivul periferic semnic faptul c acesta a primit data a a a furnizat de circuitul PIO. a Mod bit: semnalul este dezactivat intern ( ntruc nu este necesar). t ARDY (Register A Ready) [ieire, activ stare High] - Semnicatia semnalului depinde de s n modul de functionare selectat dup cum urmeaz: a a Mod de ieire: semnalul activ indic faptul c registrul de ieire al portului A a fost arcat s a a s nc i datele s valide pentru citire. s nt Mod de intrare: semnalul este activ c registrul de intrare al portului A este gol i poate nd s s preia datele de la dispozitivul periferic. a Mod bidirectional: semnalul este activ c datele pentru dispozitivul periferic s disponi nd nt bile registrul de ieire al portului A. acest mod datele nu s puse pe magistrala de n s In nt date a portului A numai c semnalul /ASTB este activ. nd Mod bit: semnalul este dezactivat intern ( ntruc nu este necesar). t PB0-PB7 (Port B Bus) [intrri/ieiri, active stare High, 3-state] - Magistral bidirectional de a s n a a date. Pe aceast magistral se realizeaz transferul de date a a a ntre portul B al PIO i dispozitivul s periferic. Portul B poate furniza pe ecare linie 1.5 mA la 1.5V pentru a comanda tranzistoare montate conexiune Darlington. n em /BSTB (Port A Strobe Pulse From Peripheral Device) (intrare, activ stareLow) - Similar n cu semnalul /ASTB, cu exceptia faptului c modul bidirectional semnalul a n ncarc datele de a la dispozitivul periferic registrul de intrare al portului A. n BRDY (Register B Ready) [ieire, activ stare High] - Similar cu semnalul ARDY, cu exceptia s n faptului c mod bidirectional semnalul este 1 logic c registrul de intrare al portului A a n n nd este gol i poate s preia datele de la dispozitivul periferic. s a

4.1.2

Modurile de lucru ale circuitului Z80-PIO

Modul 0, de ieire Ambele porturi (A sau B) pot programate acest mod. Un ciclu de s n ieire este s ntotdeauna pornit de executia unei instructiuni de ieire de ctre procesor. La s a semnalul /WR furnizat de ctre procesor datele de pe magistrala de date s a nt nscrise n registrul de ieire al portului PIO selectat. Impulsul de scriere pozitioneaz indicatorul s a READY dup frontul descresctor al semnalului de ceas, indic astfel disponibilitatea a a nd informatiei pentru dispozitivul periferic. Linia READY rm activ p a c PIO a ne a n nd receptioneaz de la dispozitivul periferic semnalul de STROB, care semnic faptul c a a a perifericul a preluat infomartia. Frontul cresctor al semnalului de STROB genereaz o a a ntrerupere /INT, dac bistabilul de activare a a ntreruperilor a fost setat i dac dispozis a tivul periferic are prioritatea cea mai mare.

4.1. INTERFATA PARALELA PROGRAMABILA Z80-PIO

47

Modul 1, de intrare Ambele porturi (A sau B) pot programate acest mod, ecare av n nd un registru de intrare adresabil de ctre procesor. Data de la echipamentul periferic este a nscris registrul de intrare al porturilor PIO pe frontul descresctor al semnalului de a n a STROB. Frontul cresctor al aceluiai semnal activeaz /INT, dac bistabilul de activare a s a a a ntreruperilor a fost setat i dac echipamentul periferic respectiv are prioritatea cea mai s a mare. Urmtorul front descresctor (activ) al semnalului de ceas inactiveaz semnalul a a a READY, prin care echipamentul periferic este anuntat c portul de intrare contine o a informatie care nu a fost preluat de ctre procesor, i deci nu mai poate arcat cu a a s nc alt informatie p a la citirea celei existente de ctre procesor. Dup frontul cresctor al a n a a a semnalului /RD de la procesor, pe urmtorul front descresctor al semnalului de ceas, se a a reactiveaz semnalul READY. a Modul 2, bidirectional Acest mod reprezint o combinatie a modurilor 0 i 1. Portul A va a s port bidirectional. Liniile de coversatie ale portului A se folosesc drept linii de dialog pentru ieire, iar liniile de conversatie ale portului B se folosesc drept linii de dialog pentru s intrare. Portul B va programat, acest caz, modul bit (care nu necesit linii de n n a dialog). Dac apare o a ntrerupere va folosit vectorul de ntrerupere al portului A n cazul unei operatii de ieire sau cel al portului B cazul unei operatii de intrare. Datele s n de ieire s disponibile perifericului numai c semnalul /ASTB este 0 logic. s nt nd n Modul 3, bit Ambele porturi pot programate acest mod. Nu se folosesc semnale de n dialog. O operatie normal de scriere poate avea loc orice moment. Un semnal de a n ntrerupere se genereaz dac starea unei intrri sau starea tuturor intrrilor se modic. a a a a a Conditiile de generare a ntreruperii s denite timpul programrii circuitului. Nivelul nt n a activ poate ales 1 sau 0 logic, iar conditia logic este e pentru o intrare activ (SAU a a logic), e pentru toate intrrile active (SI logic). Dac portul A este programat mod a a n bidirectional, portul B nu mai are un semnal de ntrerupere i pentru acest motiv va trebui s s e interogat. Acest mod se folosete pentru aplicatiile care se genereaz semnale de a s n a comand sau se monitorizeaz stri. a a a

4.1.3

Structura unui port

Portul are un registru de intrare i unul de ieire, felul acesta put functiona orice mod. s s n nd n Continutul acestor registre se modic numai atunci c s a nd nt nscrise, rest ele pstr datele n a nd scrise ele. Portul mai contine un registru de comand a modului de lucru (astfel ecare port n a se poate programa independent de cellalt - cu exceptia modului 2 de lucru), logic de comand a a a a registrului masc (utilizat modul 3 de lucru) i logic de comand a liniilor de dialog, ind a n s a a gura 4.3 este prezentat astfel capabil s controleze un sistem de a ntreruperi ierarhizate. In a structura unui port al circuitului PIO.

4.1.4

Blocul de comand a a ntreruperilor

Blocul de comand a a ntreruperilor se ocup de a ntregul protocol de ntreruperi spre procesor. Pozitia zic a unui dispozitiv a ntr-un lant de prioriti determin prioritatea lui. Fiecare at a circuit Z80-PIO are dou semnale (IEI i IEO) pentru a forma un lant de prioriti, aa cum se a s at s prezint gura 5.4. Dispozitivul care este cel mai apropiat de procesor are prioritatea cea mai a n mare. cadrul unui circuit PIO, In ntreruperile portului A au prioritate mai mare dec cele ale t modurile de intrare, ieire i bidirectional o cerere de portului B. In s s ntrerupere se poate genera

48
REGISTRU COMANDA MOD

LUCRAREA 4. APLICATII CU CIRCUITUL Z80-PIO


REGISTRU SELECTIE IN/OUT

8 2 MAGISTRALA INTERNA PIO

REGISTRU OUT

MAGISTRALA 8 INPUT/OUTPUT 2 REGISTRU MASCA REGISTRU IN LOGICA COMANDA DIALOG RDY STB Linii de dialog

COMANDA REGISTRU MASCA

CERERI INTRERUPERI

Figura 4.3: Structura unui port al circuitului Z80-PIO.

oric perifericul cere transferul unui nou octet. Circuitul PIO permite controlul complet al nd ntreruperilor ierarhizate. Astfel, dispozitivele cu prioritate mai mic nu le pot a ntrerupe pe cele cu prioritate mai mare, ale cror subrutine de deservire nu au fost executate de procesor. a Cele cu prioritate mai mare pot ntrerupe deservirea celor mai putin prioritare. Dac procesorul aat modul 2 de a n ntrerupere accept o a ntrerupere, circuitul PIO care a cerut ntreruperea trebuie s furnizeze unitii centrale un vector de ntrerupere. Acest vector a at indic o locatie de memorie unde se a adresa rutinei de servire a a a ntreruperii. Cei 8 biti furnizati de dispozitivul care a cerut ntreruperea reprezint cei mai putin semnicativi 8 biti a ai indicatorului, timp ce registrul I din procesor asigur cei mai semnicativi 8 biti. n a Fiecare port are un vector de ntrerupere independent. Cel mai putin semnicativ bit al vec torului este xat mod automat 0 interiorul circuitului PIO, pentru c indicatorul trebuie n n n a s identice dou locatii de memorie succesive, pentru a forma o adres complet de 16 biti. a a a a Spre deosebire de alte periferice din sistemul Z80, circuitul PIO nu accept a ntreruperi imediat dup programare, ci ateapt pn c /M1 este 0 logic (de exemplu timpul aducerii a s a a a nd n n unui cod de operatie). Circuitul PIO decodic instructiunea de revenire din a ntrerupere RETI direct de pe magistrala de date a sistemului, astfel t ecare circuit PIO din sistem tie orice moment dac este nc s n a deservit de procesor printr-o rutin de tratare a a ntreruperii, neind astfel necesar nici o a comunicatie plus cu procesorul. n

4.1.5

Initializarea circuitului Z80-PIO

Circuitul Z80-PIO intr mod automat starea initial (de reset) c este pus sub tensiune. a n n a nd acest caz au loc urmtoarele actiuni: In a

4.1. INTERFATA PARALELA PROGRAMABILA Z80-PIO

49

Ambele registre de mascare a porturilor s initializate pentru a inhiba toti bitii de date nt ai porturilor; Liniile de date ale magistralelor porturilor trec starea de n nalt impedant i semnalele a a s de conversatie s inactivate. Modul 1 este selectat automat; nt Registrele vectorilor de adres nu s initializate; a nt Ambele bistabile de validare a intreruperilor din port s initializate; nt Ambele registre de ieire ale porturilor s initializate. s nt Circuitul PIO poate initializat aplic un semnal /M1 absenta unui semnal /RD sau nd n /IORQ, rezultatul ind initializarea circuitului imediat dup ce /M1 devine inactiv. Dup ce a a intr starea initial, circuitul PIO rm aceast stare p a la primirea unui cuv de a n a a ne n a n nt control de la procesor.

4.1.6

Programarea circuitului Z80-PIO

Programarea unui port modurile 0, 1 sau 2 necesit dou cuvinte pentru ecare port. Al n a a treilea cuv este trimis numai atunci c se dorete validarea/invalidarea nt nd s ntreruperilor. Primul cuv este cuv nt ntul de selectare a modului de operare. Structura cuv ntului este urmtoarea: a D7 M1 unde: - D0-D3 identic cuv a ntul de selectare a modului de operare; - D4, D5 nu conteaz; a - D6, D7 determin modul de operare dup cum urmeaz: a a a M0 M1 0 0 0 1 1 0 1 1 MOD ieire s intrare bidirectional bit D6 M2 D5 D4 D3 D2 D1 D0 X X 1 1 1 1

Al doilea cuv este vectorul de ntrerupere, cuv care trebuie furnizat de circuitul PIO nt nt care a cerut ntreruperea, cazul care aceasta a fost acceptat. Structura cuv n n a ntului este urmtoarea: a D7 D6 D5 D4 D3 D2 D1 D0 V7 V6 V5 V4 V3 V2 V1 0 unde: - D0 identic vectorul de a ntrerupere; - D1-D7 reprezint vectorul de a ntrerupere xat de utilizator.

50

LUCRAREA 4. APLICATII CU CIRCUITUL Z80-PIO

Programarea unui port modul 3 necesit un cuv de control, vector de n a nt ntrerupere (dac a ntreruperile s activate) i a trei cuvinte care vor descrise continuare. nt s nc n Cuv ntul registrului de control intrare/ieire denete care linii ale portului s intrri i care s s nt a s s ieiri. Structura cuv nt s ntului este urmtoarea: a D7 D6 D5 D4 D3 D2 D1 D0 unde: - un bit 0 denete o ieire; s s - un bit 1 denete o intrare. s modul 3 semnalele conversationale nu s folosite. In nt Intreruperile s generate ca functii nt logice aplicate liniilor considerate intrri. a Cuv ntul de control al ntreruperii xeaz conditiile i nivelele logice necesare generrii sem a s a nalului de ntrerupere. Structura cuv ntului este urmtoarea: a D7 D6 D5 D4 D3 D2 D1 D0 I3 I2 I1 I0 0 1 1 1 unde: D3 D4 D5 D6 D7 - D0 identic cuv a ntul de control al ntreruperii = 0 - nu urmeaz cuvnt masc, 1 - urmeaz cuv masc a a a a nt a = 0 - semnale active stare Low, 1 - semnale active stare High n n = 0 - ntrerupere la functia SAU logic, 1 - ntrerupere la functia SI logic = 0 - dezactivare ntreruperi, 1 - activare ntreruperi.

Cuv ntul masc permite ca orice bit nefolosit din port s e mascat. Dac se dorete acest a a a s lucru, atunci bitul D4 din cuv ntul de control al ntreruperii trebuie setat, iar urmtorul cuv a nt scris port trebuie s e cuv n a ntul masc. Structura cuv a ntului este urmtoarea: a D7 D6 D5 D4 D3 D2 D1 D0 unde un bit este monitorizat dac este denit ca ieire, iar bitul masc este pus 0 logic. a s a n Pentru invalidarea ntreruperilor unui port se poate folosi cuv ntul de dezactivare ntreruperi. Se poate utiliza fr a schimba restul cuv aa ntului de control al ntreruperilor i acest mod s n continutul bistabilului de validare a ntreruperilor. Structura cuv ntului este urmtoarea: a D7 D6 D5 D4 D3 D2 D1 D0 I X X X 0 0 1 1 unde: - D3-D0 identic cuv a ntul de dezactivare ntreruperi - D4-D6 pot lua orice valori - D7 = 0 - invalidare ntreruperi, 1 - validare ntreruperi. Dac apare o cerere de a ntrerupere, timp ce procesorul n nscrie cuv ntul de dezactivare a ntreruperilor PIO (03H), poate s apar o problem sistem. Dac n a a a n a ntreruperile s valint date de procesor, acesta va accepta ntreruperea cerut de PIO. Totui acest timp circuitul a s n

4.1. INTERFATA PARALELA PROGRAMABILA Z80-PIO

51

PIO, primind cuv ntul de dezactivare a ntreruperilor nu va trimite vectorul de ntrerupere n timpul ciclului de recunoatere a s ntreruperilor. Ca urmare, procesorul va prelua de pe magistrala de date, un vector eronat. Solutia pentru evitarea acestor erori este s se dezactiveze a ntreruperile procesor cu o instructiune DI, chiar n nainte de dezactivarea ntreruperilor circuitului PIO, i s se valideze din nou s a ntreruperile cu o instructiune EI, dup aceea. Aceasta a determin procesorul s ignore eventualele cereri de a a ntrerupere de la circuitul PIO timpul n dezactivrii lui. a

4.1.7

Intrebri a

I. Descrieti modurile de functionare ale circuitului PIO. II. Dati un exemplu de programare al circuitului PIO modul 3 cu portul B ca port de n ieire. s Rspuns: a LD OUT INC OUT A, 0FFH (83H), A A (83H), A

III. Cum se programeaz circuitul Z80-PIO? a IV. Cum se poate realiza un transfer ntre PIO i un periferic, fr s a a ntreruperi?

4.1.8

Aplicatie: Comanda motorului de curent continuu

Programul va contine trei prti, prezentate gura 4.4: a n programarea circuitului PIO, comanda motorului, procedura de rziere. nt

Programarea circuitului PIO: Portul B al circuitului este legat la portul de intrare al plcii a de aplicatii. Acest port va trebui comandat pentru a trimite date plcii. Deoarece nu este a nevoie de semnalele de conversatie ale portului, i nici de un vector de s ntrerupere, portul B al circuitului PIO va programat mod bit, cu numai dou cuvinte de comand. n a a Primul cuv cuv nt, ntul de selectare a modului de operare, va 0FFH. Cel de-al doilea cuv cuv nt, ntul registrului de control intrare/ieire, va 00H (adic toti bitii portului s a s biti de ieire). nt s Comanda motorului: Motorul de curent continuu de pe placa de aplicatii poate comandat cu ajutorul bitilor 6 i 7 ai portului de intrare, care este legat la portul B al circuitului s PIO. Motorul poate pornit, caz care accelereaz p a la viteza maxim, sau oprit. n a n a Semnicatia bitilor de comand este prezentat tabelul 4.1. a a n

52

LUCRAREA 4. APLICATII CU CIRCUITUL Z80-PIO


Initializare circuit PIO

Comanda motor inainte Procedura Oprire motor de intirziere Comanda motor inapoi

Oprire motor

Figura 4.4: Etapele de programare Bit 7 0 0 1 1 Bit 6 0 1 0 1 Actiune Motor oprit Micare s nainte Micare s napoi Motor oprit

Tabelul 4.1: Semnicatia bitiilor de comand. a Procedura de rziere: Durata buclei de rziere se calculeaz cunosc frecventa de nt nt a nd ceas a sistemului i numrul de perioade de ceas necesare instructiunilor. Frecventa s a sistemului este 1.79 MHz, de unde rezult c perioada ceasului este 0.5586 ms ( calcule se a a n consider 0.56 ms). continuare se va programa o bucl de rziere de 1 s. Instructiunea a In a nt DEC consum 4 perioade de ceas, iar instructiunea JP NZ, nn consum 10 perioade de a a ceas, deci este nevoie de 14255 = 3570 perioade de ceas pentru a decrementa un registru care contine data 0FFH p a la 0. Deci s necesare 2553570 = 910350 perioade de ceas n nt pentru a decrementa un registru care contine data 0FFFFH p a la 0. Aceast operatie n a dureaz 0.56ms 910350 = 0.509796s. Prin urmare, realiz aceast operatie de dou a nd a a ori, se obtine o rziere de aproximativ 1 s. nt Programul scris n limbaj de asamblare ****; 1800 1800 1802 comanda motorului 1s nainte, 1s stop, 1s napoi ^ ^ ORG LD OUT 1800H A,0FFH (83H),A

3E FF D3 83

; programare circuit PIO ; mod 3

4.1. INTERFATA PARALELA PROGRAMABILA Z80-PIO 1804 1805 1807 1809 180B 180E 180F 1811 1814 1816 1818 181B 181C 181E 1821 1824 1826 1829 182A 182D 182E 1831 1832 1835 3C D3 3E D3 CD AF D3 CD 3E D3 CD AF D3 CD C3 2E 01 0D C2 05 C2 2D C2 C9 83 40 START: 81 24 18 81 24 18 80 81 24 18 81 24 18 07 18 02 DELAY: FF FF LOOP2: LOOP1: 29 18 29 18 26 18 INC A OUT (83H),A LD A,40H OUT (81H),A CALL DELAY XOR A OUT (81H),A CALL DELAY LD A,80H OUT (81H),A CALL DELAY XOR A OUT (81H),A CALL DELAY JP START LD L,2 LD BC,0FFFFH DEC C JP NZ,LOOP1 DEC B JP NZ,LOOP1 DEC L JP NZ,LOOP2 RET END ; ; ; ; ; ; ; ; ; ; ; ; ; ; A=0 B port de ieire s bit 6 = 1, micare nainte s ^ trimis la port B apel procedur nt^rziere (1 s) a ^ A=0 oprire motor repaus 1 s bit 7 = 1, micare napoi s ^ timp de 1 s A=0 oprire motor repaus 1 s reia ciclul

53

; aproximativ 1/2 s ; repet p^n C=0 a a ; repet p^n B=0 a a ; nt^rzie nc 1/2 s ^ ^ a ; ntoarcere n program ^ ^

Inainte de a executa programul pe machet, comutatorul SW2-2 trebuie xat pe pozitia MOa TOR.

4.1.9

Experimente:

I. Comandati motorul de curent continuu de pe placa de aplicatii conform gracului din gura 4.5.
Viteza de rotatie 5 2 3 4 Timp

Figura 4.5: Grac de functionare a motorului de curent continuu. II. Cum se poate obtine comanda motorului de curent continuu astfel t s se obtin o nc a a pant de vitez? Realizati un program care s comande motorul conform gracului din a a a gura 4.6. Figura prezint atit prolul de vitez ideal c i cel real pentru motorul de a a t s curent continuu.

54

LUCRAREA 4. APLICATII CU CIRCUITUL Z80-PIO

Viteza

Viteza

Timp

Timp

Figura 4.6: Gracul ideal (a) i real (b) regim accelerat/decelerat. s n

Lucrarea 5 Aplicatii cu circuitul Z80-CTC


Aceast lucrare prezint circuitul numrtor/temporizator Z80-CTC i modul de utilizare a a a aa s acestuia.

5.1

Prezentare general i arhitectura intern a circuia s a tului Z80-CTC

Z80-CTC (Counter/Timer Circuit - engl.) este un circuit cu patru canale ce pot functiona mod numrtor sau temporizator. Acest circuit poate folosit pentru o gam larg de n aa a a aplicatii de numrare: numrare de evenimente, cronometrri de intervale de timp, generare de a a a ntreruperi i generarea unui semnal de ceas. Cele patru canale s programabile independent s nt dou moduri de lucru. Circuitul Z80-CTC se conecteaz direct (pin la pin) la circuitul micron a a procesor Z80-CPU. Fiecare canal se programeaz cu doi octeti de comand. C se activeaz a a nd a ntreruperile, este necesar a un octet suplimentar ce semnic vectorul de nc a ntrerupere. Dup a programare, circuitul numr descresctor p a la zero. Apoi, se re aa a n ncarc automat (dintr-un a registru) i reia procesul de numrare descresctoare. Prin utilizarea circuitului CTC se pot s a a elimina buclele de rziere implementate prin program. Lucrul cu nt ntreruperile este simplicat, deoarece circuitului i se trimite un singur vector de ntrerupere, iar acesta genereaz intern c a te un vector pentru ecare canal. Semnalul de ceas monofazic este primit de la procesor. Figura 5.1 prezint structura intern a circuitului Z80-CTC. Simbolul circuitului este prezentat a a n gura 5.2.

5.1.1

Semnicatia pinilor circuitului Z80-CTC

Semnale generale: CLK (System Clock) - Semnal de ceas comun tuturor circuitelor din sistemul cu microprocesor Z80. /RESET (Reset) - Semnal de initializare. Activarea acestui semnal conduce la terminarea tuturor actiunilor de numrare descresctoare i dezactivarea tuturor a a s ntreruperilor. Bitii de ntrerupere din registrele de control ale canalelor s resetati. Ieirile de nt s ntreruperi i ZC/TO s devin inactive. IEO ia valoarea lui IEI. Magistrala de date este trecut starea de a n nalt a impedant. a 55

56

LUCRAREA 5. APLICATII CU CIRCUITUL Z80-CTC


LOGICA INTERNA
DATE D0-D7 ZERO COUNT/TIMERO

NCE COMENZI NM1 6 NIORQ NRD CH.SEL.0 CH.SEL.1

I N T E R F A T A

CANAL 3

CLOCK/TRIGGER 0 ZERO COUNT/TIMERO

DE COMANDA CANAL 3
CLOCK/TRIGGER 1 ZERO COUNT/TIMERO

CANAL 3 BLOC DE COMANDA INTRERUPERI 3


LINII INTRERUPERI

CLOCK/TRIGGER 2

CANAL 3

CLOCK/TRIGGER 3

IN.EN.IN IN.EN.OUT NINT

Figura 5.1: Structura intern a circuitului Z80-CTC. a Magistrala de date: D0-D7 (System Data Bus) - Magistral bidirectional, conectat la magistrala de date a proa a a cesorului. Semnalele de control (primite de la procesor): CS0-CS1 (Channel Select) - Semnale care formeaz o adres de doi biti cu care se selecteaz a a a unul din cele patru canale ale circuitului pentru o operatie de scriere sau citire. De obicei, aceti pini se leag la pinii A0-A1 ai magistralei de adrese a procesorului. Modul de selectie a s a canalelor este prezentat tabelul 5.1. n CS1 CS0 0 0 0 1 1 0 1 1

Ch0 Ch1 Ch2 Ch3

Tabelul 5.1: Selectia canalelor cu bitii CS0 i CS1. s /CE (Chip Enable) - Semnal de validare a chip-ului. Semnalul este activat c circuitul accept nd a cuvinte de control, vectori de ntrerupere sau constante de timp de pe magistrala de date, n timpul unui ciclu de scriere la dispozitivele de intrare/ieire sau c se transmite procesorului s nd continutul unui numrtor timpul unui ciclu de citire de la dispozitivele de intrare/ieire. aa n s In majoritatea aplicatiilor, acest semnal este decodicat din cei mai putin semnicativi opt biti ai magistralei de adrese pentru oricare din cele patru adrese de intrare/ieire care s asociate s nt celor patru canale ale circuitului. /M1 (Machine Cycle 1) - Semnal provenit de la pinul /M1 al procesorului. C /M1 i /IORQ nd s s active, procesorul Z80 accept o nt a ntrerupere. Apoi, dac are prioritatea cea mai mare i a s dac unul din canale a cerut o a ntrerupere (prin activarea semnalului /INT), circuitul CTC

5.1. PREZENTARE GENERALA SI ARHITECTURA INTERNA A CIRCUITULUI Z80-CTC57


25 26 27 28 1 2 3 4 16 18 19 14 10 6 13 11 12 15 CLK/TRG0 ZC/TO0 23 7

Magistrala de date a procesorului (8 biti)

D0 D1 D2 D3 D4 D5 D6 D7 /CE CS0 CS1 /M1 /IORQ /RD IEI IEO /INT CLK

CLK/TRG1 ZC/TO1

22 8

Semnale ale

Chip Enable Channel Select 0 Channel Select 1 Machine Cycle 1 I/O Request Read In.En.In In.En.Out Interrupt Request Clock

CLK/TRG2 ZC/TO2

21 9

canalelor

CLK/TRG3

20

/RESET

17

Z80 - CTC
Figura 5.2: Simbolul circuitului Z80-CTC.

plaseaz vectorul de a ntrerupere pe magistrala de date. /IORQ (Input/Output Request) - Semnal provenit de la pinul /IORQ al procesorului. Semnalul este folosit conjunctie cu /CE i /RD pentru a transfera date i cuvinte de control pentru n s s canale ntre procesor i CTC. timpul unui ciclu de scriere, semnalele /IORQ i /CE trebuie s In s s e active, iar semnalul /RD trebuie s e inactiv. Circuitul CTC nu primete un semnal a a s specic de scriere, ci si genereaz unul intern din inversul unui semnal /RD. a Intr-un ciclu de citire, /IORQ, /RD i /CE trebuie s e active pentru ca procesorul s poat citi continutul s a a a unui numrtor. aa /RD - (Read Cycle Status) - Semnal provenit de la pinul /RD al procesorului. Semnalul este folosit conjunctie cu /IORQ i /CE pentru a transfera date i cuvinte de control n s s ntre CTC i procesor. s Semnale de ntrerupere: IN.EN.IN (IEI) - (Interrupt Enable In) - Un semnal cu valoare logic 1 pe aceast linie semnic a a a faptul c nici un alt dispozitiv periferic cu prioritate mai mare lantul de a n ntreruperi nu este deservit de ctre procesor. a IN.EN.OUT (IEO) - (Interrupt Enable Out) - Semnal folosit conjunctie cu IEI pentru a forma n un sistem de ntreruperi ierarhizat. Linia este 1 logic numai dac linia IEI este aceeai stare n a n s i procesorul nu deservete o s s ntrerupere de la unul din canalele circuitului. Semnalul blocheaz a dispozitivele cu prioritate mai mic pentru ca acestea s nu poat a a a ntrerupe un dispozitiv cu prioritate mai mare timp ce este deservit de procesor. n /INT - (Interrupt Request) - Semnal activ c numrtorul unui canal al circuitului CTC, nd aa programat s activeze semnalul de a ntrerupere, a ajuns la zero.

58 Semnalele canalelor:

LUCRAREA 5. APLICATII CU CIRCUITUL Z80-CTC

CLK/TRG0-CLK/TRG3 - (External Clock/Timer Trigger) - Patru semnale ce corespund celor patru canale ale circuitului. mod numrtor, ecare front activ pe acest pin decrementeaz In a a a mod timer, un front activ al semnalului pornete timerul. Utilizatorul poate numrtorul. In aa s selecta frontul activ e cresctor, e descresctor. a a ZC/TO0-ZC/TO2 - (Zero Count/Timeout) - Trei semnale ce corespund canalelor 0-2 ale circuitului. ambele moduri, ieirea prezint un impuls cu valoare 1 logic c numrtorul In s a nd aa ajunge la zero. Functiile semnalelor de la pinii circuitului Z80-CTC s prezentate centralizat tabelul 5.2. nt n Functie Semnale generale CLK Tact sistem /RESET Reset sistem Magistral de date a D0-D7 Bus date Semnale de control CS0-CS2 Selectie canal /CE Validare chip /M1 Ciclu main 1 s a /IORQ Cerere I/O /RD Citire Semnale de ntrerupere IEI Activare ntreruperi IEO Inactivare ntreruperi /INT Cerere de ntrerupere Semnale ale canalelor CLK/TRG0-CLK/TRG3 Ceas extern ZC/TO0-ZC/TO2 Sf sit numrare r a Nume Tip Intrare Intrare Bidir. 3-stri a Intrare Intrare Intrare Intrare Intrare Intrare Ieire s Intrare Intrare Intrare

Tabelul 5.2: Functiile pinilor circuitului Z80-CTC.

5.1.2

Structura unui canal

Un canal este compus din dou registre de c opt biti, dou numratoare i logic de control. a te a a s a Un registru este folosit pentru a memora constanta de timp, iar cellalt pentru a memora modul a de lucru i parametrii canalului. Un numrtor descresctor pe 8 biti poate citit de ctre s aa a a procesor. Un alt numrtor de opt biti implementeaz un divizor de frecvent al semnalului aa a a de ceas. Figura 5.3 prezint structura unui canal al circuitului Z80-CTC. a Registrul de control al canalului este nscris de ctre procesor pentru a selecta modul de lucru a i parametrii canalului. circuit s patru asemenea registre, corespunz celor patru canale s In nt nd Selectarea registrului care se scrie se face cu pinii CS1 i CS0. n s Divizorul este folosit numai modul timer. Acesta este un dispozitiv de numrare pe 8 biti n a care este programat de procesor prin registrul de control al canalului, el diviz semnalul de nd

5.2. MODURILE DE LUCRU ALE CIRCUITULUI Z80-CTC


REGISTRU COMANDA CANAL SI LOGICA 8 MAGISTRALA INTERNA CTC REGISTRUL CONSTANTEI DE TIMP (8 BITI)

59

8 CLK DIVIZOR (8 BITI) EXTERNAL CLOCK/TIMER TRIGGER NUMARATOR DESCRESCATOR (8 BITI) ZERO COUNT/TIMEOUT

Figura 5.3: Schema bloc a unui canal a circuitului Z80-CTC. intrare (ceasul sistemului). Ieirea divizorului este folosit ca intrare de ceas pentru numrtorul s a aa descresctor. Registrul constantei de timp este un registru de 8 biti folosit ambele moduri de a n functionare. Acest registru este nscris imediat dup registrul de control al canalului. Constanta a de timp este o valoare ntreag a ntre 1 i 256 (256 este codicat cu 8 biti de zero). Aceast s a constant este automat arcat numrtorul descresctor atunci c canalul este initializat a nc a n aa a nd sau de ecare dat c numrtorul ajunge la zero. a nd aa Numrtorul descresctor este un dispozitiv de numrare pe 8 biti folosit ambele moduri aa a a n de functionare. Inainte de ecare ciclu de numrare el este arcat cu valoarea continut a nc a registrul constantei de timp. Numrtorul este decrementat pe frontul activ al ceasului n aa extern modul numrtor sau pe cel al ieirii de ceas dat de divizor. Valoarea continut n aa s a a numrtor poate citit de ctre procesor orice moment printr-o operatie de citire de n aa a a n la adresa portului ce a fost asociat canalului respectiv. Canalele 0, 1 i 2 pot programate s ca atunci c ajung la zero s genereze o nd a ntrerupere. Datorit limitrilor de pini, canalul 3 a a nu are aceast posibilitate. Canalul 3 poate folosit numai aplicatiile care nu trebuie s a n a genereze semnal de ntrerupere.

5.2

Modurile de lucru ale circuitului Z80-CTC

La punerea sub tensiune, starea circuitului Z80-CTC este necunoscut. Prin activarea sema nalului /RESET se aduce circuitul ntr-o stare initial, cunoscut. Pentru a putea folosi un a a canal pentru numrare, acesta trebuie programat cu un cuv de control i o constant de a nt s a timp. Dac un canal a fost programat s activeze semnalul de a a ntrerupere, trebuie programat i un vector de s ntrerupere. Dup programarea unui canal prin trimiterea cuvintelor de control, a acesta va ncepe s functioneze conform modului programat: numrtor sau timer. a a a Modul numrtor a a modul numrtor circuitul numr fronturile active ale intrrii de ceas extern CLK/TRG. In a a aa a Circuitul numrtor este arcat cu constanta de timp i la ecare eveniment extern este aa nc s decrementat p a c ajunge la zero. Numrtoarele 0, 1 i 2 pot programate s genereze n nd aa s a acelai timp, s arcate automat cu valoarea continut o ntrerupere acel moment. In n s nt nc a

60

LUCRAREA 5. APLICATII CU CIRCUITUL Z80-CTC

registrul constantei de timp, fr s se n aa a ntrerup procesul de numrare. Dac registrul a a a n constantei de timp se nscrie o nou valoare timp ce numrtorul functioneaz, se termin a n aa a a mai i numrtoarea curent i abia apoi se va arca noua valoare numrtor. nt aa as nc n aa Modul timer modul timer circuitul genereaz semnale cu perioada multiplu de perioada ceasului sistem. In a Pentru a realiza acest lucru s folosite divizoarele aferente ecrui canal. Divizarea ceasului nt a sistem se face dou etape: prima divizor (cu 16 sau 256), iar a doua numrtor (cu n a n n aa valoarea nscris registrul constantei de timp). Si acest mod numrtoarele 0, 1 i 2 pot a n n aa s genera o ntrerupere atunci c ajung la zero. Se obtine un semnal cu perioada: nd tC D CT unde: tC este perioada ceasului sistem, D este factorul de divizare programat, a CT este constanta de timp programat. Circuitul poate programat s numere imediat dup ce a fost initializat (numrtoarea pornete a a aa s odat cu ciclul procesor ce urmeaz celui care a fost a a n nscris registrul constantei de timp) sau la frontul activ al semnalului de triggerare CLK/TRG (numrtoarea aa ncepe la al doilea front activ al semnalului de trigerare, dup ce a fost arcat constanta de timp). a nc a

5.3

Blocul de comand a a ntreruperilor

Blocul de comand a a nteruperilor asigur interfatarea a ntreruperilor circuitului CTC cu sistemul de ntreruperi ierarhizate al procesorului Z80. Semnalele cu care se asigur corelarea cu a timp ce o cerere de celelalte dispozitive periferice s IEI i IEO. In nt s ntrerupere a circuitului CTC este deservit de procesor, blocul de comand a a a ntreruperilor ine semnalul IEO 0 t n logic, inhib astfel nd ntreruperile dispozitivelor mai putin prioritare. C IEI devine 0, blocul nd de comand a a ntreruperilor poate genera o ntrerupere. Figura 5.4 prezint strucura unui lant a de ntreruperi cu prioriti ierarhizate. at
Dispozitiv cu prioritatea cea mai mare 5V Hi IEI IEO Disp. 0 Hi IEI Disp 1 IEO Hi IEI IEO Disp 2 Hi IEI IEO Disp 3 Dispozitiv cu prioritatea cea mai mica

Figura 5.4: Lant de dispozitive cu prioriti ierarhizate. at Dac un canal este programat s genereze o a a ntrerupere, blocul de comand a a ntreruperilor pune linia IEO 0 logic atunci c numrtorul canalului respectiv ajunge la zero. Simultan, n nd aa se activeaz semnalul /INT. La rspunsul procesorului (/M1 i /IORQ), acest bloc pune pe a a s magistrala de date vectorul de ntrerupere corespunztor canalului care a generat a ntreruperea. Totodat, acest bloc arbitreaz prioritile a a at ntreruperilor circuitul CTC. Sistemul este identic n cu cel al procesorului Z80, canalul 0 av prioritatea cea mai ridicat. Blocul de comand nd a a

5.4. INITIALIZAREA CIRCUITULUI Z80-CTC

61

a ntreruperilor monitorizeaz magistrala de date i decodic instructiunea de a s a ntoarcere din ntrerupere (RETI). Dac o a ntrerupere este ateptare, blocul ine semnalul IEO 0 logic. n s t n C apare instructiunea RETI (2 octeti), dispozitivul comut linia IEO 1 logic pe durata nd a n unui ciclu main (M1) ca s se asigure c dispozitivele cu prioritate mai mic vor decodica s a a a a ntreaga instructiune RETI i se vor initializa corespunztor. s a

5.4

Initializarea circuitului Z80-CTC

Circuitul Z80-CTC are dou moduri de initializare: hardware i software. a s Initializarea hardware ncheie toate operatiile de numrare. acest caz, au loc urmtoarele a In a actiuni: dezactivarea tuturor ntreruperilor circuitului CTC i resetarea bitilor de s ntrerupere din registrele de control ale canalelor; inactivarea semnalelor ZC/TO i INT; s semnalul IEO ia valoarea semnalului IEI; magistrala de date este trecut starea de a n nalt impedant. a a Toate canalele trebuie s e complet reprogramate dup acest tip de initializare. a a Initializarea software este controlat de bitul 1 din registrul de control al canalului. C un a nd canal este initializat software se oprete numrarea. momentul initializrii software, ceilalti s a In a biti din cuv ntul de control modic parametrii canalului. Dup o astfel de initializare trebuie a a nscris o nou constant de timp registrul corespunztor al aceluiai canal. a a a n a s

5.5

Programarea circuitului Z80-CTC

Fiecare canal al circuitului trebuie programat nainte de functionare. Programarea const a n nscrierea a dou cuvinte de control la adresa portului ce corespunde canalului dorit. Primul a cuv de control selecteaz modul de operare i parametrii canalului. Al doilea cuv reprezint nt a s nt a constanta de timp, care este o dat binar cu valoare a a ntre 1 i 256. Constanta de timp trebuie s s e precedat de cuv a a ntul de control al canalului. Dup initializare, canalele pot reproa gramate la orice moment. Dac pentru un canal s activate a nt ntreruperile, atunci mai este nevoie de un cuv de comand ce reprezint vectorul de nt a a ntrerupere. Este necesar un singur vector de ntrerupere, deoarece circuitul genereaz intern vectori diferiti pentru ecare canal. a Structura cuv ntului de control pentru un canal este urmtoarea: a D7 D6 D5 D4 D3 D2 D1 1

Bitii au urmtoarea semnicatie: a - D0 = 1 identicator pentru cuv ntul de control; - D1 = 0 - continuarea functionrii, 1 - initializare software; a

62

LUCRAREA 5. APLICATII CU CIRCUITUL Z80-CTC

- D2 = 0 - nu urmeaz constanta de timp, 1 - urmeaz constanta de timp; a a - D3 = 0 - triggerare automat dup arcarea constantei de timp, 1 - triggerare extern cu a a nc a semnalul CLK/TRG; - D4 = 0 - frontul activ este descresctor, 1 - frontul activ este cresctor; a a - D5 = 0 - factorul de divizare are valoarea 16, 1 - factorul de divizare are valoarea 256; - D6 = 0 - functionare mod timer, 1 - functionare mod numrtor; n n aa - D7 = 0 - dezactivare ntreruperi, 1 - activare ntreruperi. Intreruperile pot programate orice mod de functionare i pot activate sau dezactivate n s n orice moment. Reprogramarea frontului activ al semnalului CLK/TRG timpul functionrii n a este echivalent cu inserarea unui front activ semnal. Dac numrtorul ateapt un evenia n a aa s a ment timpul reprogramrii ( ambele moduri), aceasta nu va interveni procesul de n a n n numrare. Odat pornit, numrtorul functioneaz ne a a aa a ntrerupt p a este oprit prin initializare. n Numrtorul nu poate functiona fr o constant de timp. Aceasta se aa aa a nscrie registrul coresn punztor urma unui cuv de control care are bitul 2 setat. Structura cuv a n nt ntului de cod care stabilete constanta de timp este urmtoarea: Cei 8 biti codic un numr binar s a a a ntre 1 i 256. s CT7 CT6 CT5 CT4 CT3 CT2 CT1 CT0

Valoarea 0 pe toti cei 8 biti semnic o constant de timp egal cu 256. Dac Z80-CTC are a a a a una sau mai multe ntreruperi activate, atunci trebuie s i se furnizeze un vector de a ntrerupere. Din acest cuv trebuie programati numai cei mai semnicativi 5 biti, deoarece ceilalti 3 biti nt s completati de circuitul CTC. Structura cuv nt ntului de stabilire a vectorului de ntrerupere este urmtoarea: a D7 D6 D5 D4 D3 D2 V7 V6 V5 V4 V3 CS1 D1 CS0 D0 0

unde: - D0 = 0 identicatorul vectorului de ntrerupere, - CS1-CS0 reprezint semnalele de selectie a canalelor (automat introdui de circuitul CTC), a s - V7-V3 cei 5 biti programati de ctre utilizator. a

5.5.1

Realizarea unui ceas folosind circuitul Z80-CTC

Realizarea ceasului implic trei etape: a programarea circuitului Z80-CTC, scrierea rutinei de servire a ntreruperii, actualizarea i aarea orei (numerele binare vor convertite cod BCD pentru a uura s s n s citirea orei. Programul este conceput astfel t s se nc a nceap msurarea timpului de la o ora prestabilit. a a a Aceast ora poate stabilit modic valorile initiale din buer-ul de timp. a a nd

5.5. PROGRAMAREA CIRCUITULUI Z80-CTC Programarea circuitului Z80-CTC

63

Pentru acest program este nevoie de un singur canal al circuitului CTC, folosit modul timer. n Ceasul timer-ului va ceasul sistemului. Problema principal va msurarea secundei. Vom a a considera factorul de divizare 256. Ram problema stabilirii constantei de timp. ne 256 0.56s = 0.00014336s 1/0.00014336 = 6975.446428571 6975.446428571/218 = 31.99746068152 Deci, 32 218 256 0.56s = 1.00007936s, o aproximare destul de bun a secundei. Eroarea a este de 0.08ms la o secund, adic aproape 8 secunde la 24 ore. Prin urmare programarea a a circuitului CTC se va face cu trei cuvinte astfel: cuv ntul de control canalului 101101012 = 0B5H b7=1 ntreruperi activate, b6=0 mod timer, b5=1 factor de divizare 256, b4=1 numrare la front cresctor, a a b3=0 folosirea ceasului intern, b2=1 urmeaz constanta de timp, a b1=0 nu se reseteaz numrtorul, a aa b0=1 identicarea cuv ntului de control

constanta de timp 21810 = 0DAH Inmultirea cu al treilea factor - 32 - se va face rutin de n a servire a ntreruperii, imcrement contorul secundelor numai c contorul nd nd ntreruperilor ajunge la 32. vectorul de ntrerupere 0A8H prealabil registrul I va arcat cu valoarea 18H, deoarece In nc memoria disponibil utilizatorului se a a a ntre adresele 1800-1F9FH. Actualizarea i aarea orei s s rutina de servire a In ntreruperii se va testa conditia de scurgere a unei secunde (contorul ntreruperilor are valoarea 32). Dup trecerea unei secunde se va incrementa contorul secundelor a i se va testa depirea valorii maxime pentru secunde, minute i ore (60, 60 respectiv 12 sau s as s 24). Dup incrementarea unui contor, se va face i ajustarea zecimal a numerelor. cazul a s a In atingerii valorii maxime pentru un contor, acesta va lua valoarea zero i va incrementat s contorul unitii de msur superioare (dac este posibil). Aarea orei se face convertind at a a a s mai i numerele din buer-ul de aare formatul de aare cu 7 segmente, dup care se nt s n s a apeleaz procedura SCAN. Cifrele care reprezint orele, minutele i secundele vor desprtite a a s a gura 5.5 este prezentat schema logic a programului. de puncte zecimale. In a a

5.5.2

Intrebri: a

I. Care s conditiile de scriere/citire pentru circuitul CTC-Z80? nt Rspuns a Din punct de vedere hardware conditiile pentru scrierea/citirea circuitului CTC-Z80 s nt urmtoarele: a

64

LUCRAREA 5. APLICATII CU CIRCUITUL Z80-CTC


START

Programare CTC Canal 0 Constanta de timp Vector de intrerupere

IX <- BUFFER_AFISARE Call SCAN

Intrerupere

Call CONTORIZARE

Actualizare BUFFER_TIMP

Actualizare BUFFER_AFISARE

RETI

Figura 5.5: Schema logic a programului. a - pentru scriere: semnalele /IORQ i /CE active, /RD inactiv. Circuitul CTC-Z80 s genereaz intern semnalul de citire din inversul semnalului /RD. a - pentru citire: /IORQ, /CE, /RD active. II. Care este structura unui canal? Pot folosite toate cele patru canale sistem de n ntreruperii? Rspuns a Fiecare canal este compus din dou registre de 8 biti, dou numrtoare i logic de cona a aa s a trol. Un numrtor este folosit ca numrtoar descresctor iar altul ca divizor. Registrele aa aa a folosesc pentru memorarea constantei de timp i pentru setarea modului de lucru. s Datorit limitrii numrului de pinii, canalul 3 nu se poate folosi sistemul de a a a n ntreruperi. III. C se activeaz semnalul de nd a ntrerupere /INT? Rspuns a

5.5. PROGRAMAREA CIRCUITULUI Z80-CTC

65

Semnalul de ntreruperi este activat de ecare dat c numrtorul canalului respectiv a nd aa ajunge la zero. IV. Care s modurile de lucru ale CTC-Z80 i care s conditiile de programare? nt s nt Rspuns a Modurile de lucru ale CTC-Z80 s nt: mod numrtor i aa s mod timer. Programarea circuitului pentru canalul 0 se face urmtorul mod: n a CTC0 EQU 40H LD LD LD OUT LD OUT LD OUT IM EI A,18H I,A A,10110101B (CTC0),A A,020H (CTC0),A A,0A8H (CTC0),A 2

Adresele celor 4 canale s 40H, 41H, 42H i 43H. Cuv nt s ntul de control ind 10110101B, canalul 0 este programat mod timer, factorul de divizare este 256. CTC va genera o n ntrerupere dup 8192 (256 32) tacte, constanta de timp ind 020H. a

5.5.3

Experimente

I. Programati canalului 2 al circuitului CTC-Z80 mod numrtor? n aa II. Studiati urmtorul program ce implementeaz un ceas, conform schemei logice prezentate a a gura 5.5. Numrarea secundelor se face cu ajutorul circuitului CTC. n a *****; Program care implementeaz un ceas a *****; Pentru msurarea unei secunde se folosete circuitul CTC a s ORG CTC0 SCAN HEX7SG START: LD A,18H LD I,A *****; se completeaz cu programarea CTC, canalul 0 a 1800H 40H ; adresa portului la care se gsete canalul 0 a s 05FEH ; adresa rutinei de afiare s 0678H ; adresa rutinei de conversie pentru afiare s

EQU EQU EQU

66

LUCRAREA 5. APLICATII CU CIRCUITUL Z80-CTC .... *****; MAIN: LD IX,BUFFER_AFISARE CALL SCAN ; apel procedur SCAN a JR MAIN *****; rutina de contorizare CONTORIZARE: LD DE,BUFFER_TIMP LD A,(DE) ; INC A ; LD (DE),A ; CP 20H ; LD B,4 ; RET NZ XOR A ; DEC B ; LD (DE),A ; INC DE LD HL,VALORI_MAXIME; ; LOOP: LD A,(DE) ; ; INC A DAA ; LD (DE),A ; SUB (HL) ; RET C ; LD (DE),A INC HL ; ; INC DE ; DJNZ LOOP RET

se citete contorul ntreruperilor din buffer s ^ se numr ntreruperile a a ^ se salvez contorul actualizat a ntr-o secund apar 32 (20H) ntreruperi ^ a ^ contor si indicator pentru scurgerea secundei A=0 B=3 (contor) resetarea contorului de ntreruperi ^ se ncarc adresa tabelei cu ^ a valori maxime n HL ^ se ncarc n A numrul de secunde, ^ a ^ a minute sau ore ajustare zecimal a acumulatorului a actualizare buffer de timp verificarea depsirii valorilor maxime a ieire n caz de nedepsire a limitelor s ^ a dac se depsesc limitele, se crete a a s unitatea urmtoare a si se aduce la 0 cea curent a

*****; procedura de conversie a bufferului de afiare s CONVERSIE_7SEG: LD HL,BUFFER_AFISARE ; se pregtete rutina de conversie a s LD DE,SECUNDE LD B,3 ; contor LOOP2: LD A,(DE) ; conversie buffer de timp CALL HEX7SG INC DE DJNZ LOOP2 DEC HL

5.5. PROGRAMAREA CIRCUITULUI Z80-CTC DEC SET DEC DEC SET RET HL 6,(HL) HL HL 6,(HL) ; se setezaz punctul zecimal pt. ore a

67

; se setezaz punctul zecimal pt. minute a

*****; rutina de servire a ntreruperii ^ ORG DEFW 18A8H INTRERUPERE

; la aceast adres se afl adresa de ntrerupere a a a ^

*****; nceput a rutinei de ntrerupere ^ ^ INTRERUPERE: *****; se salvez registrele care vor fi afectate n stiv a ^ a CALL LD CP CALL CONTORIZARE ; apelul rutinei care msoar timpul a a A,B 4 ; se verific dac a trecut 1 s a a NZ,CONVERSIE_7SEG ; conversia buffer-ului de timp

*****; rutina pentru afiare s *****; restaurare registre, activare ntreruperi, revenire din ntreruperi ^ ^ *****; tabela de valori maxime *****; se completeaz cu valorile pentru secunde, minute si ore a *****; valorile s^nt hexazecimale pt. c si cele cu care se compar s^nt a a *****; ajustate BCD pt. afiare s *****; buffer-ul de afiare s BUFFER_AFISARE: DEFS 6 ; pt. afiare este nevoie de spatiu pt. 6 caractere s END III. Completati programul cu prtiile comentate. a IV. Ce se va aa pe display dac se modic valorile din tabela de valori maxime? s a a V. C tacte de ceas s necesare pentru a contoriza o secund? te nt a

68

LUCRAREA 5. APLICATII CU CIRCUITUL Z80-CTC

Partea II Microprocesorul 8086

69

Lucrarea 6 Arhitectura i organizarea s microprocesorului 8086


Aceast lucrare prezint aspectele fundamentale ale microprocesorului 8086. Se regsesc aici a a a detalii necesare at programatorului c i proiectantului de sisteme cu microprocesor. Ext t s punerea din aceast lucrare este un material de referint i pentru lucrrile de laborator ce vor a a s a urma.

6.1

Arhitectura microprocesorului

Arhitectura microprocesorului 8086 (gura 6.1) prezint dou mari uniti functionale: a a at unitatea de interfatare cu magistrala extern (Bus Interface Unit = BIU ) i a s unitatea de executie a instructiunilor (Execution Unit = EU ). Aceste dou uniti opereaz asincron i formeaz un mecanism unitar de aducere i executie a at a s a s a unei instructiuni. esent, procesarea paralel asigurat de BIU i EU elimin timpul necesar pentru aducerea In a a a s a multor instructiuni prin suprapunerea etapei de aducere a unei instructiuni (fetch) cu etapa de executie a altei instructiuni. Ca o consecint, bus-ul sistem este utilizat mai ecient i se a s obtine o cretere a performantelor sistemului. s

6.1.1

Unitatea de interfat cu busul a

BIU asigur toate semnalele necesare desfurrii ciclurilor de magistral. Aceast unitate a as a a a realizeaz legtura dintre microprocesor i lumea exterioar. Sarcinile acestei uniti s a a s a at nt: aducerea instructiunilor din memorie i plasarea acestora coada de instructiuni; s n gestionarea cozii de instructiuni; realocarea adreselor; controlul semnalelor de comand. a 71

72

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086


20 Registre de uz general AH BH CH DH AL BL CL DL SP BP DI SI CODE DATA SUMATOR 16

EU
EXECUTION UNIT

STACK EXTRA IP INT

20

16

Logica de comanda BUS 8

BUS AD0-AD15

Reg. temporare

BIU
BUS INTERFACE UNIT 1 2 3 4 5 6 Coada de instructiuni (QFIFO)

ALU

COMANDA EU

Reg. indicatori

Figura 6.1: Arhitectura microprocesorului 8086. Pentru implementarea acestor functii, BIU contine: registre de comunicatie intern; a registre pentru segmentarea memoriei; sumator de adrese; registru indicator de program; memorie QFIFO pentru pstrarea instructiunilor ateptarea executiei; a n s un bloc pentru controlul semnalelor de comand. a Suportul zic al BIU permite implementarea unei structuri pipeline. Dac la un moment dat a memoria QFIFO exist cel putin doi octeti liberi i dac EU nu cere un acces la magistral, n a s a a atunci BIU face un acces la memorie, aduc doi octeti. Este posibil astfel aducerea avans nd a n (prefetch) a maximum ase octeti din programul executat. Octetii extrai din memorie s s s nt introdui, octet cu octet, memoria QFIFO prin captul de intrare. Continutul memoriei s n a QFIFO este utilizat de EU prin captul de ieire, ceea ce determin deplasarea automat a a s a a octetilor spre ieire, cu o pozitie dup citirea ecrui octet. Dac memoria QFIFO nu are la s a a a un moment dat nici un bloc liber i nici EU nu cere un acces prin magistrala extern, atunci s a BIU nu initiaz nici un ciclu al magistralei, ceea ce implic o stare de inactivitate (idle state) a a

6.1. ARHITECTURA MICROPROCESORULUI

73

a acesteia. Dac BIU a initiat un ciclu iar EU cere un acces, va a ncheiat ciclul de BIU dup a care se va ceda accesul pentru EU . Pentru generarea adresei de acces la o resurs extern, BIU trimite pe magistrala extern a a a o adres zic de 20 biti. Adresa zic se formeaz prin a a a a nsumarea continutul unui registru segment de 16 biti, deplasat la st nga cu patru pozitii, cu un deplasament de 16 biti, primit de la EU . De exemplu, dac CS = 7100H, iar IP = 9002H, atunci urmtoarea instructiune a a va citit de la adresa: 71000H + 9002H = 7A002H. BIU genereaz i semnale de comand a as a (scriere/citire memorie, scriere/citire port, etc.) necesare pentru desfurarea unui acces la o as resurs extern. a a

6.1.2

Unitatea de executie

EU citete din captul de ieire al QFIFO octetii care apartin unei instructiuni. Instructiunea s a s adus EU este decodicat de o unitate special. Dac instructiunea necesit acces la mema n a a a a orie, se genereaz ctre BIU un deplasament. Simultan, se transmit i informatii care identic a a s a tipul accesului la magistrala extern (citire/scriere din/ memorie/port). Dup executia ina n a structiunii, EU actualizeaz starea indicatorilor i ateapt ca urmtoarea instructiune s e a s s a a a disponibil memoria QFIFO. Datorit faptului c BIU folosete ecare moment care a n a a s n magistrala este liber pentru a arca memoria QFIFO, este foarte probabil ca aceast a nc n a memorie s se gseasc instructiuni care urmeaz a executate. Astfel, viteza de prelucrare a a a a a informatiilor de ctre microprocesorul 8086 este crescut pe baza unui hardware intern su a a plimentar i nu prin intermediul creterii frecventei de tact. Dup executia unei instructiuni s s a de salt sau ramicatie, memoria QFIFO este descrcat, pierz instructiunile care s-ar a a nd executat dac n-ar fost executat instructiunea de salt. Rezult o concluzie important: a a a a pentru ca programele s e executate c mai rapid este necesar s e eliminate, pe c posibil, a t a t instructiunile ce implic saltul la alt secvent de instructiuni. a a a

6.1.3

Registrele microprocesorului

Procesorul 8086 are trei grupe de registre interne accesibile utilizatorului: 8 registre generale de date, 4 registre segment, 2 registre de stare i control. s Registrele generale de date s numr de 8 i s folosite pentru memorarea temporar a nt n a s nt a unor informatii. Cele 8 registre fac parte din dou categorii: a registre de date i s registre pointer i index. s Fiecare registru de date (tabelul 6.1) poate referit ca registru cuv (16 biti) sau ca dou nt a registre semicuv (1 byte, 8 biti). Suxele H i L desemneaz partea superioar (High) sau nt s a a inferioar (Low) a registrului de 16 biti. a

74

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086 Denumire registru 16 biti general de date A AX B BX C CX D DX 8 biti AH, BH, CH, DH, AL BL CL DL Denumire limba englez Semnicatie n a Accumulator Base Counter Data acumulator baz a numrtor aa date

Tabelul 6.1: Denumirile registrelor generale de date.

Registrul AX AL AH BX CX CL DX

Operatii Inmultire cuv artire cuv I/O cuv nt, mp nt, nt Inmultire byte, artire byte, I/O byte, conversie aritmetic zecimal mp a a Inmultire byte, artire byte mp Conversie Operatii cu iruri; cicluri s Deplasare i rotire variabil s a Inmultire cuv artire cuv I/O indirect nt, mp nt, a Tabelul 6.2: Utilizarea implicit a registrelor generale de date. a

Registrele de date pot utilizate pentru operatii aritmetice i logice, dar exist instructiuni s a care presupun implicit utilizarea anumitor registre (tabelul 6.2). Registrele indicator (pointer) i index au functii dedicate. Cele dou registre pointer se pot s a accesa numai ca registre de 16 biti. Aceste registre s folosite pentru a pstra deplasamentul nt a (oset) relativ la registrele de segment, operatiile de acces la memorie. Registrul indicator n de stiv (Stack Pointer = SP) asigur accesul la segmentul de memorie denit ca stiv de SS i a a a s indic deplasamentul ultimei locatii de memorie care a fost implicat a a ntr-o operatie cu stiva. Dup o asemenea operatie, registrul SP este automat modicat (neind necesar interventia a a programatorului) indic permanent v nd n a rful stivei relativ la baza segmentului de stiv. a Registrul indicator de baz (Base Pointer = BP) contine un deplasament fat de originea stivei a a i se folosete pentru a accesa date din cadrul stivei. s s Registrele index contin deplasamentul fat de originea segmentului de date denit de DS. a Registru index al sursei (Source Index = SI) i registrul index al destinatiei (Destination Index s = DI) s folosite implicit pentru calculul adresei operandului surs, respectiv destinatie, nt a n instructiunile care apeleaz la adresarea indexat. a a Spre deosebire de registrele de uz general, registrele pointer i index, se acceseaz numai la nivel s a de cuv ind imposibil accesul la nivel de octet. Aceste registre pot implicate operatii nt, n aritmetice i logice. s Registrele de segment ofer suport pentru implementarea unei memorii cu un spatiu de adresare a de 1 MB. Spatiul de adresare este artit segmente de c 64 KB, din care, la un moment mp n te dat, numai 4 segmente pot active. Segmentele active s denite prin registrele de segment: nt CS (Code segment) segmentul de cod/program,

6.1. ARHITECTURA MICROPROCESORULUI DS (Data segment) segmentul de date, SS (Stack segment) segmentul de stiv, a ES (Extra segment) segmentul de date suplimentar.

75

Fiecare din aceste registre contine adresa de nceput a segmentului de 64 KB pe care denete, l s adres care poate modicat sub actiunea programului rulat. arcarea registrului de cod a a Inc CS este echivalent cu transferul controlului programului alt segment de memorie. Pentru a n cazuri exceptionale, care este necesar referirea la un operand aat afara segmentului n a n implicit, se poate include instructiune un prex care desemneaz explicit segmentul care n a n se gsete operandul. a s Registrele de stare i control constau din registrul indicator de instructiuni i registrul de stare s s (ag-uri). Indicatorul de instructiuni (Instruction Pointer = IP) este un registru de 16 biti care identic a locatia urmtoarei instructiuni ce va executat, segmentul de cod curent. IP este similar a a n unui registru contor program (Program Counter = PC). Spre deosebire de un registru PC care contine adresa zic a urmtoarei instructiuni, IP contine deplasamentul de 16 biti al a a urmtoarei instructiuni. Pentru determinarea adresei zice, deplasamentul trebuie combinat a cu continutul unui registrului segment de cod (CS), pentru a genera adresa zic a instructiunii. a Fizic, acest registru se a BIU . La ecare aducere a unei instructiuni din memorie, BIU a n actualizeaz valoarea registrului IP pentru a indica urmtoarea instructiune. a a Registrul de stare i indicatori este un registru de 16 biti aat EU . Din cei 16 biti, numai 9 s n biti au o semnicatie: 3 biti de control i 6 biti de stare. s Structura registrului de stare i indicatori este prezentat tabelul 6.3. s a n 15 14 13 12 11 10 * * * * OF DF 9 8 IF TF 7 6 SF ZF 5 4 3 2 1 0 * AF * PF * CF

Tabelul 6.3: Structura registrului de stare i indicatori. s Indicatorii de stare s modicati ca urmare a executiei unor anumite instructiuni (aritmetice, nt logice sau special destinate), iar continutul lor nu poate citit direct, ci numai testat indirect, prin transferul controlului programului la ramuri diferite, functie de valoarea indicatorului n testat. Indicatorii de stare s nt: Indicator de transport (Carry Flag = CF ), care este setat dup o operatie aritmetic a a n care a aprut transport sau a mprumut; rest valoarea acestui indicator este 0; n Indicator de paritate (Parity Flag = P F ), care este setat dac rezultatul unei operatii aa ritmetice contine un numr par de biti de valoare 1; dac numrul este impar, atunci a a a PF=0; Indicator de transport auxiliar (Auxiliary Carry Flag = AF ), care este setat dac dup a a o operatie aritmetic pe 16 biti a aprut transport/ a a mprumut n/din tetrada mai semnicativ a octetului mai putin semnicativ dintr-un cuv (16 biti); a nt

76

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086

Indicator de zero (Zero Flag = ZF ), care este setat dac urma unei operatii logice sau a n aritmetice toti bitii rezultatului s egali cu zero; nt Indicator de semn (Sign Flag = SF ), care urma unei operatii logice sau aritmetice ia n valoarea celui mai semnicativ bit (MSB); astfel, dac rezultatul este negativ, atunci SF a = MSB = 1. SF = 0 pentru restul situatiilor; Indicator de depire (Overow Flag = OF ), care este setat dac, cazul a doi operanzi de as a n acelai semn, semnul rezultatului este diferit de cel al operanzilor, ceea ce este echivalent s cu faptul c rezultatul este afara domeniului de reprezentare. a n Exemplul 1: urma operatiei de adunare pe octet a numerelor fr semn 199|10 = C7H i 90|10 = 5AH, s In aa rezultatul operatiei este 199|10 + 90|10 = C7H + 5AH = 21H = 33|10 . 1100 0111 + 0101 1010 ----------1 0010 0001 CF =1 (pentru c a aprut transport), P F =1 (pentru c rezultatul 21H = 0010 0001 are a a a un numr par de biti egali cu unu), AF =1 (pentru c a aprut un transport tetrada mai a a a n semnicativ), ZF =0 (pentru c rezultatul este diferit de zero), SF = MSB = 0, OF = 0. a a Numerele ind considerate fr semn, SF i OF nu au nici o semnicatie acest caz. aa s n Exemplul 2: s a s Consider numerele cu semn 57|10 = C7H i +90|10 = 5AH, rezultatul adunrii i valoarea nd bitilor de stare s aceleai cu deosebirea c CF i AF nu au nici o semnicatie, iar SF = 0 nt s a s indic faptul c rezultatul este corect, deci nu s-a produs depire. a a as Indicatorii de control s nt: Indicatorul de ntrerupere (Interrupt Flag = IF ), care este utilizat pentru determinarea modului care microprocesorul 8086 reactioneaz la cererile de n a ntrerupere mascabil a aplicate pe pinul INT (IF = 1 - cererile de ntrerupere s validate). Starea acestui nt indicator poate setat/resetat prin program; a a Indicatorul de directie (Direction Flag = DF ), care este utilizat operatiile cu iruri de n s octeti c este necesar ca irul s e denit prin adresa de baz i prin sensul descresctor nd s a as a (DF=0) sau cresctor (DF=1) al adreselor care denesc octetii din ir fat de adresa de a s a baz; a Indicatorul de mod pas cu pas (Trap Flag = T F ), care permite implementarea unui mod de functionare util depanarea programelor. Astfel, dac TF = 1, dup executia n a a ecrei instructiuni se initiaz o a a ntrerupere care determin transferul controlului a ntr-o zon de memorie denit de utilizator, unde, sub actiunea unui program adecvat, se poate a a face analiza strii interne a microprocesorului. a

6.1.4

Structura memoriei

Spatiul de adresare al microprocesorului 8086 este de 1 MB. Datele aate la o adres de memorie a au 8 biti. Un cuv de 16 biti poate stocat memorie la dou adrese succesive. Ordinea de nt n a

6.1. ARHITECTURA MICROPROCESORULUI

77

stocare a celor doi baiti apartin unui cuv este cu cel mai semnicativ la adresa superioar nd nt a (little endian). Spatiul de adresare de 1 MB al microprocesorului 8086 necesit 20 de biti de a adres. Pentru a rezolva accesibilitatea resurselor de 1 MB utiliz cuvinte de c 16 biti s-a a nd te a adoptat segmentarea memoriei pachete a c 216 B = 64 KB. Memoria poate interpretat n te ca un numr oarecare de segmente av ecare maximum 64 KB. Adresa de a nd nceput a unui segment este divizibil cu 16 (ultimii patru biti s 0). Un program poate avea acces imediat a nt numai patru segmente: n segmentul de cod/program, segmentul de date, segmentul de stiv, a segmentul de date suplimentar. Selectia acestor patru segmente a fost motivul pentru care unitatea BIU a lui 8086 a fost prevzut cu registre segment de 16 biti. a a Pentru generarea unei adrese zice spatiul de 1 MB, continutul unui registru de segment n este deplasat la st nga cu 4 pozitii i adunat cu continutul unuia din registrele pointer sau s index. Rm la latitudinea programatorului segmentarea memoriei disponibile apel la a ne nd segmente disjuncte, partial disjuncte sau suprapuse, neexist nici o restrictie acest sens. nd n Determinarea adresei zice din adresa logic este realizat de BIU aa ca gura 6.2. a a s n 15 Adres de a segment (16 biti)
... ... ... ... . .. ..

0
. .. .. ..

15 Adres logic a a
.. .. .. . .. ..

0
. . . ..

Registru de segment 0000

Oset (16 biti)

Z ......... ...... ..... .........  Z ... .. L L Sumator L L L

... ... ... ...

19 Adres zic a a

Figura 6.2: Determinarea adresei zice. BIU obtine adresele logice i adresele de segment din diferite surse, functie de tipul referintei s n la memorie. Tabelul 6.4 prezint sursele implicite pentru diferite tipuri de acces la memorie. a Segmentele de cod (CS) ale memoriei contin instructiuni ale unuia sau mai multor programe. Continutul lui CS identic locatia de a nceput a unei instructiuni cadrul segmentului de n cod activ. Pentru a face acces la locatia unde se memoreaz instructiunea segmentul de cod a n

78

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086 Segment implicit Fetch instructiune CS Operatie cu stiva SS Accesare de variabil a DS Surs de operatie cu iruri a s DS Destinatie de operatie cu iruri s ES Registrul BP utilizat ca registru de baz a SS Registrul BX utilizat ca registru de baz a DS Tipul referintei la memorie Segment Deplasament alternativ (Oset) IP SP CS, ES, SS Adres efectiv a a CS, ES, SS SI DI CS, DS, ES Adres efectiv a a CS, ES, SS Adres efectiv a a

Tabelul 6.4: Sursele implicite pentru diferite tipuri de acces la memorie. activ, 8086 trebuie s-i pozitioneze toti cei 20 biti de adres zic. Pentru a realiza acest lucru, as a a microprocesorul 8086 combin continutul registrului pointer de instructiuni (IP) cu valoarea a din CS, rezult o adres zic ce va furnizat pe ieirile de adres ale microprocesorului. nd a a a s a Segmentul de cod activ poate schimbat prin executia unei instructiuni care ncarc o nou a a valoare registrul CS. Din acest motiv, se poate utiliza pentru memorarea codului oricare din n cele 16 segmente independente de memorie a c 64 KB. te Continutul registrului segment de date (DS) identic locatia de a nceput a segmentului de date curent memorie. Acesta este cel de-al doilea segment activ de 64 KB, care se constituie n ntr-un spatiu de memorie tip citire/scriere care datele pot stocate. Majoritatea operanzilor n instructiunilor s preluati din acest segment. Valorile din registrele index surs (SI) sau nt a destinatie (DI) s combinate cu valoarea din (DS) pentru a forma o adres zic pe 20 de biti nt a a (adresa operandului surs sau destinatie segmentul de date). a n Registrul segment stiv (SS) contine adresa logic ce identic locatia de a a a nceput a stivei curente memorie. Este un segment de 64 KB care s depuse valorile pointerului de n n nt instructiuni (IP), indicatorilor de stare i ale altor registre (printr-o instructiune PUSH) la s orice ntrerupere hardware, ntrerupere software sau executia unui apel de subrutin. Dup a a ce s-a ncheiat executia subrutinei, starea original a sistemului este restaurat prin executia a a instructiunii POP sau prin executia instructiunii RETURN. Urmtoarea locatie care va a n depus un cuv sau din care va preluat un cuv se obtine prin combinarea valorii curente nt nt din SS cu pointerul de stiv (SP). Stiva crete spre valori de adrese descresctoare. Cuvintele a s a din stiv au 16 biti (2 bytes). a Ultimul registru segment identic cel de-al patrulea segment activ de 64 KB spatiul de a n adresare a memoriei. Acest spatiu este denumit segment suplimentar (ES). Acest segment este folosit uzual pentru memorarea datelor. Instructiunile cu iruri utilizeaz valoarea din ES cu s a continutul din DI drept un deplasament pentru a identica adresa destinatie.

6.1.5

Organizarea porturilor I/O

Spatiul de adresare al porturilor I/O este disjunct fat de spatiul de adresare al memoriei. a Adresarea porturilor se face cu instructiuni specice (IN sau OUT). Spatiul de adresare al porturilor poate vzut ca ind de dimensiune 64K 8 biti sau 32K 16 a biti. Adresarea primelor 256 de porturi se poate face direct (adresa portului inclus codul a n

6.1. ARHITECTURA MICROPROCESORULUI

79

instructiunii). Toate porturile pot adresate indirect, adresa de 16 biti ind plasat registrul a n implicit DX. Instructiunile IN i OUT transfer date s a ntre acumulator (AL pentru transferuri pe 8 biti i s AX pentru transferuri pe 16 biti) i portul localizat spatiul I/O. s n

6.1.6

Modurile de adresare

Operanzii instructiunilor microprocesorului 8086 pot continuti registre, n ntr-un c mp al instructiunii, memorie sau la porturile I/O. Adresele la care se gsesc operanzii memorie n a n sau la porturile I/O se pot determina mai multe feluri. n Operanzii imediati s constante de 8 sau 16 biti incluse codul instructiunii. Accesarea nt n acestora se face faza de aducere a instructiunii memorie (fetch) i nu necesit un ciclu n n s a suplimentar de citire a memoriei. Operanzi imediati (operandul este corpul instructiunii) n CR MOV MOV EQU 13 AL, CR AX, 0FFFFH

; initializeaz registrul AL cu 13 a ; initializeaz registrul AX cu o dat imediat a a a

Instructiunile cu operanzi din registre s executate mai rapid deoarece aceste operatii nu fac nt acces la resurse din afara EU . Operanzi registre (corpul instructiunii contine codul unui registru) n MOV MOV AL, BL AX, BX ; copiaz continutul registrului BL n registrul AL a ^ ; copiaz continutul registrului BX n registrul AX a ^

Spre deosebire de operanzii imediati i de cei din registre, care s direct accesati de ctre s nt a EU , operanzii din memorie trebuie transferati ntre CP U i memorie prin intermediul BIU s i al bus-ului extern. EU calculeaz adresa efectiv (Eective Address = EA) a operandului s a a i o transmite ctre BIU . EA este de tipul s a ntreg reprezentat pe 16 biti i reprezint osetul s a operandului segmentul care se face adresarea. Pentru calcularea adresei efective, EU n n folosete informatia din cel de-al doilea byte al instructiunii. Codul acestui byte este dedus de s ctre compilator sau asamblor pe baza instructiunii scrise de ctre programator. limbaj de a a In asamblare se poate accesa memoria toate modurile de adresare. n Adresare direct EA = deplasament8|16 a LOC1 DB 13 MOV AL, LOC1 ; ; ; ; definete o variabil de tip byte s a si o initializeaz cu 13 (baza 10) a transfer n AL data de 8 biti aflat a ^ a n memorie la adresa LOC1 ^

Adresare indirect la registru EA = [BX|BP |SI|DI] a MOV AX, [BX] ; transfer n AX data de 16 biti aflat a ^ a ; n memorie la adresa continut n registrul BX ^ a ^

80

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086

Adresare la baz EA = [BX|BP ] + deplasament8|16 a MOV AX, [BX+2] ; transfer n AX data de 16 biti aflat n a ^ a ^ ; memorie la adresa obtinut prin nsumarea a ^ ; continutului registrului BX cu 2

Adresare indexat EA = [SI|DI] + deplasament8|16 a

MOV AX, [SI+2]

; transfer n AX data de 16 biti aflat a ^ a ; n memorie la adresa obtinut prin nsumarea ^ a ^ ; continutului registrului SI cu 2

Adresare la baz indexat EA = [BX|BP ] + [SI|DI] + deplasament8|16 a a

MOV AX, [BX+SI+2] ; ; ; ;

transfer n AX data de 16 biti aflat a ^ a n memorie la adresa obtinut prin nsumarea ^ a ^ continutului registrului BX cu continutul registrului SI si cu 2

Adresarea irurilor EAsurs = [SI], EAdestinatie = [DI] s a s1 s2 MOV MOV MOV DB ir1 s ; definete dou variabile de tip s a DB ir2 s ; byte si le initializeaz cu c^te patru caractere a SI, offset s1 ; pregtete registrele implicite ale a s DI, offset s2 ; instructiunii care opereaz asupra a CX, 4 ; sirurilor de caractere ; instructiune care mut un sir de a ; caractere adresat implicit, de la DS:SI la ES:DI

REP MOVSB

a Adresarea porturilor I/O Adres Port8 = data8 , Adres Port16 = [DX] a IN AL, 0EAH ; citete de la portul adresat direct un cuv^nt de s ; 8 biti si l transmite n registrul AL ^ ^ ; ; ; ; ; pregtete n registrul DX adresa a s ^ portului reprezentat pe 16 biti a citete de la portul a crui adres este s a a continut n registrul DX un cuv^nt de 16 biti a ^ si l transmite n registrul AX ^ ^

MOV DX, 0ABCDH IN AX, DX

6.2

Conexiunile externe ale microprocesorului

Firma Intel a redus numrul de conexiuni externe, prezent microprocesorul 8086 a nd ntr-o capsul cu 40 de pini. a

6.2. CONEXIUNILE EXTERNE ALE MICROPROCESORULUI

81

6.2.1

Modurile de lucru ale microprocesorului

Solutia de ncapsulare aleas a impus multiplexarea timp a functiilor mai multor pini (gura a n 6.3) cu implicatii directe realizarea circuitelor (schemelor) tipice cu acest microprocesor. n Intrevz faptul c 8086 va a nd a nglobat at conguratii simple c i foarte complexe, rma t n t s Intel a prevzut dou moduri de lucru: a a modul minim i s modul maxim.
8086 MIN 33 22 19 21 18 MN READY CLK RESET INTR AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 AD8 AD9 AD10 AD11 AD12 AD13 AD14 AD15 A16/S3 A17/S4 A18/S5 A19/S6 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 39 38 37 36 35 33 22 19 21 18 MX READY CLK RESET INTR 8086 MAX AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 AD8 AD9 AD10 AD11 AD12 AD13 AD14 AD15 A16/S3 A17/S4 A18/S5 A19/S6 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 39 38 37 36 35

BHE/S7 DEN DT/R M/IO 30 31 17 23 HLDA HOLD NMI TEST RD WR ALE INTA

34 26 27 28 32 29 25 24 30 31 17 23 RQ/GT1 RQ/GT0 NMI TEST

BHE/S7 S0 S1 S2 RD LOCK QS0 QS1

34 26 27 28 32 29 25 24

Figura 6.3: Conguratia pinilor microprocesorului 8086. Stabilirea modului de lucru se face prin impunerea unei stri logice pinului MN/MX, astfel: a MN/MX = 1 pentru modul minim, care este potrivit sistemelor simple, cu un singur microprocesor; MN/MX = 0 pentru modul maxim, care se preteaz la conguratii multiprocesor. a acord cu modul de lucru ales, destinatia unor pini este diferit, ceea ce impune artirea In a mp pinilor dou categorii: pini cu functii comune ambelor moduri de lucru i pini cu functii n a s specice modurilor de lucru minim i maxim. Tabelul 6.5 prezint semnicatia pinilor micros a procesorului 8086.

6.2.2

Modul minim

modul minim, microprocesorul 8086 genereaz i accept toate semnalele necesare pentru a In as a realiza un sistem simplu, av totui faciliti importante (lucru cu memoria sau cu porturile, nd s at mod DM A sau prin n ntreruperi).

82

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086

Semnale comune Nume Functie AD15-AD0 Bus adrese/date A19/S6-A16/S3 Adrese/Stri a NBHE/S7 Validare bus superior/stare MN/NMX Control mod minim/maxim NRD Control citire NTEST Wait pe control test READY Control stare wait RESET Reset sistem NMI Cerere ntrerupere nemascabil a INTR Cerere ntrerupere mascabil a CLK Tact sistem VCC +5V GND Masa Semnalele modului minim (MN/NMX = Nume Functie HOLD Cerere hold HLDA Acceptare hold NWR Control scriere M/NIO Control memorie/IO DT/NR Emisie/receptie date NDEN Validare date ALE Validare preluare adrese NINTA Recunoatere s ntrerupere Semnalele modului maxim (MN/NMX = Nume Functie NRQ/NGT1,0 Control acces bus Cerere/cedare NLOCK Control lock prioritate bus NS2-S0 Stare ciclu de bus NQS1, NQS0 Starea cozii de instructiuni

Tip Bidir. 3-Stri a Ieire, 3-Stri s a Ieire, 3-Stri s a Intrare Intrare, 3-Stri a Intrare Intrare Intrare Intrare Intrare Intrare Intrare Intrare VCC) Tip Intrare Ieire s Ieire, 3-Stri s a Ieire, 3-Stri s a Ieire, 3-Stri s a Ieire, 3-Stri s a Ieire s Ieire s GND) Tip Bidirectional Ieire, 3-Stri s a Ieire, 3-Stri s a Ieire s

Tabelul 6.5: Semnicatia pinilor microprocesorului 8086.

6.2. CONEXIUNILE EXTERNE ALE MICROPROCESORULUI S0 S1 S2 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 Tip ciclu de bus Conrmare ntrerupere (INTA) Citire port I/O Scriere port I/O Stare de halt Fetch instructiune Citire memorie Scriere memorie Pasiv, nici un ciclu de bus

83

Tabelul 6.6: Tipul ciclului de bus, functie de bitii de stare S0, S1 i S2. n s Magistrala de adrese i date - AD0..AD15, A16..A19 s Magistrala de adrese ndeplinete, prin multiplexare timp, dou functii. s n a Magistral de adrese de 20 biti. ciclurile I/O, A16=A17=A18=A19=0 ceea ce limiteaz a In a la 216 = 65536 adresele disponibile pentru dispozitivele periferice. Magistral de date de 16 biti (D15-D0). acest caz, magistrala de date D0..D15 este a In bidirectional. a Procesorul 8086 are posibilitatea de a trece liniile AD0..AD15, A16..A19 starea de n nalt a impedant (3-state). a Semnale de stare Semnalele S0, S1 i S2 prezint informatia referitoare la tipul ciclului de magistral curent. s a a Starea prezentat de aceti biti este valid la a s a nceputul ecrui ciclu de bus. Tabelul 6.6 a prezint modul de interpretare a informatiei furnizate de aceste semnale. a Prin multiplexare, liniile A16..A19 ndeplinesc i o functie de stare. Prin prisma acestui dublu s rol, denumirea corect a magistralei este A16/S3..A19/S6. Informatia de stare S3..S6 este a prezent simultan cu situatia c informatia de pe liniile de date este stabil. Semnalele de a nd a pe magistral au urmtoarea semnicatie: a a S3 i S4 formeaz un cod ce reprezint registrul segment utilizat pentru generarea adresei s a a din ciclul curent de magistral (tabelul 6.7); a S5 reprezint valoarea agului IF (Interrupt Flag) de autorizare a a ntreruperilor mascabile; S6 este neutilizat, ind ntotdeauna egal cu 0. Semnale de control Semnalele de control permit interconectarea cu memoria i dispozitivele periferice. Semnicatia s bitilor de control este dependent de tipul informatiei existente pe magistrala D0..D15: a adres valid (ieire); a a s date de intrare, ntr-un ciclul de citire;

84

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086 S4 S3 0 0 0 1 1 0 1 1 Registru segment ES (segment de date auxiliar) SS (segment de stiv) a CS sau nimic (I/O sau vector de ntrerupere) DS (segment de date)

Tabelul 6.7: Informatia codicat cu bitii de stare S3 i S4. a s date de ieire, s ntr-un ciclu de scriere. ALE (Address Latch Enable) este un semnal activ 1, care indic faptul c magistrala n a a AD0..AD15 contine o informatie de adres valid referitoare la ciclul aat executie. a a n Intruc t aceast adres este valid numai pe perioada c ALE=1, ea trebuie memorat pe frontul a a a t a cztor al semnalului ALE ( circuite latch) pentru a folosit ulterior. a a n a BHE (Bank High Enable) este un semnal activ 0, folosit pentru a activa modulul de n memorie legat de magistrala de date, jumtatea mai semnicativ (D8..D15). De asemenea, n a a BHE poate folosit ca semnal de stare S7. M/IO (Memory/Input-Output) este un semnal care se formeaz pe baza tipului ciclului aat a executie i anume: n s M/IO=1 pentru acces la memorie; M/IO=0 pentru acces la port. DT/R (Data Transmit/Receiver) indic dac ciclul curent este unul de scriere, c datele a a nd s transmise de ctre microprocesor (DT/R=1), sau unul de citire, c datele s citite de nt a nd nt ctre microprocesor (DT/R=0). Citirea i scrierea datelor se refer at la accesul la memorie a s a t c i la porturi. Semnalul DT/R poate folosit pentru schimbarea sensului de transfer al unui t s circuit bidirectional de amplicare a magistralei de date. RD (Read) este generat ntr-un ciclu de citire, ind folosit pentru selectarea dispozitivelor logice, care ofer informatia citit de ctre microprocesor. a a a WR (Write) este generat ntr-un ciclu de scriere semnaliz c pe AD0..AD15 se a o dat nd a a a valid, care trebuie a nscris memorie sau port. Semnalele RD i WR pot prelungite a n s nelimitat, oferind astfel posibilitatea ca memorii sau porturi mai lente s poat folosite cu a a microprocesorul 8086. DEN (Data Enable) este generat at ciclurile de citire c i cele de scriere, c este necet n t s n nd sar marcarea momentului care magistrala comun a n a ndeplinete functia de date (D0..D15). s Semnalul DEN poate folosit pentru selectia circuitelor 3-state de amplicare a magistralei de date. READY este un semnal primit de microprocesor, la activarea cruia microprocesorul si prea lungete ciclurile de magistral i implicit semnalele de comand pentru resursele hardware s a s a lente. Semnale de ntrerupere Intreruperea, sens general, este devierea unui program principal prin comanda unui semnal n exterior ( ntrerupere hardware), ca urmare a unei stri interne ( a ntrerupere intern) sau ca a

6.2. CONEXIUNILE EXTERNE ALE MICROPROCESORULUI Registru Continut Registru de stare i indicatori s 0000H IP 0000H CS FFFFH DS 0000H SS 0000H ES 0000H Coad de instructiuni a Goal a Tabelul 6.8: Starea registrelor dup resetare. a

85

urmare a executiei unor instructiuni specice ( ntrerupere software). Devierea este urmat de a o tratare specic i revenirea starea initial, care a fost fcut as n a n a a ntreruperea. INTR (Interrupt) este un semnal prin care un dispozitiv periferic cere microprocesorului s a si ntrerup temporar activitatea pentru a-l deservi. Acest semnal este testat de ctre microa a procesor ultima perioad de ceas a ecrui ciclu de aducere a instructiunii (fetch). Dac n a a a semnalul are valoarea 1 i s ntreruperile s validate, se initiaz un ciclu de recunoatere a nt a s ntreruperii, c INTA devine activ (0). nd TEST poate determina, anumite conditii, suspendarea unui program. Dup executia instrucn a iunii WAIT, microprocesorul 8086 testeaz starea liniei TEST. Dac aceasta are valoarea 1 se t a a trece magistrala inactivitate i se ateapt revenirea liniei TEST la valoarea 0. Programul n s s a este reluat din punctul de ntrerupere. Prin utilizarea semnalului TEST se poate implementa un mod simplu de a sincroniza activitatea microprocesorului cu evenimente externe. NMI (Non Maskable Interrupt) poate determina, pe frontul cresctor, declanarea unei a s ntreruperi care nu poate invalidat. Activarea NMI determin neconditionat executia unei rutine a a speciale de tratare a ntreruperii. NMI poate folosit pentru initierea unor comenzi cazul n scderii tensiunii de alimentare sau pentru tratarea unor erori de paritate la memorie (ca la a calculatorul IBM PC). RESET este inclus tot categoria semnalelor de n ntrerupere. Activarea sa (pe valoare 0), determin aducerea registrelor i a ag-urilor interne a s ntr-o stare initial, urm ca la in a nd activarea acestuia (revenirea la valoarea 1) s e reluat activitatea microprocesorului din a a aceast stare. Dup resetarea microprocesorului registrele s initializate strile prezentate a a nt n a tabelul 6.8. n Semnale de interfat DM A a HOLD poate adus 1 de ctre un dispozitiv care intentioneaz s preia controlul asupra n a a a magistralelor de adrese, date i comenzi. La activarea semnalului, dup terminarea ciclului s a curent, microprocesorul 8086 trece starea de n nalt impedant semnalele: AD0 .. AD15, a a A16/S3 .. A19/S6, BHE, DEN, DTR, MI/0, RD, WR i INTR. Totodat, aceast stare (hold s a a state) este semnalizat exterior prin HLDA=1 (Hold Acknowledge), perioad care EU a n a n utilizeaz informatia din QFIFO, p a c aceasta rm vid. a n nd a ne a

86

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086

6.2.3

Modul maxim

Dac microprocesorul 8086 este pus s lucreze modul maxim, (prin xarea pinului MN/MX a a n la 0) el genereaz semnale pentru implementarea structurilor multiprocesor/coprocesor. Prin a acest termen se denesc acele structuri hardware care presupun existenta mai multor micro procesoare cadrul aceleiai conguratii sistem, conditiile care ecare microprocesor si n s n n execut, cea mai mare parte a timpului, propriul su program. De obicei, asemenea struca n a turi contin anumite resurse globale, comune tuturor microprocesoarelor. Fiecare microprocesor poate avea i resurse locale (private). s sistemele cu coprocesor exist un al doilea microprocesor sistem. acest caz, cele In a n In dou microprocesoare nu pot face acces la bus acelai timp. Unul dintre ele trebuie s a n s a transmit celuilalt controlul bus-ului sistem i s-i suspende pentru un timp operatiile. In a s as sisteme cu microprocesor 8086 cuplat modul maxim se lnesc faciliti suplimentare, n nt at n ceea ce privete implementarea alocrii resurselor globale i transmiterea controlului bus-ului s a s altor microprocesoare sau coprocesoare.

6.3

Instructiunile microprocesorului

Instructiunile microprocesorului 8086 pot artite urmtoarele categorii: mp n a Instructiuni pentru transfer de date; Instructiuni aritmetice; Instructiuni pentru manipulare de biti; Instructiuni pentru manipulare de iruri; s Instructiuni pentru transferul controlului programului; Instructiuni pentru controlul microprocesorului. continuare se face o prezentare sumar a categoriilor de instructiuni. La ecare categorie In a se va prezenta un tabel cu mnemonicile asociate instructiunilor i cu denitia instructiunii, s aa cum este dat de productor ( limba englez). Anexa ?? prezint mai detaliat ecare s a a n a a instructiune parte. n

6.3.1

Instructiuni pentru transfer de date

Instructiunile pentru transfer de date (tabelul 6.9) mut (copiaz) date reprezentate pe 8 a a sau 16 biti ntre memorie i registre sau s ntre registre i porturi I/O. Acest grup include s i instructiunile de manipulare a stivei i instructiunile de arcare a registrelor de segment. s s nc

6.3.2

Instructiuni aritmetice

Instructiunile aritmetice (tabelul 6.10) se pot executa asupra patru tipuri de date binare:

6.3. INSTRUCTIUNILE MICROPROCESORULUI Transferuri generale MOV Move byte or word PUSH Push word onto stack POP Pop word o stack PUSHA Push all registers on stack POPA Pop all registers from stack XCHG Exchange byte or word XLAT Translate byte Intrare/Ieire s IN Input byte or word OUT Output byte or word Adresare de obiecte LEA Load eective address LDS Load pointer using DS LES Load pointer using ES Transferuri de indicatori LAHF Load AH register from ags SAHF Store AH register in ags PUSHF Push ags onto stack POPF Pop ags from stack Tabelul 6.9: Instructiuni pentru transfer de date. numere binare ntregi, fr semn (pozitive); aa numere binare ntregi, cu semn; numere baza 10, fr semn, ne n aa mpachetate; numere baza 10, fr semn, n aa mpachetate.

87

Numerele binare pot reprezentate pe 8 sau 16 biti. Totdeauna microprocesorul presupune c a operanzii specicati contin date valide. Pentru numere binare fr semn exist instructiuni de aa a adunare, scdere, a nmultire i artire. s mp

6.3.3

Instructiuni pentru manipulare de biti

Instructiunile pentru manipulare de biti (tabelul 6.11) cuprind instructiunile de prelucrare logic, instructiunile de deplasare i instructiunile de rotire. a s

6.3.4

Instructiuni pentru manipulare de iruri s

Instructiunile elementare pentru manipulare de iruri (tabelul 6.12) opereaz asupra unui singur s a element de ir (8 sau 16 biti). Prin utilizarea prexelor de repetare, se pot realiza operatii asupra s unui numr de maxim 128 K elemente. a Instructiunile de manipulare de iruri folosesc implicit urmtoarele registre i indicatori: s a s

88

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086 Adunare ADD Add byte or word ADC Add byte or word with carry INC Increment byte or word by 1 AAA ASCII adjust for addition DAA Decimal adjust for addition Scdere a SUB Subtract byte or word SBB Subtract byte or word with borrow DEC Decrement byte or word by 1 NEG Negate byte or word CMP Compare byte or word AAS ASCII adjust for subtraction DAS Decimal adjust for subtraction Inmultire MUL Multiply byte or word unsigned IMUL Integer multiply byte or word AAM ASCII adjust for multiply a Imprtire DIV Divide byte or word unsigned IDIV Integer divide byte or word AAD ASCII adjust for division CBW Convert byte or word CWD Convert word to doubleword Tabelul 6.10: Instructiuni aritmetice.

SI - oset ir surs; s a DI - oset ir destinatie; s DX - adres de port; a CX - numrtor de repetitii; aa AL/AX - destinatie/surs pentru LODS/STOS; a DF - 0 - autoincrement SI, DI sau 1 - autodecrement SI, DI; ZF - indicator folosit pentru determinarea sf sitului de ir. r s

6.3.5

Instructiuni pentru transferul controlului programului

Locul de unde se execut programul este determinat de continutul registrelor CS i IP. Abaterea a s de la prelucrarea secvential a instructiunilor se realizeaz prin executia unor instructiuni care a a modic valorile stocate aceste registre (tabelul 6.13). a n

6.4. INTREBARI Logice NOT Not byte or word AND And byte or word OR Inclusive or byte or word XOR Exclusive or byte or word TEST Test byte or word Deplasare SHL/SAR Shift logical/arithmetic left byte or word SHR Shift logical right byte or word SAR Shift arithmetic right byte or word Rotire ROL Rotate left byte or word ROR Rotate right byte or word RCL Rotate through carry left byte or word RCR Rotate through carry right byte or word Tabelul 6.11: Instructiuni pentru manipulare de biti.

89

6.3.6

Instructiuni pentru controlul microprocesorului

Instructiunile pentru controlul microprocesorului (tabelul 6.14) permit controlarea prin pro gram a diferitelor functii ale CP U . Aceast categorie include instructiunile de manipulare a a indicatorilor i cele pentru sincronizare extern. s a

6.4

Intrebri a

I. Justicati prezenta diferitelor grupe de registre EU sau BIU . n II. Prezentati suportul oferit de microprocesorul 8086 (hardware) pentru realizarea unor programe relocatabile dinamic (programe care pot arcate memorie la adrese nc n

REP REPE/REPZ REPNE/REPNZ MOVS MOVSB/MOVSW CMPS INS OUTS SCAS LODS STOS

Repeat Repeat while equal/zero Repeat while not equal/not zero Move byte or word string Move byte or word string Compare byte or word string Move byte or word string from I/O Move byte or word string to I/O Scan byte or word string Load byte or word string Store byte or word string

Tabelul 6.12: Instructiuni pentru manipulare de iruri. s

90

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086

Transferuri neconditionate CALL Call procedure RET Return from procedure JMP Jump Transferuri conditionate JA/JNBE Jump if above/not below nor equal JAE/JNB Jump if above or equal/not below JB/JNAE Jump if below/not above nor equal JBE/JNA Jump if below or equal/not above JC Jump if carry JE/JZ Jump if equal/zero JG/JNLE Jump if greater/not less nor equal JGE/JNL Jump if greater or equal/not less JL/JNGE Jump if less/not greater nor equal JLE/JNG Jump if less or equal/not greater JNC Jump if not carry JNE/JNZ Jump if not equal/not zero JNO Jump if not overow JNP/JPO Jump if not parity/parity odd JNS Jump if not sign JO Jump if overow JP/JPE Jump if parity/parity even JS Jump if sign Controlul iteratiilor LOOP Loop LOOPE/LOOPZ Loop if equal/zero LOOPNE/LOOPNZ Loop if not equal/not zero JCXZ Jump if register CX=0 Intreruperi INT Interrupt INTO Interrupt if overow IRET Interrupt return Tabelul 6.13: Instructiuni pentru transferul controlului programului.

6.4. INTREBARI Operatii cu indicatori Set carry ag Clear carry ag Complement carry ag Set direction ag Clear direction ag Set interrupt ag Clear interrupt ag Sincronizri externe a Halt until interrupt or reset Wait until TEST pin active Escape to external processor Lock bus during next instruction Operatie nul a No operation

91

STC CLC CMC STD CLD STI CLI HLT WAIT ESC LOCK NOP

Tabelul 6.14: Instructiuni pentru controlul microprocesorului. aleatoare). Care s conditiile pe care trebuie s le nt a ndeplineasc un program (software) a pentru a dinamic relocatabil? III. Se poate ca o procedur s implementeze o stiv diferit de cea a programului care o a a a a apeleaz? Dati explicatii referitoare la suportul microprocesorului 8086 (hardware) i la a s particularitile programelor (software). at IV. Care este adresa zic a primei instructiuni executate de microprocesorul 8086, dup a a resetare? Decodicati datele existente memorie la acea adres i deduceti ce instructiuni n as execut un calculator PC imediat dup resetare. Folositi utilitarul debug. Dac se tasteaz a a a a ? la prompterul - se obtine lista comenzilor, aa cum este prezentat continuare: s a n assemble compare dump enter fill go hex input load move name output proceed quit register search trace unassemble A C D E F G H I L M N O P Q R S T U [address] range address [range] address [list] range list [=address] [addresses] value1 value2 port [address] [drive] [firstsector] [number] range address [pathname] [arglist] port byte [=address] [number] [register] range list [=address] [value] [range]

92

LUCRAREA 6. ARHITECTURA SI ORGANIZAREA MICROPROCESORULUI 8086 write W [address] [drive] [firstsector] [number] allocate expanded memory XA [#pages] deallocate expanded memory XD [handle] map expanded memory pages XM [Lpage] [Ppage] [handle] display expanded memory status XS

V. Realizati o schem de calcul a adresei efective pentru ecare mod de adresare al micropro a cesorului 8086. De exemplu, calculul adresei efective la adresarea bazat se face conform a schemei din gura 6.4.
OPCOD MOD R/M DEPLASAMENT

BX sau BP

EA

Figura 6.4: Calculul adresei efective la adresarea bazat. a VI. Faceti o paralel a ntre modurile de adresare ale microprocesorului 8086 i cele ale micros procesoarelor RISC. VII. Referitor la setul de instructiuni al microprocesorului 8086 justicati atributele: simpli tate, ortogonalitate, completitudine.

Lucrarea 7 Programarea limbaj de asamblare n 8086


Aceast lucrare prezint etapele care trebuie urmate pentru realizarea unui program executabil a a pornind de la un cod surs scris limbaj de asamblare. a n Exist un sfat care zice c pentru a te face eles trebuie s vorbeti ecruia pe limba lui. Dar a a nt a s a care este limba microprocesorului? Microprocesorul codic at datele c i instructiunile a t t s cifre binare {0, 1}. Dei teoretic este posibil, astzi nimeni nu mai concepe s vorbeasc n s a a a (programeze) la un nivel at de sczut. Programarea t a ntr-un limbaj de nivel nalt (C, Pascal, Fortran) a devenit ceva natural. Limbajele de acest nivel au specicatii foarte apropiate de modul de g ndire uman: decizii, iteratii, prelucrri aritmetice i logice cu scalari sau matrici, a s etc. Din pcate, cu c limbajul este mai apropiat de limbajul uman, cu at este mai deprtat a t t a de limbajul microprocesorului. Limbajele de nivel nalt permit gestionarea unor programe mari dar nu totdeauna permit gestionarea ecient a resurselor hardware interne microprocesorului. a Limbajul de asamblare, spre deosebire de limbajul cifrelor binare, este un limbaj accesibil programatorului uman. Programul scris limbaj de asamblare (cod surs) nu este direct exen a cutabil de ctre microprocesor. a, ecrei instructiuni limbaj de asamblare corespunde o a Ins a n i instructiune binar ce este eleas (decodicat) i executat de ctre microprocesor. Codul a nt a a s a a binar al operatiei (opcode) este asociat cu un grup de litere sugestiv pentru efectul instructiunii respective (mnemonic). a Se poate face o analogie ntre limbajele vorbitorilor umani i limbajele de asamblare ale mis croprocesoarelor. Limbajul de asamblare este propriu ecrui tip de microprocesor parte. a n cadrul unei familii, Familii diferite de microprocesoare au seturi diferite de instructiuni. In o generatie mai nou de microprocesoare preia setul de instructiuni al generatiei vechi i a s l sporete, incluz instructiuni specice gestionrii noilor resurse hardware aprute. Dar, s nd a a n general, un microprocesor de generatie nou poate rula i aplicatii scrise pentru micropro a s cesoarele din generatia anterioar. Exist elemente comune ale seturilor de instructiuni ale a a diferitelor familii de microprocesoare.

93

94

LUCRAREA 7. PROGRAMAREA LIMBAJ DE ASAMBLARE 8086 IN

7.1

Ciclul de dezvoltare al programelor scrise limbaj n de asamblare

Pentru a executat de ctre microprocesor, un program scris de un programator uman trebuie a s parcurg c a a teva transformri. Reprezentarea grac a acestor transformri este prezentat a a a a gura 7.1. n

.LIB Editor de texte .C Compilator .OBJ Linker Editor de texte .ASM Asamblor .OBJ .EXE .COM

Lansare in executie

Depanator

Mesaje de eroare

Mesaje de eroare

Mesaje de eroare

Figura 7.1: Reprezentarea grac a ciclului de dezvoltare a programelor scrise limbaj de a n asamblare Pentru elegerea termenilor care apar gura 7.1, se prezint c nt n a teva denitii. Limbaj de asamblare - limbaj de programare folosit de programatorul uman pentru a descrie un algoritm folosind setul de instructiuni propriu unui anumit microprocesor. Fiecare microprocesor are un limbaj de asamblare propriu, dei se pot gsi multe elemente comune s a mai multor microprocesoare. Formatul instructiunilor limbaj de asamblare 8086 este: n [<etichet>:] <mnemonic> [<destinatie>[, <surs>]] [; comentariu] a a a Program (cod) surs - program scris limbaj de asamblare. Pe l a instructiunile a n ng n limbaj de asamblare care au corespondent setul de instructiuni al microprocesorului, n programul surs mai poate contine i directive de asamblare. Directivele de asamblare nu a s genereaz cod executabil ci furnizeaz asamblorului indicatii despre modul de transfora a mare a codului surs cod executabil. a n Asamblor - program (software) care translateaz programul surs scris limbaj de asamblare a a n ntr-un limbaj main posibil de executat de ctre microprocesor. s a a Asamblare - procesul de conversie de cod efectuat de asamblor. Cod obiect - program aat ntre limbajul de asamblare i limbajul main. Codul obiect nu s s a este direct executabil de ctre microprocesor ci trebuie s treac prin procesul de editare a a a a legturilor. a

7.2. ASAMBLAREA

95

Linker (link editor) - program (software) care realizeaz procesul de editare de legturi. a a Linker-ul primete la intrare unul sau mai multe iere obiect (eventual i iere ce contin s s s s biblioteci de module) i genereaz un ier direct executabil. s a s Link-editare (editare de legturi) - procesul de rezolvare a referintelor externe modulului a i a referintelor la adrese cadrul unui modul obiect. Rezultatul link-editrii este un s n a program direct executabil de ctre microprocesor. Editarea de legturi realizeaz trei a a a actiuni principale: - Combin modulele separate de cod obiect a ntr-un singur ier executabil; s - Rezolv referintele la variabile externe; a - Optional, produce un ier ce contine informatia despre modul care au fost legate s n ierele obiect. s Limbaj main - limbaj binar interpretat de ctre microprocesor ca instructiuni executabile. s a a Program executabil - transpunerea unui algoritm limbaj main. n s a

7.2

Asamblarea

Asamblorul rmei Borland se numete Turbo Assembler (T ASM ). Asamblorul accept la ins a trare un ier surs care contine instructiuni limbaj de asamblare (specice microprocesorus a n lui) i un set de directive (specice asamblorului). Prin directive de asamblare, programatorul s poate transmite asamblorului indicatii despre modul de asamblare a codului surs. Acest ier a s este un ier ASCII, care are extensia implicit .ASM . Ca punct de plecare, se poate spune c s a a un asamblor este un program care translateaz un program surs scris limbaj de asamblare a a n cod main. principiu, sarcina asamblorului este de a converti mnemonicile limbajului de n s a In asamblare echivalentele numerice care reprezint codul main. n a s a Pentru a translata codul, asamblorul trebuie s parcurg programul surs cel putin o dat. a a a a Fiecare citire a codului surs se numete trecere (pass, limba englez). Cele mai multe a s n a asambloare necesit dou treceri, dei exist asambloare cu o singur trecere sau cu mai mult a a s a a de dou treceri. a prima trecere, asamblorul execut urmtoarele actiuni: In a a - face analiza sintactic a codului i determin oset-ul pentru ecare linie (adresa la care a s a se va asambla); - face ipoteze asupra valorilor nedenite; - face vericrile elementare de corectitudine a codului i aeaz mesaje de eroare; a s s a - optional, genereaz un ier listing intermediar. a s a doua trecere, asamblorul execut urmtoarele actiuni: In a a - ncearc reconcilierea valorilor presupuse trecerile anterioare; a n - genereaz ierul obiect, care are extensia implicit .OBJ. a s a

96

LUCRAREA 7. PROGRAMAREA LIMBAJ DE ASAMBLARE 8086 IN - optional, genereaz ierul listing, care are extensia implicit .LST . Fiierul listing poate a s a s considerat ca un raport al asamblorului. Acest ier contine at specicatile limbaj s t n de asamblare c i instructiunile limbaj main rezultate dup asamblare; t s n s a a - optional, genereaz ierul de referinte a s ncruciate, care are extensia implicit .XRF . s a Acest ier contine informatii pe care alte programe (specice asamblorului) le folosesc s pentru a crea o list de referinte a ncruciate ale simbolurilor utilizate ierul surs. s n s a Pentru crearea concret a acestui ier se utilizeaz un alt program, care cazul T ASM a s a n se numete T CREF . s

Turbo Assembler este un program care accept parametrii transmii prin linia de comand. a s a Sintaxa liniei de comand a asamblorului, aa cum este ea specicat de rma productoare a s a a este descris continuare.. a n Turbo Assembler Version 2.51 Copyright (c) 1988, 1991 Borland International

Syntax:TASM [options] source [,object] [,listing] [,xref] /a,/s /c /dSYM[=VAL] /e,/r /h,/? /iPATH /jCMD /kh# /l,/la /ml,/mx,/mu /mv# /m# /n /o,/op /p /q /t /w0,/w1,/w2 /w-xxx,/w+xxx /x /z /zi,/zd Alphabetic or Source-code segment ordering Generate cross-reference in listing Define symbol SYM = 0, or = value VAL Emulated or Real floating-point instructions Display this help screen Search PATH for include files Jam in an assembler directive CMD (eg. /jIDEAL) Hash table capacity # symbols Generate listing: l=normal listing, la=expanded listing Case sensitivity on symbols: ml=all, mx=globals, mu=none Set maximum valid length for symbols Allow # multiple passes to resolve forward references Suppress symbol tables in listing Generate overlay object code, Phar Lap-style 32-bit fixups Check for code segment overrides in protected mode Suppress OBJ records not needed for linking Suppress messages if successful assembly Set warning level: w0=none, w1=w2=warnings on Disable (-) or enable (+) warning xxx Include false conditionals in listing Display source line with error message Debug info: zi=full, zd=line numbers only

Sintaxa lansrii executie a utilitarului TCREF este urmtoarea: a n a Turbo CREF Syntax: Version 2.0 Copyright (c) 1988, 1991 Borland International

TCREF xrffiles, reffile [options]

@xxxx indicates use response file xxxx Options:

7.3. EDITAREA DE LEGATURI /c /r /p# /w# = = = = lower case significant in symbols full module level report page length (# in lines) page width (# in characters)

97

7.3

Editarea de legturi a

Denumirile de Link Editor i de Linker s absolut echivalente. Linker-ul este un program s nt care translateaz un cod obiect relocatabil (produs de un asamblor sau un compilator) cod a n main executabil. Linker-ul realizeaz trei functii principale: s a a - combin module obiect separate a ntr-un singur ier executabil; s - ncearc rezolvarea referintelor la variabile externe; a - optional, produce un ier listing care se prezint modul de legare a ierelor obiect. s n a s Link editorul rmei Borland se numete Turbo Link (T LIN K). s Link editorul accept la intrare un ier obiect, cu extensia implicit .OBJ. Ca rezultat al linka s a editrii se va genera un ier de cod direct executabil, cu extensia .EXE sau .COM . Optional, a s poate creat un ier listing, cu extensia implicit .M AP , care contine informatii despre modul s a de legare a modulelor ierul executabil (adrese de n s nceput i sf sit ale modulelor etc.). s r Turbo Link este un program care accept parametrii transmii prin linia de comand. Sintaxa a s a liniei de comand a linkerului, aa cum este ea specicat de rma productoare este descris a s a a a continuare.: n Turbo Link Version 4.0 Copyright (c) 1991 Borland International

Syntax: TLINK objfiles, exefile, mapfile, libfiles, deffile @xxxx indicates use response file xxxx Options: /m = map file with publics /x = no map file at all /i = initialize all segments /l = include source line numbers /L = specify library search paths /s = detailed map of segments /n = no default libraries /d = warn if duplicate symbols in libraries /c = lower case significant in symbols /3 = enable 32-bit processing /v = include full symbolic debug information /e = ignore Extended Dictionary /t = create COM file (same as /Tc) /o = overlay switch /P[=NNNNN] = pack code segments

98

LUCRAREA 7. PROGRAMAREA LIMBAJ DE ASAMBLARE 8086 IN

/A=NNNN = set NewExe segment alignment factor /ye = expanded memory swapping /yx = extended memory swapping /C = case sensitive exports and imports /Txx = specify output file type /Tdx = DOS image (default) /Twx = Windows image (third letter can be c=COM, e=EXE, d=DLL)

7.4

Depanarea

Depanarea (debugging, limba englez) const depistarea i eliminarea greelilor din pron a a n s s grame. Firma Borland produce un program numit Turbo Debugger (T D) care faciliteaz dea panarea programelor, la nivel de limbaj de asamblare, mod interactiv, prin intermediul unei n interfete cu meniuri. Sintaxa lansrii executie a programului TD este descris continuare. a n a n

Turbo Debugger

Version 3.1

Copyright (c) 1988, 92 Borland International

Syntax: TD [options] [program [arguments]]-x -c<file> -do,-dp,-ds -h,-? -i -k -l -m<#> -p -r -rp<#> -rs<#> -sc -sd<dir> -sm<#> -vg -vn -vp -w -y<#> -ye<#> turn option x off Use configuration file <file> Screen updating: do=Other display, dp=Page flip, ds=Screen swap Display this help screen Allow process id switching Allow keystroke recording Assembler startup Set heap size to # kbytes Use mouse Use remote debugging Set COM # port for remote link Remote link speed: 1=slowest, 2=slow, 3=medium, 4=fast No case checking on symbols Source file directory <dir> Set spare symbol memory to # Kbytes (max 256Kb) Complete graphics screen save 43/50 line display not allowed Enable EGA/VGA palette save Debug remote Windows program (must use -r as well) Set overlay area size in Kb Set EMS overlay area size to # 16Kb pages

Modul de utilizare a programului T D pentru depanarea programelor scrise limbaj de asamn blare este prezentat anexa ??. n

7.5. APELUL PROCEDURILOR LIMBAJ DE ASAMBLARE IN

99

7.5

Apelul procedurilor limbaj de asamblare n

Un ier ce contine codul surs a unei proceduri descris limbaj de asamblare are formatul s a a n urmtor: a code SEGMENT PUBLIC ASSUME CS:code, DS:code <nume_proc> PROC NEAR ; declaratie de segment de cod

; declaratia procedurii (de tip NEAR)

<salvarea pe stiv a registrelor ce vor fi folosite n cadrul procedurii> a ^ <implementarea algoritmului propriu-zis al procedurii> <refacerea din stiv a registrelor folosite n cadrul procedurii> a ^ RET ; instructiune de ntoarcere din procedur ^ a <nume_proc> ENDP code ENDS ; terminarea procedurii ; ncheierea segmentului de cod ^ ; declararea public a numelui de procedur a a ; pentru a fi posibil apelarea acesteia a ; dintr-un alt fiier de cod s

PUBLIC <nume_proc>

END Un ier ce contine codul surs apelul unei proceduri externe (corpul procedurii se a s n a a ntr-un alt ier surs) are formatul urmtor: s a a EXTRN <nume_proc> : NEAR ; declaratie de procedur extern a a ; declaratie de segment de cod

code SEGMENT PUBLIC ASSUME CS:code, DS:code

<declaratii de date si directive EQU> start: MOV AX, CS MOV DS, AX

; suprapune segmentul de date peste cel de cod

<pregtete parametrii de intrare ai procedurii> a s CALL <nume_proc> ; apel de procedur a <preia parametrii de ieire ai procedurii> s MOV INT AX, 4C00H 21H ; terminare program prin apelul functiei DOS 4CH

code ENDS ; lanseaz n executie programul la adresa etichetei start: a ^ END start

100

LUCRAREA 7. PROGRAMAREA LIMBAJ DE ASAMBLARE 8086 IN

7.6

Experimente

I. Faceti o comparatie ntre limbajul de asamblare i limbajul de nivel s nalt C. Ca exemplicare, se consider problema arii mesajului Hello, world! pe ecran. Acest lucru se a sa poate descrie C cu instructiunea: n printf("Hello, world!\n"); Obtinerea aceluiai efect se descrie limbaj de asamblare cu mai multe instructiuni: s n mov dx, offset HelloMessage mov ah, 9 int 21H HelloMessage DB Hello, world!,13,10,$ Editati ierul HELLOA.ASM urmtorul program limbaj de asamblare: n s a n code SEGMENT assume cs:code, ds:code org 100H start: mov mov mov mov int mov int ax, ds, dx, ah, 21H ah, 21H cs ax offset HelloMessage 9 4CH ; terminarea programului

; pointer la sirul "Hello, world!" ; functie DOS de afiare sir s ; afieaz mesajul "Hello, world!" s a

HelloMessage DB Hello, world!,13,10,$ code ends end start Asamblati ierul HELLOA.ASM lans comanda: s nd TASM HELLOA.ASM Ca efect, se va genera ierul obiect HELLOA.OBJ. Consultati cu un editor de texte s continutul acestui ier. s Link-editati ierul HELLOA.OBJ lans comanda: s nd TLINK HELLOA.OBJ

Ca efect, se va genera ierul executabil HELLOA.EXE i ierul de asocieri HELLOA.M AP . s s s Lansati executie ierul HELLOA.EXE. Consultati cu un editor de texte continutul n s ierului HELLOA.M AP . s Link-editati ierul HELLOA.OBJ lans comanda: s nd

7.6. EXPERIMENTE TLINK /t HELLOA.OBJ

101

Optiunea /t determin link-editorul s genereze ierul executabil HELLOA.COM , a a s n format .COM . Lansati executie ierul HELLOA.COM . n s Editati ierul HELLOC.C urmtorul program limbajul C: n s a n #include <stdio.h> void main() { printf("Hello, world!\n"); } Compilati ierul surs HELLOC.C mediul BorlandC (Alt C, C sau Alt F 9). s a n Ca efect, se va genera ierul obiect HELLOC.OBJ. Consultati cu un editor de texte s continutul acestui ier i comparati-l cu cel al ierului HELLOA.OBJ. s s s Link-editati ierul HELLOC.C (AltC, L) i obtineti ierul executabil HELLOC.EXE s s s i ierul de asocieri HELLOC.M AP . Lansati executie ierul HELLOC.EXE. s s n s Consultati cu un editor de texte continutul ierului HELLOC.M AP i comparati-l cu s s cel al ierului HELLOA.M AP . s Revenind la prompterul sistem, convertiti ierul HELLOC.EXE din format .EXE s n ierul HELLOC.COM format .COM , folosind utilitarul EXE2BIN.EXE. Cos n manda este: EXE2BIN HELLOC.EXE HELLOC.COM Studiati diferentele ntre descrierea unui program limbaj de asamblare i descrierea n s aceluiai program limbajul C urmrind chestiunile enumerate continuare. s n a n - Comparati ierele HELLOA.ASM i HELLOC.C din punct de vedere al numrului s s a de linii i din punct de vedere al dimensiunii acestora; s - Comparati continutul ierele HELLOA.M AP i HELLOC.M AP ; s s - Comparati dimensiunile ierelor HELLOA.COM i HELLOC.COM ; s s - Comparati dimensiunile ierelor HELLOA.EXE i HELLOC.EXE; s s - Comparati dimensiunile ierelor HELLOA.EXE i HELLOA.COM , respectiv s s HELLOC.EXE i HELLOC.COM ; s - Rulati pas cu pas ierul HELLOC.C mediul BorlandC. Rulati pas cu pas s n ierul HELLOC.COM Turbo Debugger. Linia de comand este: s n a TD HELLOC.COM - Rulati pas cu pas ierul HELLOC.EXE Turbo Debugger. Linia de comand s n a este: TD HELLOC.EXE - Rulati pas cu pas ierul HELLOA.COM Turbo Debugger. s n

102

LUCRAREA 7. PROGRAMAREA LIMBAJ DE ASAMBLARE 8086 IN - Comparati rularea pas cu pas Turbo Debugger a ierului HELLOA.COM n s cu cea a ierului HELLOC.COM . Faceti corespondenta s ntre modul care s-a n descris programul limbaj de asamblare i limbaj C, cu instructiunile efectiv n s n executate de ctre microprocesor. a - Asamblati ierul HELLOA.ASM cu optiunea de includere a informatiei pentru s depanare, lans comanda: nd TASM /zi HELLOA Link-editati ierul HELLOA.OBJ cu optiunea de includere a informatiei pentru s depanare, lans comanda: nd TLINK /v HELLOA, HELLOA_D n Se va genera ierul HELLOA D.EXE. Comparati imaginea Turbo Debugger a s ierului HELLOA.EXE cu cea a ierului HELLOA D.EXE. s s - Generati un listing la asamblarea ierului HELLOA.ASM cu comanda: s TASM /la HELLOA Consultati cu un editor de texte ierul HELLOA.LST . s

II. Scrieti un program limbaj de asamblare care s apeleze o procedur scris limbaj de n a a a n asamblare, dar care se a a ntr-un alt ier. Procedura trebuie s s a nscrie ntr-un bloc de memorie un octet i s genereze suma de control asociat blocului. Parametrii de intrare s a a ai procedurii s transmii urmtoarele registre: nt s n a AX - adresa de nceput a blocului de memorie; BX - numrul de locatii de memorie din bloc (dimensiunea blocului); a DL - octetul care trebuie nscris ecare locatie a blocului de memorie. n La revenirea din procedur, registrul DL contine suma de control. Suma tuturor locatiilor a blocului, plus cea a registrului DL este zero. Editati ierul P ROC.ASM urmtorul cod surs limbaj de asamblare: n s a a n code SEGMENT PUBLIC ASSUME CS:code, DS:code WriteDL PROC PUSH PUSH MOV MOV DEC XOR MOV SUB DEC JNZ POP POP NEAR SI BX SI, BX BX, AX BX DH,DH [BX+SI], DH,DL SI muta BX SI ; Offset-ul byte-ului curent ; Adresa nceputului de bloc n BX ^ ^ ; Suma de control DL ; Calculeaz suma de control a ; Pointeaz la urmtorul byte a a

muta:

7.6. EXPERIMENTE RET WriteDL ENDP code ENDS PUBLIC WriteDL END Editati ierul AP EL.ASM urmtorul cod surs limbaj de asamblare: n s a a n EXTRN WriteDL : NEAR code SEGMENT ASSUME CS:code, DS:code Dimens DataB start: EQU EQU MOV MOV MOV MOV MOV CALL MOV INT Bloc DB 3H 1H AX, CS DS, AX AX, offset Bloc BX, Dimens DL, DataB WriteDL AX, 4C00H 21H

103

Dimens DUP(?)

code ENDS END start Din ierele surs, realizati ierul executabil T EST.EXE, lans comenzile: s a s nd TASM PROC TASM APEL TLINK APEL PROC, TEST Urmriti executia programului prin rulare pas cu pas cu Turbo Debugger: a TD TEST

104

LUCRAREA 7. PROGRAMAREA LIMBAJ DE ASAMBLARE 8086 IN

Lucrarea 8 Declararea datelor i a segmentelor s


Aceast lucrare prezint modul care se declar limbaj de asamblare structurile de date a a n a n necesare oricrui program. La microprocesoarele familiei 8086, memoria este segmentat. a a Gestionarea memoriei limbaj de asamblare revine exclusiv programatorului. Exercitiile pron puse nalul lucrrii demonstreaz c nu este sucient exprimarea algoritmului limbajul n a a a a n de asamblare (at de srac fat de C...), ci este necesar elegerea modului de administrare t a a a nt a memoriei segmentate.

8.1

Declararea datelor

Sintaxa declaratiei unei date (variabile) este: [<nume>] <tip> <list expresii de initializare> a sau [<nume>] <tip> <factor> DUP (<list expresii de initializare>) a <nume> este numele asociat variabilei, prin care se va putea face o referire la aceasta. Numele este optional. Dac a ntr-o declaratie de date nu apare nici un nume, s alocate date, dar nt adresa de nceput nu poate referit printr-un nume simbolic. Numele poate considerat a ca ind un pointer (adresa nceputului zonei de memorie) la data asociat. a <tip> reprezint unul din cuvintele rezervate ce desemneaz un tip de date. Tipurile de date a a existente i cuvintele rezervate pentru desemnarea acestora s prezentate tabelul 8.1. s nt n <list expresii de initializare> specic valorile cu care este initializat zona de memorie asoa a a ciat datelor denite. lipsa unor valori concrete, prin caracterul ?, se indic faptul a In a lista de initializare pot apare c zona de date este rezervat dar nu i initializat. In a a s a constante sau expresii evaluate de ctre asamblor (static). a Operanzii expresiilor pot constante numerice, alfanumerice i nume pentru care asams blorul asociaz valori: nume de date, etichete de instructiuni, nume de segmente, etc. a Constantele ntregi pot reprezenta numere scrise bazele 2, 8, 10 sau 16. Baza care n n 105

106

LUCRAREA 8. DECLARAREA DATELOR SI A SEGMENTELOR <tip> Semnicatie ( limba englez) n a DB Dene Byte (1 byte) DW Dene Word (2 bytes) DD Dene Doubleword (4 bytes) DQ Dene Quadword (8 bytes) DT Dene Ten bytes (10 bytes) Tip byte word dword qword tbyte

Tabelul 8.1: Tipuri de date i cuvinte rezervate pentru desemnarea acestora. s

este reprezentat numrul este desemnat de o liter aat la sf situl irului de cifre ce a a a a r s formeaz constanta {B, Q, D, H}. Implicit, dac nu apare nici una din literele ce desema a neaz baza de numeratie, se consider c numrul este exprimat baza 10. Constantele a a a a n virgul otant se pot exprima formatul cu mantis i exponent. Constantele aln a a n as fanumerice, individuale sau iruri, s incluse n s nt ntre caractere apostrof simple () sau duble (). O constant alfanumeric este asociat de ctre asamblor cu codul ASCII al a a a a caracterului corespunztor. a O dat initializat cu un nume de dat poate considerat similar cu o variabil de a a a a a a tip pointer. acest caz, data contine adresa unei date ce are o valoare i nu o valoare In s propriu-zis. Pointerii de dimensiune 2 baiti contin adrese cu referinte apropiate ( a n acelai segment de memorie). Pointerii de dimensiune 4 baiti contin adrese cu referinte s ndeprtate ( segmente de memorie disjuncte). a n <factor> specic de c ori se repet <lista de expresii de initializare> ce este inclus a te a a ntre paranteze rotunde. Valoarea initial poate caracterul ? (neinitializat), orice expresie a constant, orice valoare evaluat la o constant de ctre asamblor sau un alt operator a a a a DUP. Prin utilizarea operatorului DUP se pot deni structuri de date similare cu matricile uni sau multidimensionale. Datele reprezentate pe mai mult de un byte s stocate memorie conform regulii little-endian nt n (cel mai putin semnicativ byte este stocat la cea mai mic adres de memorie). a a Adresa locatiei de memorie curente (unde se aloc data) poate s e referit prin simbolul $ a a a sau prin expresia this <tip>. Adresa logic (oset-ul) a unei date poate obtinut prin operatorul OFFSET. Adresa de baz a a a a segmentului care a fost denit data poate obtinut prin operatorul SEG. n a a Adresarea unei date ca ind de alt tip dec a fost declarat este posibil prin utilizarea operat a a torului de conversie P T R. Sintaxa unei expresii construite cu acest operator este: <tip> PTR <expresie> Ca efect, <expresia> va interpretat prin intermediul atributului <tip>. continuare se a In prezint, ca exemplu, o portiune de cod. a . . . DataW DataB . . .

dw db

10 dup (?) 10 dup (?)

8.1. DECLARAREA DATELOR mov al, byte ptr DataW mov ax, word ptr DataB ; ; ; ; mut n AL primul byte din cei 10 x 2 rezervati a ^ pentru DataW mut n AX primii doi baiti din cei 10 rezervati a ^ pentru DataB

107

continuare se prezint listingul unor declaratii de date limbaj de asamblare. Listingul In a n a fost obtinut cu TASM (cu optiunea /la). Listingul prezint, partea din st a n nga, adresa de memorie i datele rezultate urma asamblrii, iar partea din dreapta codul, aa cum a s n a n s aprut ierul surs. a n s a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 0000 0000 0001 0003 0007 000F 0019 0023 002D 0031 0032 0035 0037 003A 003D 0040 0043 004C 0052 0053 0054 0056 0058 005A 005E 0062 0067 0069 006D 0095 00A5 00C5 00D9 data segment D1 db 16 D2 dw 4*3 D3 dd 4294967295 D4 dq ? D5 dt 12345678901D D6 dt 12345678901234567890 D7 dt 12345678901 D8 db 0101B,27O, 29, 0AFH D9 db 3+"0" db 1, 2, 3 D10 dw D9+1 D11 db 97, 98, 99 D12 db a, b, c D13 db abc D14 db "abc" D15 db Mesaj:, 13, 10, $ D16 D17 D18 D19 D20 D21 D22 D23 D24 D25 D26 D27 D28 D29 db db db dw dw db dd dd db dw dd dd db dd "Salut!" $-D16 this byte-D16 OFFSET D16 SEG D16 "ab" "ab" "a" "Text",0 D24 D24 10 dup (1) 16 dup (?) 2 dup (2 dup (2 dup (0))) 5 dup (3 dup (1), 2)

10 000C FFFFFFFF ???????????????? 000000000002DFDC1C35 12345678901234567890 00000000012345678901 05 17 1D AF 33 01 02 03 0032r 61 62 63 61 62 63 61 62 63 61 62 63 4D 65 73 61 6A 3A 0D+ 0A 24 53 61 6C 75 74 21 06 07 004Cr 0000s 61 62 00006162 00000061 54 65 78 74 00 0062r 00000062sr 0A*(00000001) 10*(??) 02*(02*(02* + (00000000))) 05*(03*(01) 02) end

D30 db data ends

- Pe linia 2 se declar o dat de tip byte cu numele D1, initializat cu constanta 16. a a a

108

LUCRAREA 8. DECLARAREA DATELOR SI A SEGMENTELOR

- Pe linia 3 se declar o dat de tip word cu numele D2, initializat cu valoarea 12. Valoarea a a a este determinat momentul asamblrii prin evaluarea expresiei 4*3. a n a - Pe linia 4 se declar o dat de tip dword cu numele D3, initializat cu cea mai mare valoare a a a posibil, exprimat baza 10. Exprimarea baza 16 este FFFFFFFF. a a n n - Pe linia 5 se declar o dat de tip qword cu numele D4, lsat neinitializat. a a a a a - Pe liniile 6, 7 i 8 se declar date de tip tbyte cu numele D5, D6 i D7, initializate cu diverse s a s valori. De remarcat corespondenta ntre valorile din codul surs i cele din memorie. as - Pe linia 9 se declar o dat de tip byte cu numele D8, initializat cu trei valori constante a a a exprimate bazele de numeratie 2, 8, 10 i 16. n s - Pe linia 10 se declar o dat de tip byte cu numele D9, initializat cu codul ASCII al caracterului a a a 3, obtinut prin nsumarea valorii ntregi 3 la codul ASCII al caracterului 0. - Pe linia 11 se declar o dat de tip byte creia nu i se asociaz nici un nume. Aceste date pot a a a a referite prin numele altor date. - Pe linia 12 se declar o dat de tip word cu numele D10, initializat cu o valoare constant a a a a obtinut prin evaluarea unei expresii care intr i numele unei date. Valoarea obtinut este a n as a adresa de nceput a datelor declarate pe linia 11. D10 poate privit ca un pointer la datele declarate pe linia 11. - Pe liniile 13, 14, 15 i 16 se declar date de tip byte cu numele D11, D12, D13 i D14, initializate s a s cu aceleai valori exprimate moduri diferite: s n ntregi, caractere, ir delimitat de caractere s apostrof simplu, ir delimitat de caractere apostrof dublu. s - Pe linia 17 se declar o dat de tip byte cu numele D15, initializat cu o list de expresii de a a a a diferite tipuri (ir de caractere, s ntregi, caracter). Caracterele ASCII asociate codurilor 13 i 10 s s caracterele de control CR i LF. Sirul astfel denit poate transmis ca argument al functiei nt s DOS 9H de tiprire ir de caractere. a s - Pe linia 19 se declar o dat de tip byte cu numele D16, initializat cu un ir de caractere ce a a a s contine i un semn de punctuatie. s - Pe linia 20 se declar o dat de tip byte cu numele D17, initializat cu dimensiunea datelor a a a D16. Adugarea unor caractere irului D16 determin actualizarea automat a valorii din D17, a s a a datorit modului care a fost scris expresia de initializare. a n a - Pe linia 21 se declar o dat de tip byte cu numele D18, initializat cu o valoare provenind a a a dintr-o expresie similar cu cea de pe linia 20. a - Pe liniile 22 i 23 se declar date de tip word cu numele D19 i D20, initializate cu valorile s a s oset-ului i adresei de baz a segmentului care a fost denit data D16. Adresa datei D16 s a n a poate considerat D20:D19. a - Pe liniile 24, 25 i 26 se observ modul care se ordoneaz datele de mai multi baiti, conform s a n a regulii little-endian. - Pe linia 27 se declar o dat de tip byte cu numele D24, initializat cu un ir de caractere a a a s urmat de un ntreg. - Pe linia 28 se declar o dat de tip word cu numele D25, ce poate interpretat ca pointer a a a apropiat la data D24. D25 are valoarea oset-ului datei D24. - Pe linia 29 se declar o dat de tip dword cu numele D26, ce poate interpretat ca pointer a a a ndeprtat la data D24. D25 are ca valoare doi baiti segmentul i doi baiti oset-ul datei D24. a s

8.2. DECLARAREA SEGMENTELOR

109

- Pe linia 30 se declar o dat de tip dword cu numele D27, initializat cu un vector de 10 valori a a a ntregi. - Pe linia 31 se declar o dat de tip byte cu numele D28, de dimensiune 16 baiti. Zona de a a memorie asociat se las neinitializat. a a a - Pe linia 32 se declar o dat de tip dword cu numele D29, de dimensiune 2 2 2 = 8. Zona a a de memorie asociat este a n ntregime initializat cu 0. a - Pe linia 34 se declar o dat de tip byte cu numele D30. Zona de memorie asociat este a a a initializat cu 5 de pattern-uri: 1, 1, 1, 2. total, dimensiunea datei D30 este de 20 de baiti. a In Zona de memorie rezervat pentru declaratiile anterioare este prezentat gura 8.1. a a n ds:0000 ds:0010 ds:0020 ds:0030 ds:0040 ds:0050 ds:0060 ds:0070 ds:0080 ds:0090 ds:00A0 ds:00B0 ds:00C0 ds:00D0 10 1C 56 AF 61 74 00 00 00 00 00 00 00 02 0C DC 34 33 62 21 00 01 01 01 00 00 00 01 00 DF 12 01 63 06 54 00 00 00 00 00 00 01 FF 02 01 02 4D 07 65 00 00 00 00 00 00 01 FF 00 89 03 65 4C 78 00 00 00 00 00 00 02 FF 00 67 32 73 00 74 01 01 00 00 00 01 01 FF 00 45 00 61 56 00 00 00 00 00 00 01 01 00 00 23 61 6A 5A 62 00 00 00 00 00 01 01 00 00 01 62 3A 61 00 00 00 00 00 00 02 02 00 90 00 63 0D 62 62 01 01 00 00 00 01 00 00 78 00 61 0A 62 00 00 00 00 00 00 01 00 00 56 00 62 24 61 56 00 00 00 00 00 01 00 00 34 00 63 53 00 5A 00 00 00 00 00 02 00 00 12 05 61 61 00 01 01 01 00 00 00 01 00 00 90 17 62 6C 61 00 00 00 00 00 00 01 00 35 78 1D 63 75 00 00 00 00 00 00 00 01 00

Figura 8.1: Zon de memorie rezervat prin declaratii de date. a a

8.2

Declararea segmentelor

Microprocesoarele familiei 8086 implementeaz un mecanism de segmentare a memoriei. Se a pot deni oric segmente logice, de dimensiune maxim 64 KB. Segmentele pot disjuncte te a sau suprapuse partial sau total. La un moment dat, microprocesorul poate avea acces numai la patru segmente. Adresele de baz ale acestor segmente se gsesc cele patru registre segment: a a n CS, DS, SS i ES. s

8.2.1

Sintaxa declaratiei de segment

Sintaxa declaratiei unui segment este urmtoarea: a <nume> SEGMENT [<aliniere>] [<combinare>] [<clasa>] <corpul segmentului> <nume> ENDS <nume> denete numele segmentului. Acest nume poate unic sau poate acelai nume s s

110

LUCRAREA 8. DECLARAREA DATELOR SI A SEGMENTELOR atribuit i altor segmente din program. Segmentele cu nume identic s tratate ca i cum s nt s ar acelai segment. De exemplu, dac este necesar s se plaseze diferite portiuni ale s a a unui singur segment module surs diferite, atunci segmentului este atribuit acelai n a i s nume ambele module. n

<aliniere> este un c mp optional ce denete tipul adresei de s nceput a segmentului. Prin valorile c mpului aliniere: PARA/BYTE/WORD/PAGE se specic faptul c adresa de a a nceput a zonei de memorie rezervat segmentului este divizibil cu 16/1/2/256. Valoarea a a implicit a acestui c a mp este PARA. <combinare> este un c mp optional care denete modul de combinare a segmentelor ce au s acelai nume. Informatia transmis de programator prin intermediul acestui c s a mp este folosit de ctre link-editor. C a a mpul combinare poate avea cinci valori, cuvinte rezervate. PUBLIC - concateneaz toate segmentele cu acelai nume pentru a forma un sega s ment unic, contiguu. Toate instructiunile i adresele de date din noul segment se s refer la un registru de segment unic, iar toate deplasamentele s ajustate pentru a nt a reprezenta distanta de la nceputul segmentului. STACK - concateneaz toate segmentele cu acelai nume pentru a forma un segment a s unic, contiguu. Acest tip de combinare este identic cu tipul de combinare PUBLIC, cu exceptia faptului c toate adresele din noul segment se refer la registrul SS al a a segmentului. Registrul indicator de stiv (SP) este initializat la lungimea segmena tului. Segmentul stiv din programul utilizatorului va folosi mod normal STACK a n ntruc acesta initializeaz automat registrul SS. Dac se creeaz un segment de stiv t a a a a i nu se utilizeaz tipul STACK, se vor da implicit instructiuni pentru initializarea s a registrelor SS i SP. s COMMON - creeaz segmente suprapuse prin plasarea a nceputului tuturor segmentelor cu acelai nume la aceeai adres. Lungimea zonei rezultate este lungimea s s a celui mai lung segment. Toate adresele din segmente s raportate la aceeai adres nt s a de baz. Dac variabilele s initializate mai multe segmente ce au acelai nume i a a nt n s s tipul COMMON, datele cel mai recent initializate nlocuiesc toate datele initializate anterior. MEMORY - concateneaz toate segmentele cu aceleai nume pentru a forma un a s segment unic, contiguu. Link-editorul trateaz segmentele MEMORY aceleai a n s mod ca i segmentele PUBLIC. Segmentul curent va plasat memorie spatiul s n n rmas disponibil dup plasarea memorie a celorlalte segmente. a a n AT <adres> - determin ca toate adresele de etichete i variabile denite segment a a s n s e relative la o adres. Adresa poate orice expresie corect, dar nu poate contine a a a o referint anticipat (o referint la un simbol denit mai t a a a rziu ierul surs). Un n s a segment AT nu contine, de obicei, cod sau date initializate. schimb, el reprezint In a un model de adres ce poate plasat peste codul sau datele aate deja memorie, a n cum ar o zon tampon sau o alt locatie de memorie absolut denit de partea a a a a hardware. Editorul de legturi nu va genera cod sau date pentru segmentele AT, a dar datele sau codul existent pot accesate prin nume dac se specic o etichet a a a ntr-un segment AT. Dac nu apare nici un tip combinare, segmentul va avea un tip special. Segmentele cu a acelai nume nu vor combinate. schimb, ecare segment va primi propriul segment s In

8.2. DECLARAREA SEGMENTELOR

111

zic atunci c este arcat memorie. Dei un nume de segment dat poate utind nc n s lizat de mai multe ori ntr-un ier surs, ecare denitie de segment ce utilizeaz acel s a a nume trebuie s aibe exact aceleai atribute. Dac s precizate tipuri de combinare a s a nt ntr-o denitie initial de segment, denitile ulterioare pentru acel segment nu necesit a a specicarea nici unui alt tip de combinare. <clasa> este un c mp optional care specic modul de asociere a segmentelor ce au nume a diferite, dar scopuri similare. Tipul se folosete pentru a controla ordinea segmentelor s i pentru a identica segmentul de cod. Numele de clas va inclus s a ntre caractere apostrofuri simple (). Segmentele pentru care nu este stabilit explicit un nume de clas a vor avea numele de clas nul. Link-editorul nu impune restrictii asupra numrului sau a a dimensiunii segmentelor dintr-o clas. a <corpul segmentului> contine instructiunile care se vor asambla spatiul de memorie al seg n mentului i declaratiile de date prin care se vor rezerva zone de memorie. s

8.2.2

Asocierea segmentelor cu registre

Dei la un moment dat doar patru segmente pot accesate, s ntr-un program se pot deni mult mai multe segmente. De cele mai multe ori, instructiunile limbaj de asamblare apeleaz datele n a din memorie prin adresa lor logic, segmentul ind determinat implicit de ctre procesor. a a In tabelul 6.4 s prezentate segmentele considerate implicite cazul unor apeluri la memorie. nt n De exemplu, instructiunea JM P consider c segmentul implicit este cel asociat cu registrul a a CS. Instructiunile M OV consider c segmentul este asociat cu registrul DS. a a Determinarea segmentului care se face referirea la memorie se face de ctre microprocesor, n a limbaj de asamblare se poate apela o dat momentul executiei efective a instructiunii. In n a care nu se a segmentul implicit prin plasarea a n nainte de numele datei a numelui registrului de segment. mov mov mov ax, Data1 ax, ES:Data2 ax, CS:Data3 ; apel la Data1 aflat n segmentul DS (implicit) a ^ ; apel la Data2 aflat n segmentul ES (explicit) a ^ ; apel la Data3 aflat n segmentul CS (explicit) a ^

Prin utilizarea directivei ASSU M E, programatorul poate transfera asamblorului sarcina stabilirii registrelor explicite cazul apelrii unor date declarate segmente diferite. n a n Directiva ASSU M E se folosete pentru a indica asamblorului asocierea dintre un segment i s s un registru segment. Aceast directiv nu controleaz activitatea procesorului. Programatorul a a a trebuie s scrie program instructiuni explicite de arcare a registrelor de segment cu valorile a n nc declarate directiva ASSU M E. Directiva ASSUME afecteaz numai consideratiile referitoare n a la momentul asamblrii. Exist i situatii c se pot folosi instructiuni pentru modicarea a a s nd consideratiilor referitoare la momentul executiei. Sintaxa directivei ASSU M E este: ASSUME <registru segment> : <nume> ASSUME <registru segment> : NOTHING ASSUME NOTHING <registru segment> poate oricare din cele patru nume de registre segment: CS, DS, ES sau SS.

112

LUCRAREA 8. DECLARAREA DATELOR SI A SEGMENTELOR

<nume> trebuie s e numele segmentului ce se va asocia cu <registru segment>. Instruca iunile ulterioare directivei, care consider un registru implicit pentru referirea mod aut a n tomat a etichetelor sau a variabilelor, presupun c dac segmentul implicit este <registru a a segment>, atunci eticheta sau variabila accesat se a segmentul <nume>. a a n Cuv ntul cheie N OT HIN G anuleaz selectia de segmente curent, pentru unul sau toate rea a gistrele de segment. mod normal, o singur instructiune ASSU M E denete toate cele patru registre segment la In a s nceputul registrului surs. Totui, directiva ASSU M E poate folosit orice punct pentru a s a n a modica supozitiile referitoare la segment. continuare este prezentat un program pentru exemplicarea efectului directivei ASSU M E. In Pe coloana din st nga apare codul surs. Pe coloana din dreapta apare codul dezasamblat cu a T urboDebbuger. A segment A1 dw 1 A2 dw 2 A ends B segment B1 dw 1 B2 dw 2 B ends code segment assume cs:code, ds:A, es:B C1 dw 1 C2 dw 2 start: ; initializeaz registrele de segment a ; conform directivelor "assume" mov ax, A mov ds, ax mov ax, B mov es, ax ; referiri la date mov ax, A1 mov B1, ax mov es:B2, ax mov dx, A2 mov B2, dx ; suprapune segmentul DS peste CS ; segmentul A nu mai poate fi referit mov ax, cs mov ds, ax

mov mov mov mov

ax,5A56 ds,ax ax,5A57 es,ax

mov mov mov mov mov

ax,[0000] es:[0000],ax es:[0002],ax dx,[0002] es:[0002],dx

mov mov

ax,cs ds,ax

8.2. DECLARAREA SEGMENTELOR assume ds:code ; referiri la date n segmentul DS ^ ; care, n acest caz, ^ ; coincide cu segmentul CS mov mov mov mov mov ax, B1 C1, ax ds:C2, ax cs:C1, ax B2, ax mov mov mov mov mov ax,es:[0000] [0000],ax [0002],ax cs:[0000],ax es:[0002],ax

113

; asamblorul semnaleaz o eroare a ; la linia urmtoare a ; mov A2, ax code ends end start Au fost denite dou segmente: A i B. ecare segment s-au denit dou date de tip word. a s In a La nceputul segmentului de cod, prin directiva ASSU M E, s-au asociat cele dou segmente a cu registrele DS i ES. La s nceputul programului efectiv, imediat dup eticheta start:, s-au a inserat instructiuni de transfer care s initializeze registrele de segment cu valorile presupuse. a Ca efect al directivei ASSU M E, asamblorul a asamblat instructiunea mov B1, ax sub forma: mov es:[0000],ax. Oset-ul datei B1 (0000) a fost precedat de numele de segment es. Prin schimbarea ipotezei asupra continutului registrului DS (prin directiva: assume ds:code) segmentul A nu mai poate accesat. Din acest motiv, cazul existentei instructiunii de pe n ultimul r (mov A2, ax), asamblorul va genera o eroare. Mesajul de eroare este: nd **Error** assume.ASM(50) Cant address with currently ASSUMEd segment registers

8.2.3

Initializarea registrelor

Registrele CS i IP s initializate prin specicarea unei adrese de s nt nceput cu directiva END. Sintaxa directivei este: END [<adresa de nceput>] C mpul <adresa de nceput> este o etichet sau o expresie ce identic adresa la care a a utilizatorul dorete s nceperea executiei atunci c programul este arcat memorie. nd nc n Dac un program este format dintr-un singur modul surs, este necesar ca adresa de a a a nceput s se precizeze acel modul. Dac un program are mai multe module, toate a n a modulele se vor termina cu directiva END. Numai o directiv END denete adresa de a s nceput. Link-editorul nu genereaz eroare la omiterea adresei de a nceput, dar executia va ncepe probabil la o adres greit. a s a Registrul DS trebuie initializat la adresa segmentului ce va folosit pentru date. Adresa segmentului va arcat registrul DS. Deoarece o valoare din memorie nu poate nc a n

114

LUCRAREA 8. DECLARAREA DATELOR SI A SEGMENTELOR arcat direct nc a ntr-un registru segment, initializarea registrului DS necesit dou a a instructiuni de transfer. Instructiunile de initializare a registrului DS apar, de obicei, la nceputul sau foarte aproape de nceputul segmentului de cod. Un exemplu de initializare a registrului de segment DS este prezentat continuare: n date1 SEGMENT ... date1 ENDS code1 SEGMENT ASSUME cs:code1, ds:date1 start: mov ax, date1 ; AX <= adresa de baz a segmentului date1 a mov ds, ax ; DS <= AX ... code1 ENDS END start

Registrele SS i SP s initializate automat la lansarea executie a unui program. Res nt n gistrul de segment SS este initializat automat la valoarea ultimului segment din codul surs cu tipul de combinare STACK. Registrul SP este initializat automat la dimensiunea a segmentului de stiv. Astfel, SS:SP indic initial adresa de srit a segmentului de stiv. a a s a Segmentul de stiv poate initializat sau reinitializat direct prin schimbarea valorilor SS a i SP, prin program. Intruc s t ntreruperile hardware folosesc aceeai stiv ca i programul, s a s acestea trebuie dezactivate timpul schimbrii stivei. n a Registrul ES nu este initializat automat. Dac programul folosete segmentul de date auxi a s liar (folosit implicit operatiile cu iruri), programatorul trebuie s initializeze explicit n s a registrul ES. Initializarea se face prin transferarea registrul ES a valorii corespunztoare n a adresei de nceput a segmentului auxiliar, folosind dou instructiuni de transfer. a

8.2.4

Denirea simplicat a segmentelor a

Versiunile actuale de asambloare au introdus un nou mecanism de denire simplicat a sega mentelor. Acest mecanism este mai uor de utilizat mai ales c se dorete legarea mai multor s nd s module scrise diferite limbaje de programare. Pentru utilizarea acestui mod de denire tren buie specicat mai i modelul de memorie pentru care este scris programul. Modelul de nt memorie are o semnicatie software, preciz modul care se utilizeaz segmentele cadrul nd n a n programului respectiv. Caracteristicile celor 6 modele de memorie s sintetizate tabelul nt n 8.2. Declararea modelului trebuie s precead alte pseudo-instructiuni sau instructiuni care implic a a a referiri la segmente. Declararea modelului se face cu ajutorul unei pseudoinstructiuni de forma: .MODEL <tip model>

8.3

Experimente

I. Editati ntr-un ier programul care urmeaz. Denumiti ierul DEBU G.ASM . s a s

8.3. EXPERIMENTE Model de memorie TINY Volum de date Volum de cod Observatii

115

SMALL MEDIUM COMPACT

LARGE

HUGE

< 64 KB < 64 KB - date+cod+stiv < 64 KB a - adrese relative - apeluri near - toate segmentele fac parte din acelai s grup - programele s de tip .COM nt < 64 KB < 64 KB - segmente de date i cod distincte s - adrese relative - apeluri near < 64 KB > 64 KB - adrese relative - apeluri far > 64 KB < 64 KB - dei datele pot avea un volum mai mare s - adrese zice - apeluri near de 64 KB, exist o restrictie: o structur a a de date nu poate depi 64 KB as > 64 KB > 64 KB - dei datele pot avea un volum mai mare s - adrese zice - apeluri far de 64 KB, exist o restrictie: o structur a a de date nu poate depi 64 KB as > 64 KB > 64 KB - o structur de date poate avea un volum a - adrese zice - apeluri far mai mare de 64 KB Tabelul 8.2: Caracteristici ale modelelor de memorie.

code SEGMENT assume cs:code, ds:code, es:code org 100H start: mov mov mov mov mov rep movs mov int

ax, cs ds, cx si, OFFSET Sir_sursa di, OFFSET Sir_dest cx, 17 Sir_dest, Sir_sursa ah, 4ch 21h

Sir_sursa DB Acesta este sirul Sir_dest DB 17 dup (?) code ends end start Scopul programului este de a copia un ir de caractere denit cu numele Sir_sursa s ntr-o alt zon de memorie unde i s-a rezervat un spatiu de aceeai dimensiune sub numele a a s Sir_dest. Programul contine c teva greeli dei nici asamblorul i nici link-editorul nu s s s furnizeaz vreun mesaj de eroare. Realizati urmtoarele: a a - Studiati efectul ecrei instructiuni sau directive de asamblare care apare codul a n surs. Studiati instructiunea de transfer de iruri movs i efectul prexului rep. a s s

116

LUCRAREA 8. DECLARAREA DATELOR SI A SEGMENTELOR - Studiati modul de denire a datelor i a segmentelor. Tin cont de directivele s nd assume i org, estimati oset-ul la care se vor gsi datele denite. s a - Asamblati i link-editati ierul DEBU G.ASM . s s - Utiliz Turbo Debugger corectati greelile depistate program. nd s n - Modicati denirile de date i programul pentru a minimiza modicrile ulterioare s a determinate de redenirea irului surs, ca lungime i continut. s a s - Studiati diferentele dintre instructiunile: mov mov mov si, OFFSET Sir_sursa si, word PTR Sir_sursa al, Sir_sursa

II. Studiati continutul ierului AF ISARE.ASM . Codul surs descrie un program de s a initializare a registrului AX i ulterior aeaz continutul acestuia pe ecran, exprimat s s a baza 10. n - Studiati modul de denire a datelor i segmentelor. s - Cum explicati c programul utilizeaz stiva (prin instructiuni PUSH i POP) dar nu are a a s un segment de stiv denit explicit? Vericati continutul stivei de-a lungul executiei a programului. - Studiati modul care este descris i apelat o procedur din acelai segment de n as a a s cod. Apelati la Turbo Debugger pentru a intra detalii referitoare la modul de n asamblare a instructiunilor implicate apelul i revenirea din procedur. n s a III. Studiati continutul ierului M EDIE.ASM . Codul surs descrie un program care s a nsumeaz valorile dintr-un vector de date de tip word i ulterior determin valoarea medie a a s a elementelor. - Studiati modul care s-a parametrizat denirea datelor. Modicati programul n pentru a nsuma un numr dublu de date. C linii de cod trebuie modicate? a te - Studiati instructiunile de artire (div). mp - Plec de la codul considerat, scrieti o procedur care primete ca parametrii un nd a s pointer la un vector de date i dimensiunea acestuia i s s ntoarce ntr-un registru suma elementelor vectorului de date. Scrieti un program care apeleaz procedura de dou a a ori, cu parametrii diferiti.

Lucrarea 9 Programarea cu ntreruperi software


Un sistem de calcul cu microprocesor, aa cum este prezentat gura 1, nu poate imaginat s n fr dispozitive periferice de intrare/ieire. De obicei, aceste periferice s foarte lente fat de aa s nt a microprocesor i s (mai mult sau mai putin) controlate de acesta. Microprocesorul poate s nt trata perifericele dou moduri, ecare cu avantaje i dezavantaje. n a s Tratarea perifericelor prin polling (prin program) presupune suspendarea rulrii proa gramului curent de ctre microprocesor i interogarea perifericelor. Avantajul const a s a faptul c programatorul controleaz precis momentele c programul principal poate n a a nd suspendat. Dezavantajul const faptul c un periferic grbit (de exemplu o plac a n a a a de achizitie de date) nu si poate permite s atepte un timp nedenit pentru a servit. a s plus, interogarea perifericelor se face, i consum timp, chiar dac nici un periferic nu In s a a are nimic de comunicat. Tratarea perifericelor prin ntreruperi presupune existenta unui semnal hardware exte rior microprocesorului prin activarea cruia perifericele cer s e deservite de ctre acesta. a a a La activarea semnalului de ntrerupere, microprocesorul si suspend executia programu a lui curent, depisteaz perifericul care a lansat cererea de a ntrerupere i lanseaz procedura s a specic de tratare a acestuia. a Aceast lucrare prezint sistemul de a a ntreruperi al microprocesorului 8086 i apelarea din limbaj s de asamblare a functiilor BIOS i DOS, prin s ntreruperi software.

9.1

Sistemul de ntreruperi

De obicei, setul de instructiuni al microprocesorului contine instructiuni pentru dezactivarea (mascarea) ntreruperilor. Acestea s folosite cazul care microprocesorul urmeaz s nt n n a a execute o portiune critic de program, ce nu trebuie perturbat de evenimente externe. Pentru a a cazuri deosebite, CPU are un pin dedicat pentru primirea ntreruperilor nemascabile. Microprocesoarele familiei 8086 recunosc 256 de ntreruperi. Exist posibilitatea apelrii acesa a tor ntreruperi i prin program, utiliz instructiuni specice. Aceste s nd ntreruperi s denumite nt ntreruperi software pentru a deosebite de ntreruperile hardware ce s determinate de actint varea unui semnal provenit din exteriorul microprocesorului. Intreruperile software s tratate nt la fel ca i cele hardware cu deosebirea c acestea nu pot mascate. Intreruperile software s a 117

118

LUCRAREA 9. PROGRAMAREA CU INTRERUPERI SOFTWARE

s sincrone cu ceasul sistem i au loc la momente de timp predictibile, specicate prin pront s gram. Intreruperile hardware s general asincrone i inpredictibile timp. Instructiunea nt n s n de ntrerupere software la microprocesorul 8086 are sintaxa: INT <numr ntrerupere> a Pe baza <numrului ntreruperii> ( a ntre 0 i 255), microprocesorul determin adresa procedurii s a de tratare a ntreruperii.

9.1.1

Intreruperi externe

Microprocesorul 8086 are doi pini dedicati pentru primirea ntreruperilor din exterior: INTR i s NMI. Pinul INTR (INTerrupt Request) este comandat de un controler programabil de ntreruperi (8259A) care, la r ndul su, este conectat la perifericele care pot lansa a ntreruperi. Circuitul 8259A este comandat de microprocesor prin software, ind vzut de acesta ca un set de porturi a I/O. Sarcina controlerului de ntreruperi este de a primi i ierarhiza s ntreruperile de la periferice i de a activa pinul INTR. s CPU veric starea pinului INTR la terminarea ecrei instructiuni. a a Intreruperea este ignorat dac indicatorul IF (Interrupt-enable Flag) este resetat. Starea indicatorului IF poate a a controlat prin program cu instructiunile CLI (Clear IF) i STI (SeT IF). CPU semnalizeaz aca s a ceptarea ntreruperi prin executarea a doi cicli de conrmare a ntreruperii (INTA - INTerrupt Acknowledge). Primul ciclu INTA semnalizeaz controlerului de a ntreruperi c a ntreruperea al doilea ciclu INTA, controlerul de a fost acceptat. In a ntreruperi rspunde prin plasarea a pe bus-ul de date a numrului a ntreruperii asociat cu dispozitivul care a lansat ntreruperea. Asocierea ntre periferic i numrul de s a ntrerupere este fcut prin software, la initializarea cona a trolerului de ntreruperi. CPU citete numrul s a ntreruperii i utilizeaz pentru a determina s l a adresa procedurii de tratare a ntreruperii. O ntrerupere extern poate sosi i pe pinul denumit NMI (Non-Maskable Interrupt). a s Intreruperile venite pe aceast linie nu pot mascate i s prioritare fat de a s nt a ntreruperile venite pe pinul INTR. Intreruperile nemascabile s predenit asociate cu numrul 2. Din acest motiv, nt a nu mai este necesar ca CPU s execute ciclii INTA i poate apela imediat procedura de tratare a s a ntreruperii nemascabile.

9.1.2

Intreruperi software

Executia instructiunilor INT (INTerrupt) genereaz imediat o a ntrerupere. Numrul a ntreruperii este inclus codul instructiunii i permite CPU determinarea imediat a adresei procedurii n s a de tratare a ntreruperii. Prin utilizarea ntreruperilor software se poate testa procedura de tratare a ntreruperii provenite de la un dispozitiv extern. Intreruperea cu numrul 0 (Divide error) este generat de CPU c a a nd, dup o instructiune de a artire, c are dimensiune mai mare dec locatia specicat ca destinatie. mp tul t a Intreruperea cu numrul 1 (Single Step) este generat de CPU c indicatorul TF (Trap Flag) a a nd acest caz, microprocesorul intr modul de lucru de depanare (pas cu pas). este setat. In a n Dac indicatorul OF (Overow Flag) este setat, la terminarea executiei unei instructiuni INTO a (INTerrupt on Overow) se genereaz o a ntrerupere cu numrul 4. a

9.1. SISTEMUL DE INTRERUPERI

119

Toate ntreruperile interne (INT n, INTO, eroare la artire, pas cu pas) au urmtoarele mp a caracterisitici: numrul a ntreruperii este e inclus instructiune, e predenit; n nu se execut ciclii INTA; a nu pot mascate, cu exceptia ntreruperii de lucru pas cu pas; cu exceptia ntreruperii de lucru pas cu pas, s prioritare fat de orice nt a ntrerupere extern. a

9.1.3

Tabela vectorilor de ntrerupere

Tabela vectorilor de ntrerupere reprezint legtura dintre numrul a a a ntreruperii i procedura de s tratare a ntreruperii. Tabela vectorilor de ntrerupere ocup primul 1 KB din memoria sistem. a Fiecare din cele 256 de ntreruperi are c o intrare aceast tabel. Fiecare intrare tabel te n a a n a contine un dublu cuv (4 baiti). Cei mai semnicativi doi baiti contin adresa de baz a nt a segmentului care se gsete procedura de tratare a n a s ntreruperii. Cei mai putin semnicativi doi baiti contin oset-ul procedurii de tratare a ntreruperii. CPU calculeaz adresa intrrii a a n tabel prin nmultirea numrului a ntreruperii cu 4. Figura 9.1 prezint structura tabelei vectorilor de a ntrerupere.

9.1.4

Actiuni executate dup acceptarea unei a ntreruperi

Dup acceptarea unei a ntreruperi i determinarea numrului s a ntreruperii, CPU execut c a teva actiuni specice, enumerate continuare: n Plaseaz stiv registrul de indicatori; a n a Execut actiuni similare unei instructiuni CALL intersegment indirect. Adresa procedurii a este continut de elementul aat la adresa (numrul a a ntreruperii 4), tabela vectorilor n de ntrerupere; Plaseaz stiv registrele CS i IP pentru a se putea continua programul abandonat; a n a s Reseteaz indicatorii TF i IF; a s Inlocuiete registrele CS i IP cu al doilea i primul cuv din elementul selectat din s s s nt tabela vectorilor de ntrerupere. Dup executarea acestor actiuni, se d controlul procedurii de tratare a a a ntreruperii. cadrul In acesteia, ntreruperile externe pot din nou permise dac se seteaz IF cu instructiunea STI. a a Sarcina salvrii i restaurrii registrelor folosite procedur revine programatorului. a s a n a Procedura trebuie s se a ncheie cu instructiunea IRET (Interrupt RETurn). Ca efect, se restau reaz din stiv registrele IP, CS i de indicatori, controlul revenind programul a a s n ntrerupt.

120

LUCRAREA 9. PROGRAMAREA CU INTRERUPERI SOFTWARE


......

3FFH 3FCH
... ........... . .......

Tip 255 (Disponibil) a


... ........... . .......

Intreruperi disponibile (224)

.. ..... ..... .... . .

084H
...... ......

080H 07FH
.... ........... ........

Tip 33 (Disponibil) a Tip 31 (Disponibil) a Tip 31 (Rezervat) a


.... ........... ........

Intreruperi rezervate (27)

. . ... ... ... ... .

...... . ... ...

014H 010H

Intreruperi dedicate (5)

00CH
. . .... ..... .... . .

004H
......

000H


Tip 5 (Rezervat) a Tip 4 OVERFLOW Tip 3 1-BYTE INSTR. Tip 2 NON-MASKABLE Tip 1 SINGLE-STEP Tip 0 DIVIDE ERROR 16 biti
-

Adres de baz CS a a Oset IP

Figura 9.1: Structura tabelei vectorilor de ntrerupere.

9.2

Functii DOS

Sistemul de operare DOS (Disk Operating System) pune la dispozitia aplicatiilor un set de rutine (functii) pentru gestionarea resurselor sistemului. Utilizarea acestor rutine uureaz munca s a programatorului permitindu-i o viziune de nivel nalt asupra aplicatiei dezvoltate. Mecanismul prin care o aplicatie poate utiliza un servicu pus la dispozitie de sistemul de operare este cel al ntreruperilor software. Functiile DOS pot apelate prin INT 21H at din limbaj de asamblare c i din limbaje de nivel t t s nalt, aa cum este C. Pentru apelul functiilor DOS este rezervat s a ntreruperea 21H. Numrul a functiei DOS apelate este transmis ca parametru registrul AH. Parametrii de intrare i ieire n s s ai functiilor DOS s transmii prin registre. nt s Pentru a apela o functie DOS, programul trebuie s realizeze urmtoarele actiuni: a a ncarc registrele corespunztoare functiei parametrii de intrare; a n a ncarc registrul AL codul subfunctiei (dac este necesar); a n a ncarc registrul AH codul functiei; a n

9.2. FUNCTII DOS lanseaz instructiunea INT 21H. a

121

La terminarea procedurii, programul trebuie s preia eventualii parametrii de ieire din registrele a s corespunztoare functiei. a Lista principalelor functii DOS este prezentat tabelul 9.1 a n Functie DOS 01H 02H 08H 09H 25H 2AH 2BH 2CH 2DH 31H 35H 39H 3AH 3BH 3CH 3DH 3EH 3FH 40H 41H 43H 4BH 4CH 4DH 56H 57H 62H Denumire Character input with echo Output character Character input without echo Output character string Set interrupt vector Get system date Set system date Get system time Set system time Terminate and stay resident Get interrupt vector Create subdirectory (MKDIR) Remove directory entry (RMDIR) Set directory (CHDIR) Create le (CREAT) Open le (OPEN) Close le (CLOSE) Read le (READ) Write le (WRITE) Delete le (UNLINK) Get/set le attributes Load or execute program (EXEC) Process terminate (EXIT) Get return code of a subprocess Rename le Get/set le date and time Get program segment prex (PSP) address Tabelul 9.1: Functii DOS.

9.2.1

Exemplul 1: Preluare caracter de la tastatur, cu ecou/scriere a caracter pe ecran

Acest exemplu prezint un program limbaj de asamblare care citete de la tastatur un a n s a numr de dou cifre, cu ecou. Cele dou cifre s interpretate ca ind un numr reprezentat a a a nt a baza 10. Pe o linie nou, se va aa restul artirii cu 9 a numrului introdus. n a s mp a Pseudocodul algoritmului implementat de program este urmtorul: a - preia primul caracter, cu ecou, prin utilizarea functiei DOS 01H (character input with echo);

122

LUCRAREA 9. PROGRAMAREA CU INTRERUPERI SOFTWARE

- convertete primul caracter la valoarea numeric prin scderea codului ASCII al caracterului s a a 0; - preia al doilea caracter, cu ecou; - convertete al doilea caracter la valoarea numeric; s a - compune numrul introdus (prima cifr 10 + a doua cifr); a a a - mparte numrul la 9 i pstreaz restul; a s a a - convertete numrul la codul ASCII al caracterului corespunztor prin adunarea codului s a a ASCII al caracterului 0; - pozitioneaz cursorul la a nceputul liniei urmtoare; a - aeaz caracterul prin utilizarea functiei DOS 02H (character output); s a - termin programul prin utilizarea functiei DOS 4CH (process terminate). a Programul face apel la trei functii DOS: Functie DOS 01H (character input with echo) Registre la intrare: AH: 1 Registre la ieire: s AL: caracter Descriere: Ateapt introducerea unui caracter de la tastatur. momentul introducerii s a a In unui caracter, codul ASCII asociat acestuia este returnat registrul AL iar simbolul n caracterului este aat pe ecran la pozitia curent a cursorului. Dac tastatura genereaz s a a a un cod ASCII extins (cazul apsrii une taste functionale sau taste de control), atunci aa functia returneaz 0 registrul AL. Invocarea ulterioar a functiei returneaz codul tastei a n a a (scan code) fr a mai atepta apsarea unei taste. aa s a Functie DOS 02H (character output) Registre la intrare: AH: 2 DL: cod ASCII de caracter Registre la ieire: s nemodicate Descriere: Continutul registrului DL este trimis spre dispozitivul standard de ieire s (ecran). Simbolul asociat codului ASCII al caracterului este aat la pozitia curent s a a cursorului. Functie DOS 4CH (process terminate) Registre la intrare: AH: 4CH AL: cod returnat Registre la ieire: s nemodicate Descriere: Termin programul care a apelat functia i a s ntoarce controlul programului printe (care a apelat programul) sau sistemului de operare. Codul returnat poate a determinat de programul printe prin apelul functiei DOS 4DH. Dac programul a fost a a lansat din DOS, codul de retur este disponibil prin intermediul variabilei ERRORLEVEL, iere de tip .BAT . n s

9.2. FUNCTII DOS Codul surs al programului ce rezolv problema enuntat este prezentat continuare. a a a n

123

code segment assume cs:code, ds:code CR equ 0AH LF equ 0DH start: mov ax, code mov ds, ax mov bh, 0 mov ah, 1 int 21h sub mov mul mov al, 0 cl, 10 cl bl, al

; suprapune segmentul de date peste cel de cod

; citire tastatur prin serviciu DOS 01H a

; prima cifr n AL a ^ ; AL <- AL * 10 ; prima cifr n BL nmultit cu 10 a ^ ^ a ; citire a doua cifr prin apel DOS a

mov ah, 1 int 21h sub al, 0 add al, bl mov cl, 9 mov ah, 0 div cl mov bl, ah add bl, 0 call afisare mov ax, 4C00h int 21h afisare PROC mov dl, CR mov ah, 2 int 21h mov dl, LF int 21h mov dl, bl int 21h ret afisare ENDP code ENDS END start

; restul este n BL ^ ; afiare sir de caractere s ; terminare program (apel functie DOS 4CH)

; afiare sir de caractere prin ntrerupere s ^

124

LUCRAREA 9. PROGRAMAREA CU INTRERUPERI SOFTWARE

9.2.2

Exemplul 2: Citire caracter fr ecou a a

Acest exemplu prezint un program care primete de la tastatur un ir de cuvinte pe care le a s a s aeaz pe ecran. Toate cuvintele vor avea initiala majuscul, indiferent de modul care a s a a n fost tastat (majuscul sau minuscul). Terminarea programului se va face la apsarea tastei a a a a ESC. Programul necesit prelucrarea ecrui caracter primit de la tastatur a a a nainte de a aat s pe ecran. Solutia const preluarea caracterului cu functia DOS 8 (character input without a n echo), analizarea i eventuala prelucrare a acestuia i, ulterior, aarea caracterului cu functia s s s DOS 2 (character output). Codul surs al programului ce rezolv problema enuntat este prezentat continuare. a a a n code SEGMENT assume cs:code, ds:code tasta_ESC equ 27 start: mov mov mov

ax, cs ds, ax bl, 1

; indicator: BL=1 - convertete caracterul n majuscul s ^ a ; BL=0 - las caracterul neschimbat a

caracter_in: mov ah, 8 int 21h cmp jz cmp jz cmp jz mov cmp jl cmp jg sub jmp al, tasta_ESC final al, schimb_maj bl, 0 scrie_al bl, 0 al, a scrie_al al, z scrie_al al, 20H scrie_al

; apel functie DOS 8 (character input without echo) ; returneaz n AL codul tastei apsate a ^ a ; s-a tastat ESC

; s-a tastat (spatiu=delimitator de cuvinte) ; urmtorul caracter este transformat n majuscul a ^ a ; ; caracterul se las neschimbat a ; este o initial... a ; cu cod ASCII mai mic dec^t a... ; sau mai mare dec^t z (^n afara domeniului ; minusculelor) ; transform minuscula n majuscul a ^ a

schimb_maj: mov bl, 1 scrie_al: ; afieaz caracterul s a

9.2. FUNCTII DOS mov mov int jmp ah, 2 dl, al 21h caracter_in

125

final: mov ah, 4ch int 21h code ends end start

9.2.3

Exemplul 3: Preluare dat sistem a

Acest exemplu prezint un program care aeaz pe ecran data sistemului sub forma: a s a <AA> <Luna> unde: <AA> este anul (ultimele dou cifre); a <Luna> este denumirea lunii limba romn. n a a Codul surs al programului ce rezolv problema enuntat este prezentat continuare. a a a n code SEGMENT assume cs:code, ds:code Denumire_luna db Ianuarie$ Februarie$ Martie$ Aprilie$ db Mai$ Iunie$ Iulie$ August$ db Septembrie$Octombrie$ Noiembrie$ Decembrie$ start: mov ax, cs mov ds, ax mov int sub mov mov mov div mov mov add mov int mov add ah, 2Ah 21h cx, ah, al, bl, bl bx, dl, dl, ah, 21h 1900 0 cl 10 ; preia data sistem, functie DOS 2AH ; preluare parametrii, prelucrare si afiare s ; CX=anul (parametru de ieire din functia DOS 2AH) s

; (AH:AX) / BL => AL=c^t, AH = rest ; AL=cifra zecilor, AH=cifra unitilor (AN) at ax bl 0 2 ; scrie cifra zecilor din reprezentarea anului

dl, bh dl, 0

126 mov int mov mov int ah, 2 21h dl, ah, 2 21h

LUCRAREA 9. PROGRAMAREA CU INTRERUPERI SOFTWARE ; scrie cifra unitilor din reprezentarea anului at

; scrie ; DH=luna (parametru de ieire din functia DOS 2AH) s

dec mov mul mov add

; DH=index n tabelul Denumire_luna ^ ; numrul de baiti alocati n tabelul Denumire_luna a ^ ; pentru o intrare (o denumire de lun) a dh ; AL x DH = (AH:AL), index sir dx, offset Denumire_luna dx, ax ; DX=pointer la denumirea lunii curente, sir terminat ; cu $ ; afieaz sir cu functia DOS 9 s a

dh al, 11

mov ah, 9 int 21h mov ah, 4ch int 21h code ends end start

Programul face apel la dou functii DOS: a Functie DOS 2AH (get system date) Registre la intrare: AH: 2AH Registre la ieire: s AL: ziua din sptm a a a n CX: anul DH: luna DL: ziua Descriere: Se returneaz ziua (DL), luna (DH) i anul (CX) datei sistem. registrul AL a s In se returneaz codul zilei din sptm a: 0 = duminic, 1 = luni, 2 = marti, etc. a a a n a Functie DOS 9 (output character string) Registre la intrare: AH: 9 DX: oset adres ir as DS: segment adres ir as Registre la ieire: s nemodicate Descriere: Se aeaz pe ecran irul de caractere care s a s ncepe la adresa DS:DX. Terminatorul de ir, care nu se aeaz, este caracterul $ (cod ASCII 36, 24H). Prin aceast s s a a functie nu se poate aa caracterul $. s

9.3. FUNCTII BIOS Intrerupere Categorie Servicii video 10H Servicii tastatur a 16H Servicii disk 13H Servicii imprimant a 17H Servicii port comunicatii 14H Servicii dat/timp a 1AH Servicii unitate de band a 15H Servicii sistem 11H, 12H, 19H Tabelul 9.2: Categorii de servicii BIOS.

127

Denumirea limba romn a lunilor anului a fost specicat sub forma unei denitii de date n a a a de tip byte. Sirul a fost conceput astfel t s se aloce ecrei luni acelai numr de caractere nc a a s a (11). Adresa care trebuie transmis ca parametru functiei DOS 9 este calculat dup formula: a a a a Denumire luna + 11 (luna curent - 1). Functia DOS 2AH (get system date) se apeleaz chiar la a nceputul programului. Restul programului se ocup cu prelucrarea i aarea parametrilor returnati de aceast functie. Anul este a s s a preluat registrul CX i este prelucrat pentru a se obtine cele dou caractere asociate cifrelor n s a zecilor i unitilor. Apoi este aat un caracter spatiu. Pe baza numrului lunii, returnat s at s a registrul DH, se calculeaz adresa care trebuie transmis functiei DOS 9 (output character n a a string).

9.3

Functii BIOS

BIOS (Basic Input/Output System) este cel mai de jos nivel de software care interactioneaz cu a structura hardware a calculatorului. BIOS reprezint un set de proceduri continute memoria a n ROM a sistemului. Functiile BIOS s disponibile pentru a apelate din programe, indiferent nt de sistemul de operare. Categoriile de servicii BIOS i numerele s ntreruperilor asociate s prezentate tabelul 9.2. nt n Lista principalelor functii BIOS este prezentat tabelul 9.3. a n

9.3.1

Exemplul 4: Servicii video BIOS

Acest exemplu prezint un program limbaj de asamblare care citete de la tastatur cinci a n s a cifre cu ecou. Ulterior, programul aeaz cu intermitent pe cea mai mic. Dac cifra minim s a a a a a apare de mai multe ori, se va aa cu intermitent prima aparitie (cea mai din st s a nga). Pseudocodul algoritmului implementat de program este urmtorul: a - citete (BIOS 10h, serviciul 3) i memoreaz (pe stiv) pozitia cursorului la s s a a nceputul programului; - pregtete registre pentru codul ASCII (DL) i coloana caracterului (DH) minim; a s s - citete c un caracter (DOS 1) i, dac este necesar, actualizeaz minimul; s te s a a - determin i plaseaz cursorul (BIOS 10h, serviciul 2) pe pozitia caracterului minim; as a

128

LUCRAREA 9. PROGRAMAREA CU INTRERUPERI SOFTWARE

Serviciu BIOS - Intrerupere Servicii video - INT 10H

Servicii

Servicii

Servicii

Servicii

Servicii

Servicii Servicii

Functie 00H 01H 02H 03H 06H 07H 08H 09H 0CH 0DH 0EH 0FH 13H tastatur - INT 16H a 00H 01H 02H disk - INT 13H 01H 02H 03H 04H 08H imprimant - INT 17H a 00H 01H 02H port comunicatii - INT 14H 00H 01H 02H 03H dat/timp - INT 1AH a 00H 01H 06H 07H 09H sistem - INT 12H sistem - INT 19H

Denumire Set video mode Set cursor size Set cursor position Read cursor position Scroll window up Scroll window down Read character and attribute Write character and attribute Write pixel dot Read pixel dot TTY character output Get current video state Write string Read keyboard character Read keyboard status Read keyboard shift status Get oppy disk status Read disk sectors Write disk sectors Verify disk sectors Return drive parameters Print character Initialize printer Get printer status Initialize communication port Transmit character Receive character Get communication port status Get clock counter Set clock counter Set alarm Disable alarm Read alarm Get memory size Warm boot

Tabelul 9.3: Functii BIOS.

9.3. FUNCTII BIOS - aeaz caracterul minim pe pozitia cursorului, cu intermitent (BIOS 10h, serviciul 9). s a a Programul face apel la trei functii BIOS din categoria video (INT 10h): Serviciul 3 (read cursor position and size) Registre la intrare: AH: 3 BH: numr pagin video a a Registre la ieire: s BH: numr pagin video a a CH: nceput linie cursor CL: sf sit linie cursor r DH: r cursor nd DL: coloan cursor a Descriere: Returneaz caracteristicile cursorului, functie de modul grac curent. a n Serviciul 2 (set cursor position) Registre la intrare: AH: 2 BH: numr pagin video a a DH: r cursor nd DL: coloan cursor a Registre la ieire: s nemodicate

129

Descriere: Pozitioneaz cursorul pe ecran pe r a ndul i coloana transmise prin DH i DL. s s Serviciul 9 (write character and attribute) Registre la intrare: AH: 9 AL: cod ASCII caracter BH: numr pagin video a a BL: atribut video al caracterului din AL CX: numr de caractere aate a s Registre la ieire: s nemodicate Descriere: Aeaz unul sau mai multe caractere pe ecran. Atributul de culoare este s a transmis prin BL iar numrul de caractere prin CX. Pozitia cursorului nu se modic a a nici dac se aeaz mai mult de un caracter. Semnicatia bitilor registrului BL este a s a prezentat gura 9.2. a n 7 i 6 5 4 3 2 1 0

culoare fond

culoare caracter

Figura 9.2: Semnicatia bitilor registrului de atribut video BL.

130

LUCRAREA 9. PROGRAMAREA CU INTRERUPERI SOFTWARE Tabelul 9.4 prezint codicarea culorilor caracterelor. Culoarea de fond este reprezentat a a numai pe 3 biti. consecint, s posibile numai primele 8 culori (culorile In a nt nchise). Dac a bitul 7 (MSB) al registrului BL este 1, aarea caracterului se va face cu intermitent. s a Cod 00H 01H 02H 03H 04H 05H 06H 07H Culoare negru albastru verde cyan rou s magenta maro alb Cod 08H 09H 0aH 0bH 0cH 0dH 0eH 0fH Culoare gri albastru intens verde intens cyan intens rou intens s magenta intens galben alb intens

Tabelul 9.4: Codicarea culorilor caracterelor. Codul surs al programului ce rezolv problema enuntat este prezentat continuare. a a a n code SEGMENT assume cs:code, ds:code start: mov ax, cs mov ds, ax mov mov int ah, 3 bh, 0 10h

; citete pozitia si dimensiunea cursorului s ; (functie BIOS 10h, serviciu 3) ; ; ; ; ; ; pozitie cursor la intrare n program ^ DH - r^nd, DL - coloan a contor numr de caractere citite a caracterul cel mai mare posibil DL va contine codul ASCII al caracterul minim DH va contine coloana caracterului minim

push dx mov mov mov cx, 5 dl, 9 ah, 1

caracter_in: int 21h cmp dl, al jg schimb intorc: dec cx jnz caracter_in jmp afisare

; DOS 1 (citete caracter n AL) s ^ ; DL>AL implic nlocuire caracter minim din DL a ^

; actualizeaz contor caractere a ; au intrat 5 caractere, se afiez minimul s a

9.4. EXPERIMENTE schimb: mov dl, al mov dh, 5 sub dh, cl jmp intorc afisare: ; DL contine codul ASCII al caracterului minim ; DH contine coloana caracterului minim

131

; pregtete parametrii de intrare pentru ntrerupere BIOS 10h, serviciu 2 a s ^ ; (set cursor position) pop cx ; CX <= pozitie cursor la intrare n program ^ push dx ; pune n stiv DL, DH ^ a push cx ; repune n stiv pozitia initial a cursorului ^ a a mov ah, 2 ; numr serviciu BIOS video a mov bh, 0 ; numr pagin video a a xor cx, cx ; CX=(CH:CL) <= 0 mov cl, dh ; CL <= coloana caracterului minim pop dx ; DX <= pozitie cursor la intrare n program ^ add dx, cx ; DH=r^nd si DL=coloan caracter minim a int 10h ; apelul ntreruperii software ^ ; pregtete parametrii de intrare pentru ntrerupere BIOS 10h, serviciu 9 a s ^ ; (write character and attribute) mov ah, 9 ; numr serviciu BIOS video a pop dx mov al, dl ; cod ASCII caracter mov bh, 0 ; numr pagin video a a mov bl, 128+7 ; atributul caracterului (alb pe fond negru, cu intermitenta) mov cx, 1 ; numrul de caractere a int 10h ; apelul ntreruperii software ^ mov ah, 4ch int 21h code ends end start

9.4

Experimente

I. Studiati programul CICLU A.ASM. Programul terge ecranul (BIOS video, int 10h, ser s viciul 6), i citete ciclic un caracter de la tastatur prin functii BIOS, int 16h, serviciul s s a cazul care se apas tasta A (caracter A sau a), programul aeaz un mesaj 0. In n a s a centrul ecranului. n II. Rezolvarea propus de exemplul 3 nu este compatibil cu anul 2000. Modicati proa a gramul astfel t s realizati compatibilitatea. Estimati costul operatiei consider nc a nd urmtoarele metrici: a

132 -

LUCRAREA 9. PROGRAMAREA CU INTRERUPERI SOFTWARE numr de linii de cod modicate; a numr de iteratii (asamblare, link-editare, depanare) necesare; a numr de variante testate prin simulare; a timp de executie.

Consider costul manoperei i al amortizrii calculatorului folosit, estimati costul pe nd s a care ar trebui s-l plteasc beneciarul. a a a III. Folosind bibliograa i programul de documentare hipertext T ECHhelp, studiati parametrii s de intrare, parametrii de ieire i actiunile functiilor DOS specicate tabelul 9.1 i a s s n s functiilor BIOS specicate tabelul 9.3. n

Lucrarea 10 Notiuni avansate de programare n limbaj de asamblare


Aceast lucrare prezint modul de utilizare a limbajului de asamblare sistem de operare DOS a a n pentru: Accesarea ierelor prin functii DOS; s Scrierea programelor rezidente.

10.1

Accesarea ierelor din limbaj de asamblare s

Dei limbajele de nivel s nalt pun la dispozitia programatorului un set larg de functii pentru accesarea ierelor, uneori este nevoie de a accesa iere direct din limbaj de asamblare. Pentru s s aceasta, sistemul de operare DOS furnizeaz functii sistem dedicate, apelabile prin a ntreruperi software.

10.1.1

Formate de iere executabile s

DOS este un sistem de operare capabil s a ncarce memorie i s execute dou tipuri de iere n s a a s program, av extensiile .COM i .EXE. Ambele tipuri de programe s relocatabile (pot nd s nt arcate la orice adres zic). Acest lucru este asigurat prin mecanismul de segmentare a nc a a memoriei i prin faptul c toate salturile program s realizate cu instructiuni de salt relativ. s a n nt Fiierul formatul COM contine o imagine binar a codului i datelor programului. Se s n a s poate considera c programele COM s scrise a nt ntr-un model de memorie tiny, conform tabelului 8.2. Codul, datele i stiva s mpreun nu pot avea o dimensiune mai mare de un a segment (64 KB). Fiierul formatul EXE contine, plus fat de ierul format COM , un antet care s n n a s n informeaz sistemul de operare despre modul de gestiune a segmentelor. a Inainte de a arca un program memorie, DOS selecteaz o adres de segment la care va nc n a a arca programul. Ca adres de baz, DOS alege totdeauna cea mai mic adres de memorie nc a a a a 133

134LUCRAREA 10. NOTIUNI AVANSATE DE PROGRAMARE LIMBAJ DE ASAMBLARE IN liber. Indiferent de formatul ierului (COM sau EXE), la a s nceputul zonei de memorie rezervate pentru program se ncarc un prex de 256 de baiti numit P SP (Program Segment a Prex). PSP contine informatii pe care sistemul de operare le pune la dispozitia programului. Structura PSP-ului este prezentat tabelul 10.1. a n Dup ce controlul este predat programului arcat memorie, registrele DS i ES contin a nc n s adresa PSP. Informatia din PSP poate utilizat cadrul programului pentru a prelua argu a n mentele din linia de comand, pentru a determina c a memorie este disponibil programului a t a sau a pentru a accesa variabilele de sistem. Adresa PSP poate accesat ulterior prin functiile a DOS 62H (query current PSP). Oset 0 2 4 5 0AH 0EH 12H 16H 2CH 2EH 5CH 6CH 80H 81H Dimensiune 2 2 1 5 4 4 4 22 2 46 16 20 1 127 Semnicatie Codul instructiunii INT 20H (CD 20). Printr-o instructiune de salt la aceast adres se poate termina programul. a a Adresa de sf sit a memoriei alocate programului, exprimat r a blocuri de 16 baiti. n Rezervat. Codul instructiunii de apel de procedur de tip FAR spre a punctul de intrare al functiilor DOS. Adres de revenire sistemul de operare la executia a n instructiunilor INT 22H sau INT 21H functia 4CH. Adres de tratare a a ntreruperii INT 23H (Ctrl-Break). Adres de tratare a a ntreruperii INT 24H (erori critice DOS). Rezervat. Adres de segment a variabilelor DOS. a Rezervat. FCB pentru primul parametru. FCB pentru al doilea parametru. Numrul de baiti din linia de comand (fr numele a a aa programului). Linia de comand a programului (fr numele programului i a aa s fr directive de redirectare). aa Tabelul 10.1: Structura PSP. Imediat dup arcarea unui program EXE memorie: a nc n - registrele DS i ES contin adresa PSP; s - registrele CS, IP , SS i SP contin valorile indicate antetul ierului EXE; s n s - c mpul al doilea din PSP (adresa sf sitului memoriei disponibile) contine valoarea din r antetul ierului EXE. s Imediat dup arcarea unui program COM memorie: a nc n - registrele CS, DS, ES i SS contin adresa PSP; s - registrul SS contine adresa de sf sit a segmentului (de obicei 0FFFEH); r

10.1. ACCESAREA FISIERELOR DIN LIMBAJ DE ASAMBLARE - registrul IP este initializat cu valoarea 0100H. Utilizarea formatului COM presupune respectarea urmtoarelor constr a ngeri: Programul trebuie s e format dintr-un singur segment; a

135

Codul surs trebuie s a a nceap cu o pseudoinstructiune ORG 100H. Programul trebuie s a a nceap cu o instructiune executabil a crei etichet trebuie s apar pseudoinstruca a a a a a n iunea END, care t ncheie zic textul programului surs. Aceast instructiune este plasat a a a la adresa 100H i poate o instructiune de salt la adresa la care s ncepe efectiv programul; Datele pot plasate oriunde codul surs dar este de preferat s se plaseze la n a a nceputul acestuia deoarece asamblorul poate semnala o eroare cazul unor referinte la date n nedeclarate a; nc Nu este necesar initializarea registrelor segment, toate av aceeai valoare ca i registrul a nd s s CS; Stiva este initializat automat la sf situl segmentului (SS = CS iar SP = 0FFFE0H); a r Incheierea executiei programului se face prin executia secventei de instructiuni: mov ax, 4c00H int 21H Formatul unui ier surs limbaj de asamblare pentru generarea unui ier executabil s a n s n format COM este prezentat continuare. Pentru a genera acest format de ier executabil, n s link-editorul trebuie lansat cu optiunea /t. code SEGMENT assume cs:code, ds:code org 100H start: jmp inceput ; ; Definitii de date ; data1 db a1 dw Sir de caractere 10 ; exemple

; ; Codul programului ; start: ... ...

; instructiuni n limbaj de asamblare ^

136LUCRAREA 10. NOTIUNI AVANSATE DE PROGRAMARE LIMBAJ DE ASAMBLARE IN ; ; Sf^rit executie program s ; mov int code ax, 4c00H 21H ENDS

end start

10.1.2

Functii DOS pentru lucru cu iere s

Incep cu versiunea 2.0, sistemul de operare DOS pune la dispozitia programelor utilizatorului nd c teva functii apelabile prin ntreruperea software 21H, similare cu functiile UNIX. Prin aceste functii se pot realiza at operatii elementare asupra ierelor (citire, scriere) c i gestionarea t s t s acestora (creare, deschidere, nchidere, tergere). s Un ier pe disc este identicat pe baza numelui su i a directorului care se a. Numele s a s n a ierului este transmis ca parametru functiilor DOS sub forma unui pointer la un ir de caractere s s aate memorie. cadrul unui program, un ier este identicat pe baza unui identicator de n In s ier (le handle, limba englez). Identicatorul ierului este un numr de 16 biti returnat s n a s a de functiile de creare sau deschidere de iere. Operatiile ulterioare de accesare a ierului s s (cutare, citire, scriere) se fac pe baza identicatorului de ier. Functiile DOS returneaz a s a identicatorul unui ier registrul de 16 biti BX. s n Exist civa identicatori rezervati de ctre sistemul de operare DOS pentru anumite dispozia t a tive din calculator. acest fel, aceste dispozitive pot accesate cu aceleai functii ca i ierele. In s s s Tabelul 10.2 prezint identicatorii rezervati pentru dispozitivele standard dintr-un calculator a PC. Identicatorii standard s automat initializati la nt nceputul programului.

Identicator 0000H 0001H 0002H 0003H 0004H

Descriere Dispozitiv standard de intrare (tastatur) a Dispozitiv standard de ieire (monitor) s Dispozitiv standard pentru aarea erorilor (monitor) s Dispozitiv standard auxiliar (COM1) Imprimant standard (LPT1) a

Tabelul 10.2: Identicatorii rezervati pentru dispozitivele standard dintr-un calculator PC.

Tabelul 10.3 prezint functiile DOS din categoria serviciilor de disc. Toate functiile returneaz a a registrul AX un cod de eroare asociat operatiei realizate de functie. n

10.1. ACCESAREA FISIERELOR DIN LIMBAJ DE ASAMBLARE Functie DOS Denumire functie 3CH Creare ier s 3DH Deschidere ier s Inchidere ier s 3EH 3FH Citire din ier s 40H Scriere ier n s 41H Stergere ier s 5BH Creare ier s 44H Controlul dispozitivului I/O Tabelul 10.3: Functii DOS din categoria serviciilor de disc.

137

10.1.3

Exemplul 1: Program limbaj de asamblare pentru copierea n unui ier s

Acest exemplu prezint un program pentru copierea unui ier sub un alt nume. Dac exist a s a a deja un ier cu numele celui de destinatie, copierea se abandoneaz i se returneaz un mesaj s as a de atentionare. Pseudocodul programului este prezentat continuare. n - Identic argumentele liniei de comand, aate PSP la oset 81h; a a n irul de argumente, caut delimitatorii (caractere spatiu ) i identic argumentele; - In s a s a - Dac linia de comand are dou argumentele, continu. Altfel, termin programul cu aarea a a a a a s mesajului cu sintaxa liniei de comand: a Sintax: copiere <surs> <destinatie> a a - Deschide ierul surs citire: s a n mov ax, 3d00h mov dx, offset cale_sursa int 21h - Dac operatia anterioar nu a generat eroare, continu. Altfel, termin programul cu aarea a a a a s mesajului: Eroare deschidere fiier surs s a - Salveaz identicatorul ierului surs; a s a - Creaz ierul destinatie: a s mov ah, 5bh mov cx, 0 int 21h - Dac operatia anterioar nu a generat eroare, continu. Altfel, a a a nseamn c numele ierului a a s destinatie nu este valid sau exist un ier cu acelai nume. acest caz, termin programul a s s In a cu aarea mesajului: s Eroare deschidere fiier destinatie s - Salveaz identicatorul ierului destinatie; a s - Citete c un buer din ierul surs i scrie buerul ierul destinatie. C ultimul s te s a s n s nd buer nu este plin, nseamn c s-a terminat ierul surs: a a s a copiere:

138LUCRAREA 10. NOTIUNI AVANSATE DE PROGRAMARE LIMBAJ DE ASAMBLARE IN mov mov mov mov int ah, bx, dx, cx, 21h 3fh [handle1] offset buff_rw 1024 ; citire din fiier <surs> s a ; adresa bufferului unde se vor depune octetii ; CX contine numrul de octeti cititi a

cmp ax, cx je buffer_intreg mov [cond], 1 buffer_intreg: mov mov mov int cx, ax ah, 40h bx, [handle2] 21h

; c^nd numrul de octeti cititi este mai mic a ; dec^t capacitatea bufferului, va fi ultima ; citire

; scriere n fiier <destinatie> ^ s

cmp [cond], 1 je inchidere jmp copiere - Inchidere iere surs i destinatie: s as inchidere: mov ah, 3eh mov bx, [handle1] int 21h mov ah, 3eh mov bx, [handle2] int 21h

10.2

Programe rezidente

Sistemul de operare DOS permite unui program s rm a memorie i s predea controlul a a n n s a programului ce l-a lansat (programului printe) sau sistemului de operare. Programul rmas a a rezident poate reactivat de ctre un eveniment extern (apsarea unei taste - INT 09H, sau a a acest mod, dei la un moment dat se execut un orice ntrerupere software sau hardware). In s a singur porgram, prin comutarea rapid a ntre programe, se poate crea impresia de multitasking. Terminarea unui program care s rm a rezident memorie se face prin apelul functiei a a n n DOS 31H. Apelul functiei de rm a nere rezident trebuie precedat de stabilirea conditiilor de re activare. Conditiile de reactivare s stabilite prin modicarea (deturnarea) unor nt ntreruperi. Programele de acest fel s cunoscute ca programe T SR (Terminate and Stay Resident). nt Descrierea functiei DOS 31H este prezentat tabelul 10.4. a n Structura general a programelor TSR este prezentat continuare. a a n Se veric dac programul lansat este deja rezident: se veric o locatie de memorie aat a a a a la o adres x, stabilit prin programul TSR; a a a

10.3. EXPERIMENTE SI INTREBARI Registre la intrare AH: 31H AL: cod returnat DX: dimensiune memorie rezervat a Descriere Termin programul dar pstreaz rezident memorie. a l a a n Codul de retur din AL este ntors programului printe a sau sistemului de operare DOS prin variabila ERRORLEVEL. Codul returnat poate determinat cu functia DOS 4DH.

139

Tabelul 10.4: Descrierea functiei DOS 31H (terminare program prin rm a nere rezident memn orie). Dac programul nu este deja rezident (este la prima rulare) atunci se pregtete rm a a s a nerea rezident: a - Se deturneaz a ntreruperile folosite la reactivare (tastatur 09H, hard-disk 13H, etc.); a - Se elibereaz memoria alocat programului TSR (functie DOS 49H); a a - Se termin programul cu rm a a nere rezident memorie prin apelul functiei DOS a n 31H (Terminate and Stay Resident). Dac programul este deja rezident (nu este la prima rulare) se realizeaz urmtoarele a a a actiuni: - Se veric dac este o comand de dezinstalare prin evaluarea argumentelor liniei a a a de comand care se obtine din PSP (adresa de intrare program ES:0081); a n - Dac este o comand de dezinstalare, se refac vectorii a a ntreruperilor deturnate. Se termin programul prin functia DOS 4CH. a

10.3

Experimente i s ntrebri a

I. Care s diferentele nt ntre cele dou formatele de iere executabile sistem de operare a s n DOS (EXE i COM)? s II. Enumerati actiunile care au loc de la lansarea executie a unui program (dup tastarea n a numelui programului la linia de comand) i p a la a s n nceperea executiei efective a acestuia. III. Utiliz Turbo Debugger, vericati continutul registrelor la nd nceperea programului lansat (format EXE i COM). s IV. Folosind programul de documentare hipertext T ECHhelp, studiati antetul ierelor EXE s (DOS kernel/EXE File Header Layout). Folosind un editor de texte hexa (nc.exe, F 3, F 4) vizualizati antetul unui ier executabil. Ulterior, folosind Turbo Debugger, vizualizati s PSP-ul aceluiai program, dup ce a fost arcat memorie. Faceti corespondenta s a nc n ntre datele existente antetul ierului (date statice) i cele existente PSP (date dinamice). n s s n V. Folosind programul de documentare hipertext T ECHhelp realizati un tabel cu descrierea functiilor DOS pentru lucru cu iere. Pentru ecare din functiile prezentate tabelul s n 10.3, realizati un tabel similar celui din gura 10.5, corespunztor functiei 3FH (citire din a ier). s

140LUCRAREA 10. NOTIUNI AVANSATE DE PROGRAMARE LIMBAJ DE ASAMBLARE IN Registre intrare AX: 3FH BX: identicator ier s CX: nr. baiti cititi DX: oset buer DS: segment buer ieire s AX: cod eroare Descriere Citete informatie dintr-un ier. s s Identicatorul de ier este BX, iar s n buerul care se trimit datele citite este la n adresa DS:DX. CX contine numrul de baiti care se citesc a din ier. Prima citire se face de la s nceputul ierului. Citirile ulterioare se fac din pozitia s de unde s-a terminat citirea anterioar. Dac a a a aprut o eroare la citire se seteaz CF a a iar registrul AX se returneaz codul de n a eroare. Dac citirea s-a fcut fr eroare, CF a a aa este resetat iar registrul AX se returneaz n a numrul de baiti cititi. a

Tabelul 10.5: Descrierea functiei DOS 3FH, citire din ier. s VI. Un ier poate creat e cu functia DOS 3CH, e cu functia DOS 5BH. Care este s diferenta ntre cele dou functii DOS? a VII. Studiati ierul COP IERE.ASM , ce contine un program limbaj de asamblare pen s n tru copierea unui ier. Testati programul cu diferite tipuri de argumente i aduceti-i s s mbuntiri. a at VIII. Studiati ierul ALT R.ASM , ce contine un program limbaj de asamblare capabil s s n a rm a rezident memorie. Programul se reactiveaz la apsarea combinatiei de taste a n n a a Alt-R. La reactivare, programul scrie un mesaj pe ecran. Comanda de dezinstalare a programului rezident este altr /u. Modicati programul pentru a se reactiva i la alte s combinatii de taste i pentru a avea o interfat mai prietenoas. De exemplu, sintaxa s a a linie de comand s e: a a altr [/u][/h] Dac se lanseaz programul cu optiunea /h, apar pe ecran informatii care descriu sintaxa a a liniei de comand. a

Lucrarea 11 Teme de programare limbaj de n asamblare


Aceast lucrare prezint o parte din temele propuse la colocviul de laborator, perioada a a n 1995-1998, de Catedra de Electronic i Calculatoare. as I. Scrieti o functie care s caute un caracter a ntr-un ir de caractere. Functia returneaz s a numrul primei pozitii a caracterului ir. Dac respectivul caracter nu apare ir, a n s a n s functia returneaz 0. Modul de transmitere al parametrilor este la latitudinea program a atorului. II. Scrieti un program care s calculeze produsul scalar a doi vectori. Vectorii se a a a n segmentul de date, au dimensiuni egale i elemente de tip byte. Rezultatul va un s cuv nt. III. Scrieti o functie care transform minusculele majuscule ls orice alt caracter neschim a n a nd bat. Se opereaz pe un ir ASCII (A - Z, 41h - 51h, a - z, 61h - 7Ah). a s IV. Scrieti o functie care s aibe ca parametru de intrare un pointer la un ir de caractere a s terminat cu 0. Functia returneaz un pointer la alt ir, cu caracterele inversate. Toate a s caracterele de control (cod ASCII < 32h) se vor nlocui cu constanta 20h. V. Scrieti un program care preia de la tastatur dou iruri de maxim 10 caractere terminate a as cu caracterul CR (Carrige Return, cod ASCII 0DH) i le compar. caz c s identice, s a In a nt se aeaz pe ecran mesajul ADEVARAT, altfel se aeaz mesajul FALS. Primul ir, s a s a s al doilea ir i mesajul vor apare pe linii diferite, aa ca exemplele urmtoare: s s s n a Exemplul 1 ---------abdf cdfrer FALS Exemplul 2 ---------abcde abcde ADEVARAT Exemplul 3 ---------abc abcde FALS

VI. Scrieti un program care s primeasc de la tastatur dou numere binare reprezentate pe a a a a c 8 biti i s aeze rezultatul produsului lor sub forma: te s a s 00001100*00000010=0000000000011000 141

142

LUCRAREA 11. TEME DE PROGRAMARE LIMBAJ DE ASAMBLARE IN

VII. Scrieti un program care s citeasc de la tastatur trei litere majuscule {A, B, ..., Z}, s a a a a scrie pe ecran un spatiu (cod ASCII 20H) i apoi s le scrie ordine alfabetic. Pstrati s a n a a cele trei litere tastate registrele BH, BL i CL. n s VIII. Scrieti un program care s utilizeze functii DOS i s functioneze dup cum urmeaz. a s a a a Utilizatorul tasteaz dou litere. Dac una dintre ele este D, programul aeaz a a a s a n continuare cuv ntul DA urmat de o linie nou. Altfel, este aat cuv a s ntul NU, urmat de o linie nou. Secventa de evenimente se repet de dou ori, dup care controlul este a a a a ntors DOS. n IX. Scrieti un program care s primeasc de la tastatur un numr N, a a a a ntre 1 i 9. Programul s va aa pe ecran un ptrat cu latura N, umplut cu caractere *, coltul st s a nga sus ind pe r ndul 10, coloana 10. X. Scrieti un program care s tearg ecranul i s aeze partea din dreapta sus ora sub as a s a s n forma: HH:MM XI. Scrieti un program care s aeze pe ecran unul din mesajele de salut care urmeaz, a s a n functie de ora sistem: Buna dimineata!, ntre orele 5:00 i 10:00, s Buna ziua!, ntre orele 10:00 i 20:00, s Noapte buna!, ntre orele 20:00 i 5:00. s De exemplu, la ora 7:28p (or furnizat de comanda DOS time), pe ecran va apare salutul: a a Buna ziua! XII. Scrieti un program care s tearg ecranul i s aeze partea de st as a s a s n nga jos ora sistem sub forma: Ora: HH Minutul: MM XIII. Pentru ecare din urmtoarele perechi de adrese date sub forma segment:oset, decideti a dac cele dou adrese corespund aceleiai locatii de memorie: a a s a) 1234:1234 i 1358:0040 s b) 0500:ABCD i 0EB0:10CD s XIV. Scrieti un program care s citesc de la tastatur un numr de dou cifre i apoi s aeze a a a a a s a s pe display, pe o linie nou, restul artirii cu 9 a numrului introdus. a mp a XV. Scrieti un program care la apsarea unei taste s aeze pe ecran semnicatia tastei, ur a a s mat de un spatiu i de codul ASCII al tastei apsate (exprimat baza zece). Programul a s a n se va termina la apsarea tastei ESC. a Exemplu: A O g 5 H 65 79 103 53 72

143 XVI. Scrieti un program care s preia de la tastatur un numr de o cifr (1 - 9) i s aeze pe a a a a s a s ecran toti divizorii acestui numr (desprtiti de virgule). Terminarea programului se face a a dac se tasteaz 0. cazul tastrii altui caracter, afara celor de la 0 la 9, programul a a In a n nu reactioneaz. a Exemplu: 4 1,2,4 a 7 1,7 8 1,2,4,8 0 XVII. Scrieti un program care s citesc de la tastatur un numr de dou cifre i apoi s aeze a a a a a s a s pe ecran, continuarea cifrelor, clasa de resturi modulo 5 creia apartine numrul. n a i a Terminarea programului se face tast 00. nd Exemplu: 47 23 16 15 00 = = = = 2 3 1 0 mod mod mod mod 5 5 5 5

XVIII. Scrieti un program care s aeze pe ecran data sistemului sub forma: a s ZZ Luna, unde: ZZ este numrul zilei (pe dou cifre) iar a a Luna este denumirea lunii limba romn. n a a De exemplu, data de 05-13-1999 (dat furnizata de comanda DOS date), pe ecran va n a apare: 13 Mai XIX. Scrieti un program care s primeasc de la tastatur un numr reprezentat pe dou cifre a a a a a baza zece. Programul va aa pe ecran, continuarea numrului tastat, caracterele n s n a -> urmate de reprezentarea numrului baza 16. a n De exemplu, dac se tasteaz 3 i 5, pe ecran va apare: a a s 35->23 XX. Scrieti un program care s primeasc de la tastatur un numr reprezentat pe dou cifre a a a a a baza 16. Programul va aa pe ecran, continuarea numrului tastat, caracterele => n s n a urmate de reprezentarea numrului baza 10. a n De exemplu, dac se tasteaz 1 i A, pe ecran va apare: a a s 1A=>26

144

LUCRAREA 11. TEME DE PROGRAMARE LIMBAJ DE ASAMBLARE IN

Partea III Anexe

145

Anexa A Utilizarea Turbo Debugger


Aceast anex prezint utilitarul Turbo Debugger al rmei Borland. Interfata grac este a a a a aceeai at pentru DOS c i pentru Windows. Turbo Debugger este un dezasamblor de pros t t s grame folosit pentru depanarea i depistarea erorilor acestora. s

A.1

Descrierea interfetei grace

Interfata grac a Turbo Debugger este compus din: a a meniului principal - aat pe linia superior a ecranului; a meniul general sau local - aat pe linia inferioar ecranului; a ferestre dedicate arii diferitelor date utilizate pentru depanarea programelor. sa Fereastra principal utilizat pentru depanarea codului este fereastra CP U . Aceast fereastr a a a a este artit cinci subferestre care s prezentate urmtoarele date: mp a n n nt a segmentul de cod cu instructiuni dezasamblate; setul de registre; indicatorii; stiva; zona de memorie din segmentul de date. Figura A.1 prezint interfata grac a programului Turbo Debugger, cu fereastra CP U maxia a mizat. a

A.2

Meniul principal

Meniul principal se a partea superior a ferestrei i poate accesat dou moduri: a n a s n a 147

148

ANEXA A. UTILIZAREA TURBO DEBUGGER

Figura A.1: Interfata grac a Turbo Debugger. a apsarea tastei functionale F10; a apsarea tastei ALT simultan cu prima liter a unui meniu (F - F ile, E - Edit, V - V iew, a a R - Run, B - Breakpoints, D - Data, O - Options, W - W indow, H - Help).

A.2.1

File

Meniul F ile, obtinut prin tastarea ALT F , contine optiunile ce permit utilizatorului operatii externe dezasamblorului. C nteva dintre acestea s nt: Open - comanda permite deschiderea un ier .exe, .com sau .dll pentru a dezasamblat. s In functie de optiunea de asamblare (tasm /zi i tlink/v), codul dezasamblat poate it de s nsot informatii de depanare complete sau nu. Programul depanat poate specicat i ca argument s linia de lansare a programului T D. n DOS Shell - comanda permite suspendarea temporar a T urboDebugger pentru lansarea unor a comenzi DOS. Revenirea se face prin tastarea la prompterul sistem a comenzii exit. Resident - comanda termin T D cu rm a a nerea sa rezident. Aceast comand se utilizeaz a a a a pentru depanarea programelor T SR. Quit (ALT X) - comanda termin programul T D i a s ntoarce controlul DOS. n

A.2.2

Edit

Meniul Edit, obtinut prin tastarea ALT E, permite comenzi de copiere a unor articole prin intermediul clipboard.

A.2.3

View

Meniul V iew, obtinut prin tastarea ALT V , contine comenzi pentru aarea separat a s a tuturor tipurilor de ferestre. C teva din comenzile meniului s prezentate continuare. nt n

A.2. MENIUL PRINCIPAL

149

Breakpoints (F2) - comand de deschidere a ferestrei cu descrierea punctelor de oprire proa n gram. Fereastra prezint o list a adreselor de oprire i a conditiilor asociate acestora. a a s Stack - comand de deschidere a ferestrei care prezint starea actual a stivei, adresele de a a a ntoarcere ale instructiunilor CALL precum i variabile memorate stiv. Informatia din s n a aceast fereastr este disponibil i a a a s ntr-o subfereastr a ferestrei CP U . a Watches - comand de deschidere ferestrei care se poate urmri modicarea unei variabile a n a sau expresii timpul rulrii unei secvente de cod. Prin comanda Data/Add Watch, variabila n a sau expresia este adugat fereastra W atches de la pozitia cursorului sau prin specicare a a n explicit. a Variable - comand de deschidere a ferestrei care se prezint o list cu simboluri i valorile a n a a s asociate lor modulul de cod curent. Se pot prezenta i simboluri globale i valorile lor n s s asociate. Module... (F3) - comand de deschidere a unei ferestre cu codul surs al modulului curent. a a Fereastra M odule este fereastra deschis implicit la lansarea executie a T D, cazul care a n n n programul depanat include informatii suplimentare de depanare. File... - comand de deschidere a unei ferestre unde se poate arca un program. Continutul a nc programului poate aat hexazecimal sau ASCII, folosind comanda Ctrl D (Display). s n CPU - comand de deschidere a ferestrei CPU, compus din cele cinci subferestre prezentate a a fereastra principal este aat codul dezasamblat al programului. Datele paragraful A.1. In n a s s structurate pe trei coloane: nt coloana cu adresa sub forma segment:oset, exprimate baza 16; n coloana cu codurile instructiunilor, exprimate baza 16; numrul de octeti din aceast n a a coloan este dependent de instructiunea respectiv; a a coloana cu instructiunile limbaj de asamblare (mnemonici i operanzi). n s Celelalte subferestre s similare cu ferestrele Registers, Dump i Stack. Fereastra CP U este nt s fereastra deschis implicit la lansarea executie a T D, cazul care programul depanat nu a n n n contine informatii suplimentare de depanare. Dump - comand de deschidere a ferestrei care se aeaz continutul unei zone de memorie. a n s a Formatul de reprezentare implicit este hexazecimal. Modicarea formatului se face prin n comanda Ctrl D (Display), sau din meniul ce apare prin apsarea butonului din dreapta a a mouse-ului. Modicarea continutul se face direct prin scrierea noii valori la adresa dorit, sau a prin comanda Ctrl C (Change). Informatia din aceast fereastr este disponibil i a a a s ntr-o subfereastr a ferestrei CP U . a Registers - comand de deschidere a ferestrei de regitrii i indicatori. Modicarea se face direct a s s prin scrierea noii valori registrul selectat sau prin comanda Ctrl C (Change). Modicarea n indicatorilor se face prin tasta ENTER sau cu comanda Ctrl T (Toggle). Informatia din aceast fereastr este disponibil i a a a s ntr-o subfereastr a ferestrei CP U . a

A.2.4

Run

Meniul Run, obtinut prin tastarea Alt R, contine comenzi pentru executia programului.

150

ANEXA A. UTILIZAREA TURBO DEBUGGER

Run (F9) - comand ce determin executia continu a programului p a la lnirea unui a a a n nt punct de oprire, p a la n ntreruperea de ctre utilizator prin tastarea CT RL Break sau p a a n la teminarea acestuia. Go to cursor (F4) - comand ce determin executia programului p a la atingerea instructiunii a a n pe care se a cursorul. a Trace Into (F7) - comand ce determin executia unei singure instructiuni. Dac instructiunea a a a este de apel de procedur (CALL), atunci executia se oprete la prima instructiune din procea s dur. a Step over (F8) - comand ce determin executia unei singure instructiuni. Dac instructiunea a a a este de apel de procedur (CALL), se execut a a ntreaga procedur i executia se oprete la a s s instructiunea din programul principal, care urmeaz instructiunii CALL. a Execute to... (Alt-F9) - comand ce determin executia programului p a la o adres specicat. a a n a a Specicarea adresei poate face printr-o constant, la care T D adaug valoarea de segment, sau a a o expresie ce reprezint o locatie de memorie. a Until Return (Alt-F8) - comand ce determin executia programului p a c functia sau a a n nd procedura curent se re a ntoarce programul care a apelat-o. n Back trace (Alt-F4) - comand ce determin anularea rezultatului ultimei instructiuni executate. a a Starea procesorului i a memorie este refcut la valoarea anterioar executiei instructiunii. s a a a Instruction trace (Alt-F7) - comand ce determin executia unei singure instructiuni main a a s a n cazul depanrii unui program scris a ntr-un limbaj de nivel nalt. Se folosete pentru a urmri s a o procedur de tratare a a ntreruperii sau o functie ntr-un modul compilat far includerea a informatiilor pentru depanare. Arguments... - comand ce permite setarea sau modicarea argumentelor liniei de comand a a a programului depanat. Program reset (Ctrl-F2) - comand ce determin re arcarea programului initial de pe disc, a a nc cu reinitializarea procesorului.

A.2.5

Breakpoints

Meniul Breakpoints, obtinut prin tastarea ALT B, contine comenzi pentru plasarea, setarea sau anularea punctelor de oprire programul depanat. n Toggle (F2) - comand ce seteaz sau anuleaz un punct de oprire la o adres sau linie de cod a a a a indicat de cursor. Programul se va opri de ecare dat c va ajunge la acel punct. Aceelai a a nd s efect are i apsarea butonului din st l s a nga al mouse-ului pe primele dou coloane ale liniei a la care se dorete setarea unui punct de oprire. Programul poate rulat i s s ntre dou puncte a de oprire specic ndu-se primul punct ca pornire executie. Actiunea executat la lnirea n a nt unui punct de oprire poate stabilit prin fereastra Breakpoints. La atingerea unui punct de a oprire T D poate declana urmtoarele actiuni: s a Break - oprire program, controlul este preluat de ctre T D put a ndu-se examina starea procesorului i a memoriei; s Log - memorarea valorii unei variabile sau expresii fereastra Log; n

A.2. MENIUL PRINCIPAL

151

Execute - executarea unei expresii i evaluarea ei. Expresia poate orice limbaj s n suportat de T D (C, Pascal, Assembler) prin alegerea limbajului de interpretare. T D evalueaz implicit expresia de la adresa cerut limbajul care a fost scris codul; a a n n Enable - setarea unui alt punct de oprire; Disable - anularea unui alt punct de oprire. At...(Alt-F2) - comand ce seteaz un punct de oprire la adresa specicat de utilizator. a a a Changed memory global... - comand ce seteaz un punct de oprire cazul care continutul a a n n unui bloc de memorie se schimb. a Expression true global... - comand ce seteaz un punct de oprire cazul care o expresie a a n n devine adevrat. a a Delete all - comand ce anuleaz toate punctele de oprire denite anterior. a a

A.2.6

Data

Meniul Data, obtinut prin tastarea ALT D, contine comenzi pentru evaluarea, inspectarea i urmrirea unor variabile, portiuni de memorie sau expresii cadrul programului. s a n Inspect - comand ce deschide fereastra Inspector ce prezint valoarea unei variabile sau a unei a a expresii de referint la memorie. Dac cursorul se a fereastra cu cod surs, sub numele a a a n a unei variabile, atunci aceasta este adugat fereastra de inspectii. a a n Evaluate/Modify... (Ctrl-F4) - comand pentru evaluarea unei expresii arbitrare introdus de a a utilizator. Add Watch... (Ctrl-F7) - comand ce plaseaz o variabil sau o expresie fereastra de urmrire a a a n a (W atches). Variabila de sub cursor, dac acesta este zona de cod surs, este adugat a n a a a n mod automat fereastra de urmrire. n a

A.2.7

Options

Meniul Options, obtinut prin tastarea ALT O, contine comenzi pentru congurarea mediului de depanare i a optiunilor care au efect global asupra comportrii Turbo Debugger. Optiunile s a pot salvate ntr-un ier cu denumirea implicit tdconf ig.td. s a

A.2.8

Window

Meniul W indow, obtinut prin tastarea ALT W , contine comenzi pentru manipularea fe restrelor. Dei manipularea ferestrelor se poate face mai uor cu mouse-ul, lipsa acestuia, s s n comenziile meniului W indow rm singura solutie de organizare a arii mai multor ferestre a n sa pe ecran. Zoom (F5) - comand ce maximizeaz fereastra curent pe tot ecranul. Revenirea la a a a dimensiunea initial a ferestrei se face prin aceeai comand. Acelai efect se obtine dac a s a s a se actioneaz butonul din st a nga al mouse-ului c cursorul este pozitionat pe simbolul nd [] aat partea din dreapta sus al ferestrei. n

152

ANEXA A. UTILIZAREA TURBO DEBUGGER

Next (F6) - comand care determin schimbareea ferestrei curente. Fereastra curent are a a a un chenar cu linie dubl. Comutarea a ntre ferestre se poate face prin actionarea butonului din st nga al mouse-ului pe o fereastr diferit de cea curent. a a a Next pare (Tab) - comand care determin mutarea cursorului a a ntre subferestrele ferestrei curente. Size/More (Ctrl -F5) - comand ce permite redimensionarea i mutarea ferestrei curente. a s Cu mouse-ul, redimensionarea se face dac se actioneaz asupra laturilor din dreapta sau a a de jos ale ferestrei. Mutarea ferestrei se face prin actionarea mouse-ului asupra laturilor din st nga sau de sus ale ferestrei. Iconize/Restore - comand ce minimizeaz fereastra curent. Revenirea la dimensiunea a a a initial a ferestrei se face prin acceiai comand. Acelai efect se obtine dac se actioneaz a s a s a a butonul din st nga al mouse-ului c cursorul este pozitionat pe simbolul [] aat nd n partea din dreapta sus al ferestrei. Close (Alt-F3) - comand de a nchidere a ferestrei curente. Undo Close (Alt-F6) - comand de redeschidere a ultimei ferestre a nchise. User screen (Alt-F5) - comand care prezint ecranul sub forma care ar aprea dac a a n a a s-ar executa programul utilizatorului. Dup vizualizarea ecranului, apsarea oricrei taste a a a determin revenirea la ecranul Turbo Debugger. a

A.3
A.3.1

Meniuri generale
Meniul general

Functiile meniului general s disponibile tot timpul i pot apelate prin tastele functionale. nt s Descrierea functiilor meniului este prezentat pe bara de jos a ferestrei principale, aa ca a s n gura A.1. F1 Help - obtinerea informatiilor despre fereastra care se a pozitionat cursorul. n a F2 Bkpt - plasarea unui punct de oprire la linia cursorului. Comand similar cu meniul a a Breakpoints/T oggle. F3 M od - deschiderea fereastrei corespunztoare modulelor din cadrul programului. a In fereastr se va aa codul surs a modulului curent. Comand similar cu meniul View/ a a a a Module. F4 Here - executarea programului p a la linia pe care se a cursorul. Comand similar n a a a cu meniul Run/Go to cursor. F5 Zoom - maximizarea ferestrei care se a cursorul. Comand similar cu meniul n a a a W indow/Zoom. F6 N ext - activarea urmtoarei ferestre deschise. Comand similar cu meniul Window/ a a a Next.

A.4. MENIURI LOCALE

153

F7 T race - executia unei singure instructiuni din program. Comand similar cu meniul a a Run/Trace into. F8 Step - executia unei singure instructiuni. Dac instructiunea este apel de procedur, a a se execut toat procedura. Comand similar cu meniul Run/Step over. a a a a F9 Run - executia ntregului program. Comand similar cu meniul Run/Run. a a F10 M enu - mutarea cursorului pe bara de sus, a meniului principal.

A.3.2

Meniul general alternativ

Functiile meniului general alternativ s disponibile tot timpul i pot apelate prin apsarea nt s a tastei ALT i a unei taste functionale. s Alt-F2 Bkpt at - stabilirea unui punct de oprire la adresa specicat. Comand similar a a a cu meniul Breakpoints/At. Alt-F3 Close - nchiderea ferestrei curente. Comand similar cu meniul W indows/Close. a a Alt-F4 Back - anularea rezultatului ultimei instructiuni executate. Comand similar cu a a meniul Run/Back trace. Alt-F5 U ser - vizualizarea rezultatelor executiei programului fereastra utilizator. Co n mand similar cu meniul Window/User screen. a a Alt-F6 U ndo - anularea efectului comenzii anterioare. Comand similar cu meniul Wina a dow/Undo. Alt-F7 Instr - executia unei singure instructiuni. Comand similar cu meniul Run/ a a Instruction Trace. Alt-F8 Rtn - executia programului p a c functia curent se re n nd a ntoarce programul n care a apelat-o. Comand similar cu meniul Run/Until return. a a Alt-F9 T o - executia programului p a la adresa specicat. Comand similar cu meniul n a a a Run/Execute to. Alt-F10 Local - deschiderea meniului local, asociat ferestrei active. Aceeai actiune o s determin i apsarea butonului din dreapta al mouse-ului. as a

A.4

Meniuri locale

Meniurile locale contin comenzi specice ferestrelor selectate. Apelarea meniurilor locale se poate face prin: comanda ALT-F10 din meniul general alternativ; apsarea tastei CTRL; a apsarea butonului din dreapta al mouse-lui, suprafata ferestrei selectate. a n

154

ANEXA A. UTILIZAREA TURBO DEBUGGER

Informatii suplimentare despre meniurile locale ale ferestrei curente se pot obtine prin apsarea a tastei F1.

A.4.1

Meniul ferestrei CPU

G - Goto - pozitionarea cursorului la adresa indicat astfel t cursorul se va aa pe a nc prima linie a ferestrei. O - Origin - pozitionarea liniei pe care se a cursorul pe prima linie a ferestrei. a F - Follow - pozitionarea cursorului pe linia de destinatie a unei instructiuni de salt sau apel de procedur. Instructiunea curent trebuie s e una de salt sau apel de procedur, a a a a altfel instructiunea nu are nici un efect. C - Caller - pozitionarea cursorului pe instructiunea care a apelat ntreruperea sau procedura curent. a P - Previous - pozitionarea cursorului pe instructiunea pe care a fost anterior pozitionrii a acestuia cu comanda Follow sau Caller. S - Search - cutarea unui byte sau a unei instructiuni cod. a n V - View source - deschiderea unei ferestre Module care prezint codul surs asociat celui a a dezasamblat. A - Assamble - asamblarea unei instructiuni la adresa curent a cursorului. a N - New - determin ca urmtoarea instructiune executat s e cea de la cursor. Adresa a a a a instructiunii pe care se a cursorul este arcat registrele CS i IP. acest mod, se a nc a n s In poate sri peste o portiune de cod. a

A.4.2

Meniul ferestrei Dump

G - Goto - salt la o adres specicat de utilizator sub forma segment:oset. a a S - Search - cutarea unei secvente de biti fereastra curent. a n a N - N ext - cutarea urmtoarei aparitii a secventei specicate de comanda Search. a a C - Change - modicarea continutului uneia sau mai multor locatii de memorie de la pozitia curent a cursorului. a F - F ollow - pozitionarea datelor sau codului la o nou adres pe baza datelor din memorie a a aate la adresa curent a cursorului. a P - P revious - pozitionarea cursorului locul anterior executiei comenzilor F ollow sau n Caller. D - Display - schimbarea modului de reprezentare a datelor fereastra de memorie n (Byte, Word, Long, Comp, Float, Real, Double, Extended). B - Block - manipularea unui bloc de memorie . Submeniul contine optiunile:

A.4. MENIURI LOCALE clear - initializare cu zero a unui bloc de memorie; move - copierea unui bloc de memorie de la o adres la alta; a set - initializarea unui bloc de memorie cu o valoare specicat; a

155

read - citirea dintr-un ier a datelor i plasarea acestora s s ntr-un bloc de memorie; write - scrierea datelor dintr-un bloc de memorie ntr-un ier. s

A.4.3

Meniul ferestrei Register

I - Increment - incremetarea continutului registrului selectat; D - Decrement - decremetarea continutului registrului selectat; Z - Zero - resetarea registrului selectat; C - Change - modicarea continutului registrului selectat; R - Registers - comutarea ntre aarea registrelor pe 16 sau 32 de biti. s

A.4.4

Meniul ferestrei Flag

T - T oggle - comutarea valorii indicatorului selectat. Acelai lucru se obtine prin apsarea s a tastei ENTER dup plasarea cusorului pe indicatorul respectiv. a

A.4.5

Meniul ferestrei Stack

G - Goto - mutarea cursorului la adresa specicat; a O - Origin - mutarea cursorului la v rful stivei, specicat de SS:SP; F - F ollow - mutarea cursorului la adresa indicat locatia de date a pozitiei curente a n din stiv; a P - P revious - mutarea cursorului la adresa anterioar unei pozitionri cu comenziile a a Follow sau Caller; C - Change - modicarea continutului locatiei de memorie selectate.

156

ANEXA A. UTILIZAREA TURBO DEBUGGER

Anexa B Schemele machetei MPF1-B microprofessor


Aceast anex prezint schemele machetei MPF1-B Microprofessor echipat cu microprocesor a a a a Z80. Figura B.1 prezint schema bloc a machetei care apar denumirea i plasamentul componena n s telor i al tastelor. s Figurile B.2, B.3, B.4, B.5 i B.6 prezint schemele electrice complete ale machetei. s a Figura B.2 prezint circuitul generator de semnal de ceas i de generare a semnalelor de selectie. a s Figura B.3 prezint conectarea circuitelor Z80-CPU, Z80-PIO i Z80-CTC. a s Figura B.4 prezint conectarea circuitului 8255. aceeai gur apar schemele circuitelor de a In s a intrare/ieire ale machetei, difuzorului i stabilizatorului de tensiune. s s Figura B.5 prezint circuitele de memorie i tastatura machetei. a s Figura B.6 prezint blocul de aaj al machetei realizat cu ase aoare 7 segmente. a s s s

157

158

ANEXA B. SCHEMELE MACHETEI MPF1-B MICROPROFESSOR

Figura B.1: Schema bloc a machetei MPF1-B microprofessor.

159

Figura B.2: Circuitul generator de semnal de ceas i de generare a semnalelor de selectie. s

160

ANEXA B. SCHEMELE MACHETEI MPF1-B MICROPROFESSOR

Figura B.3: Conectarea circuitelor Z80-CPU, Z80-PIO i Z80-CTC. s

161

Figura B.4: Conectarea circuitului 8255. Schemele circuitelor de intrare/ieire ale machetei, s difuzorului i stabilizatorului de tensiune. s

162

ANEXA B. SCHEMELE MACHETEI MPF1-B MICROPROFESSOR

Figura B.5: Circuitele de memorie i tastatura machetei. s

163

Figura B.6: Blocul de aaj al machetei. s

S-ar putea să vă placă și