Documente Academic
Documente Profesional
Documente Cultură
DE ASAMBLARE
• CURS - 2h / săptămână
• LABORATOR - 2h / săptămână
• Noţiuni introductive
• Microprocesorul Z80: structură generală, registre
• Setul de instrucţiuni al microprocesorului Z80
• Moduri de adresare
• Cicluri maşină, cicluri instrucţiune
• Studiul cererilor de magistrală şi al întreruperilor (mascabile şi
nemascabile)
• Circuitul DMA al microprocesorului Z80
• Interfaţa paralelă programabilă Z8O-PIO
• Circuitul Z80-CTC (Counter/Timer Circuit)
De ce "programare în limbaj asamblare" ?
• Limbajele de asamblare sunt limbaje tipice pentru microprocesoare, microcontrollere şi alte tipuri
de circuite.
Exemplu: Fie un microprocesor oarecare. Îl vom considera de la început ca un simplu dispozitiv de
tip intrare-ieşire. La "intrare" primeşte nişte date pe care acesta le va prelucra şi va oferi rezultatele
la "ieşire". Exemplul acesta presupune un program fix - microprocesorul va executa întotdeauna
acelaşi program, ceea ce ştim că nu este cazul în realitate. De aceea, va trebui să îi specificăm şi
cum vrem să fie procesate datele. Astfel se introduce ideea de "comenzi" care trebuie transmise
procesorului. Cum comenzile se transmit sub formă binară, un programator ar trebui să scrie un
program sub forma: 000101101011 - ceea ce nu ar fi tocmai prietenos. Pentru a rezolva această
problemă au apărut limbajele de asamblare - limbaje care prezintă o interfaţă mai accesibilă
programatorilor.
• Instrucţiunile în aceste limbaje sunt foarte simple (din punct de vedere al operaţiunilor executate) şi
scurte (mai sunt numite şi "mnemonice" pentru că ajuta la memorarea operaţiilor).
Exemplu: Presupunem că pentru a aduna două valori microprocesorul va primi instrucţiunea 101 (în
format binar); în limbaj de asamblare se poate atribui o instrucţiune de tipul ADD 4, 5 pentru
însumarea celor două numere →această instrucţiune va fi apoi transformată în cod binar şi transmisă
procesorului sub forma 101 0100 0101 (valorile sunt codificate pe câte 4 biţi); se observă clar
avantajul folosirii unui astfel de limbaj intermediar.
- porţiune dintr-un cod C++
(*a)++;
(*a) *= 2.5;
- traducerea codului C în limbaj de asamblare pentru x86 (doar partea de calcul)
- traducerea codului în limbaj de asamblare pentru un ATI Radeon 4890 (din nou,
doar partea de calcul):
Comentarii:
lsetup = loop setup, iniţializează o buclă; a1, r0, i0, ... sunt o parte din regiştrii procesorului
Din exemplele de mai sus se pot trage câteva concluzii: limbajele de asamblare au
o serie de elemente comune, cel puţin la nivel teoretic: fiecare foloseşte registre -
niște regiuni de memorie proprie unde se pot stoca variabile; registrele sunt foarte
rapide dar şi puţine la număr. De asemenea, în fiecare există o serie de formate
de reprezentare a datelor - datele de tip întreg se stochează binar într-un fel, float-
urile altfel, de unde şi nevoia de instrucţiuni de conversie între formate - cvttss2si
şi mai sugestivele I_TO_F si F_TO_I. Mai e nevoie şi de modalităţi de a accesa
locaţii din memoria RAM, de obicei prin încadrarea adresei (sau registrului care
conţine adresa) între paranteze. Aceste concepte apar în TOATE limbajele de
Când trebuie utilizat un anumit limbaj ?
• Codul maşină – teoretic nimeni nu programează direct în cod maşină. Majoritatea
assembler-elor sunt “free” şi relativ uşor de utilizat comparativ cu programarea direct în cod
maşină.
Se poate observa că la rularea procedurii de 100 de milioane de ori codul are un avantaj de 3.5 sec.
Absenţa priorităţilor
Limbajele evoluate de programare au definite liste de operatori cu priorităţile din matematică
sau priorităţi definite special.
La construirea de expresii, evaluarea se efectuează în raport cu priorităţile. Astfel, expresia:
a--*++b-c
a--*++b-c
se evaluează astfel:
• se incrementează b;
• se înmulţeşte a cu b;
• se scade c;
• se decrementează a.
Cuadruplu-cuvânt (quad-word)
63 0
1 - număr negativ
Reprezentarea în virgula flotantă (mobilă) – floating point
• scopul: reprezentarea numerelor foarte mari şi foarte mici
Forma generală a unui număr reprezentat în virgulă mobilă este:
(-1)SxMxBE
unde:
- S este un bit folosit la reprezentarea semnului numărului;
- M este un număr pozitiv subunitar, numit mantisă;
- B este baza de numeraţie în care se face reprezentarea numărului;
- E este un număr întreg cu semn, numit exponent.
Observaţie: Pentru a elimina problema reprezentării semnului exponentului, se adună la valoarea acestuia o
constantă C pentru a deplasa astfel intervalul în care exponentul poate lua valori. Dacă exponentul se reprezintă pe 8
biţi, iar un bit va fi folosit pentru semn, exponentul va lua valori în intervalul [-128, 127]. Pentru a deplasa acest
interval, se adună la valoarea exponentului constanta C = 128, intervalul în care va putea lua valori exponentul după
această transformare devenind [0, 255]. Deoarece cel mai mic număr din interval este acum pozitiv, semnul nu se va
mai reprezenta, cei 8 biţi fiind suficienţi în continuare pentru reprezentarea exponentului deplasat.
S Caracteristica Mantisa
1 c m
- simplă precizie: 32 de biţi
• 1 Semn, 8 Caracteristica, 23 Mantisa
- dublă precizie: 64 de biti
• 1 Semn, 11 Caracteristica, 52 Mantisa
- caracteristica = exponent + 1/2 (domeniu_exponent)
Reprezentarea şi codificarea informaţiilor
Din punctul de vedere al limbajului de asamblare calculatorul este văzut la nivel hardware: adrese
fizice de memorie, registre, întreruperi, etc. Unitatea de bază a informaţiei memorate în calculator este
bitul (0 sau 1) care corespunde din punct de vedere hardware unui circuit bistabil. Un circuit bistabil
este un circuit electronic care are două stări stabile codificate cu 1 sau 0, capabil să memoreze un bit
de informaţie.
Informaţia care se prelucrează într-un sistem de calcul este foarte variată. Astfel, se reprezintă în
memorie:
– instrucţiuni - prin coduri de instrucţiuni
– date:
• logice: Adevărat/Fals, Închis/Deschis, Pornit/Oprit
• numerice: întregi, nr. fracţionare, nr. pozitive/negative
• alfanumerice: caractere, text
• multimedia: sunet, imagine (audio/video)
– structuri de date
Structuri de date utilizate în limbaje de asamblare
Ca orice limbaj de programare şi limbajul de asamblare presupune operarea cu anumite structuri de date pentru care
trebuie precizate elementele legate de memorarea şi operarea acestora. Astfel specificarea (declararea) structurilor
de date se poate face :
– explicit: prin declaraţii, care indică în general lungimea datei
– implicit: prin utilizarea unor tehnici de adresare
– numele variabilei reprezintă o adresă de memorie
Reprezentarea şi codificarea informaţiilor
Date care intervin într-un program în limbaj de asamblare sunt:
• date booleene (logice). Aceste tipuri de date intervin când se lucrează cu:
– indicatori de condiţie (flag-uri): C,Z,O,...
– zone de memorie cu acces la nivel de bit (numai la anumite procesoare – ex:
microcontrolere)
• caractere
– date reprezentate pe octet în codificare ASCII
• întregi fără semn
– reprezentaţi pe octet, cuvânt sau dublu-cuvânt
• întregi cu semn
–în codificare C2 – anumite instrucţiuni pot face distincţie între întregi cu semn şi
fără semn
–la declarare nu se face distincţie între cele două forme de întregi
• numere în reprezentare flotantă
–dacă se acceptă aritmetica în virgulă flotantă (ex.: prezenţa unui coprocesor
matematic)
–reprezentare pe 32, 64 sau 80 biţi
• pointeri:
– folosiţi pentru păstrarea unor adrese (adr. segment: adr. offset)
• şiruri de caractere sau de cuvinte
• înregistrări
Etapele dezvoltării unui program în limbajul de asamblare sunt următoarele:
• Editarea
• Asamblarea
• Link-editarea
• Rularea şi eventuala depanare
Programul în limbaj de asamblare este scris mai întâi cu un editor de text oarecare, constituind aşa-
numitul program sursă. El trebuie să respecte două categorii de reguli:
- Reguli specifice setului de instrucţiuni ale procesorului pentru care este scris. Aceste reguli
cuprind scrierea corectă a mnemonicelor instrucţiunilor, a operanzilor, diverse prefixe şi notaţii
suplimentare, toate fiind precizate în documentaţia referitoare la procesorul respectiv.
- Reguli specifice programului asamblor cu care se lucrează. Aceste reguli se referă la
declaraţii, etichete, directive de asamblare, pseudoinstrucţiuni, eventual macroinstrucţiuni, etc. Ele sunt
precizate în documentaţia aferentă mediului de asamblare.
După scrierea programului sursă, el este încărcat în asamblor care îl transforma în final în program
obiect. În plus, din procesul de asamblare se pot obţine şi alte fişiere, care permit vizualizarea
programului, a simbolurilor folosite, etc.
Programul obiect este la rândul său preluat de link-editor, fiind transformat într-un fişier executabil
- programul final.
Programul executabil obţinut este testat în diverse moduri, iar în caz de funcţionare
necorespunzătoare din cauze care nu sunt evidente, se încarcă într-un program depanator (debugger).
Acesta permite rularea pas cu pas a zonelor neclare din funcţionarea programului, cu afişarea continuă
a conţinutului registrelor şi memoriei, permiţând astfel localizarea problemelor. După clarificarea lor,
este modificat corespunzător programul sursă, şi procesul se reia.
Elemente ale limbajului de asamblare
Programul sursă este format dintr-un număr de linii, care pot fi:
Directive de asamblare
Etichete şi declaraţii de simboluri
Comentarii
Linii de instrucţiuni
O linie de instrucţiune a programului sursă are următoarea structură:
{Etichetă:}_Mnemonic_{Prefix}_Operand1{,{Prefix}_Operand2}_{;Comentariu}
unde:
Acoladele indică un câmp opţional;
Semnul _ indică un separator, care poate fi format din spaţii sau tab-uri; Între Operand1 şi
Operand2, separatorul este de regula o virgulă;
Eticheta este un grup de caractere care începe cu o litera şi nu coincide cu un cuvânt rezervat.
Ea trebuie urmată de semnul “:” atunci când se află la începutul liniei. Când este referita ca
operand (de exemplu la o instrucţiune de salt), ea nu mai este urmată de acest semn. Exemple:
Eticheta1, Loop15, Salt, Label, L22, etc.
Mnemonicul este o prescurtare a descrierii instrucţiunii şi este conform cu setul de
instrucţiuni al procesorului;
Operandul poate fi un nume de registru, o constantă numerică (date sau adrese), sau o
etichetă, conform descrierii instrucţiunii respective;
Prefixele dau precizări suplimentare despre operanzi, conform descrierii instrucţiunii
respective;
Comentariul este opţional şi trebuie precedat de semnul “;” . Tot ceea ce urmează pe o linie
după acest semn este ignorat de asamblor.