Laborator microprocesoare

download Laborator microprocesoare

of 210

description

mocro

Transcript of Laborator microprocesoare

SETUL DE INSTRUCIUNI ALE MICROPROCESOARELOR INTEL 80x86 N MODUL REAL SAU VIRTUAL 8086

Prof. dr. Sever Spnulescu

Programarea n limbaj de asamblare a microprocesoarelor

-Lucrri de laborator-

Editura Victor

2004

Introducere

Dei limbajele de programare s-au perfecionat continuu pe parcursul ultimelor decenii, se pare c suntem nc departe de apariia unui limbaj absolut optimal care s mbine toate avantajele celorlalte limbaje i s evite dezavantajele lor. De altfel, majoritatea limbajelor de programare actuale au evoluat tocmai n direcia eliminrii propriilor puncte slabe i a achiziionrii celor mai moderne concepte din teoria programrii. A rezultat o tendin de apropiere reciproc a acestora i nu este exclus ca n viitor s se constate o tendin de unificare ntr-un standard care s preia soluiile optimale ale diverselor limbaje de programare, ceea ce ar micora eforturile de nvare i chiar cele de cutare a celui mai adecvat limbaj pentru o aplicaie dat.

S-ar putea spune ns c problema limbajului unic este principial nerezolvabil i coexistena mai multor nivele n complexitatea actului de programare este obligatorie.

Intr-adevr, n dialogul om-main se constat n permanen o anume distribuie a eforturilor se dezvoltare i utilizare a unui program. Se poate folosi un limbaj care s necesite un efort mai mic din partea programatorului n partea de dezvoltare i mai mare din partea mainii n partea de execuie (rulare) , sau invers. Se constat c, invariabil, n primul caz performanele programului rezultat sunt mai sczute , iar n al doilea caz mai ridicate. Aceasta se datoreaz nivelurilor mai nalte i respectiv mai sczute ale instruciunilor folosite.

Astfel, instruciunile unui limbaj de programare sunt de fapt grupuri mai mari sau mai mici de operaii care se petrec n interiorul calculatorului instruciunile main. Cnd grupurile respective sunt mari, programatorul are de scris mai puin cod, efortul su fiind sczut, i se spune c nivelul instruciunilor i al limbajului este nalt. Astfel de limbaje sunt: Basic, Pascal, etc. Dac numrul de instruciuni main dintr-o instruciune a limbajului este mai sczut, efortul programatorului crete, el trebuind s scrie un cod mai complex pentru o sarcin dat. Astfel de instruciuni i de limbaje se numesc de nivel mediu, cum ar fi de exemplu C.

La extrema opus exist un limbaj ale crui instruciuni coincid chiar cu instruciunile mainii limbajul de asamblare. Aici efortul programatorului este evident maxim i limbajul respectiv este de nivel sczut.

Problema esenial a nivelului unui limbaj de programare este c nivelul su se afl ntr-o dependen invers proporional cu eficiena codului generat. Intr-adevr, cu ct instruciunile unui limbaj conin mai multe instruciuni main, cu att viteza lor de execuie scade. n plus, scade i probabilitatea ca o anumit instruciune s fie soluia optim pentru o problem dat.

Programatorul are la dispozie anumite tipuri de prefabricate - instruciunile din care trebuie s alctuiasc programul, mbinndu-le pe cele mai apropiate de necesitile sale reale, chiar dac acestea sunt uneori departe de prototipul cu eficiena optim. Pe msur ce dimensiunile acestor blocuri scad este mai posibil ca ele s se mbine mai eficient, mrind i performana ansamblului. n fine, atunci cnd performana este critic se pot folosi blocurile cu cele mai mici dimensiuni posibile - instruciunile main ale limbajului de asamblare. Eficiena codului este n acest caz maxim, la fel i efortul programatorului.

O alt variant de adaptare eficient a unui limbaj la o gam larg de aplicaii o constituie diversificarea instruciunilor acestuia pentru a oferi soluii prefabricate ntr-un numr ct mai mare de situaii. n acest caz se constat ns o cretere anormal a numrului de instruciuni ale limbajului respectiv, mrind att efortul de nvare ct i pe cel de lucru ( de cutare) cu aceste instruciuni. Astfel, de exemplu, funciile API (Application Programming Interface) utilizate de Visual C ajunseser deja de la varianta Windows 3.1 la un numr de peste 1300, pentru versiunile viitoare de Windows evitndu-se chiar menionarea numrului total. Fiind scrise de mai multe grupuri i chiar generaii de programatori, ele se suprapun uneori, mrind confuzia utilizatorului.

In schimb, utilizarea limbajului de asamblare permite scrierea cu instruciunuile cele mai adecvate posibile a oricrei poriuni de program, aducnd prin aceasta viteza maxim care se poate astepta de la un anumit procesor. In plus, se pot obtine creteri de performan datorit posibilitii repartizrii eficiente a variabilelor ntre registre i memorie. Se tie c, din considerente hardware, lucrul cu registrele este mult mai rapid dact cel cu memoria RAM i incomparabil mai rapid dect lucrul cu discul. Aria de registre constituie ns o resurs limitat a sistemului, de aceea corect ar fi s fie ct mai mult utilizat de ctre variabilele care sunt cel mai frecvent folosite ntr-o zon de program dat. Compilatoarele repartizeaz n mod oarecum arbitrar variabilele ntre registre i memorie, neputnd intui frecvena lor aa cum poate face un programator n limbaj de asamblare.

O bun soluie de compromis o reprezint utilizarea nivelului mediu, n variantele limbajului C, al crui succes este de altfel recunoscut. Dar chiar i n cazul folosirii limbajelor de nivel mediu, i cu att mai mult a celor de nivel nalt, pot aprea poriuni de program n care viteza este un parametru critic iar instruciunile proprii conduc la soluii innaceptabile din acest punct de vedere. n aceste cazuri, soluia deja clasic o constituie inserarea de poriuni scrise n limbaj de asamblare. Acesta este unul din principalele motive n favoarea cunoaterii limbajului de asamblare i cel mai frecvent cmp de aplicare a acestuia.

n general, nu mai este recomandabil n momentul de fa scrierea unui program folosind exclusiv limbajul de asamblare. Din analiza algoritmului unei aplicaii date pot rezulta ins poriunile mari consumatoare de timp i poriunile de interfaare cu o pondere slab n durata total. In aceste cazuri, programul poate fi scris ntr-un limbaj nalt sau mediu, iar poriunile care necesit vitez - n limbaj de asamblare.

Prin urmare, cunoaterea limbajului de asamblare constituie calea natural de mrire a nivelului de performan al unui programator, acesta avnd posibilitatea s rezolve cazurile cele mai dificile prin soluii principial optimale.

Lucrarea de fa prezint numai acele aspecte ale programrii n limbaj de asamblare care prezint o importan i frecven mai mare n situaiile curente. Nu s-au tratat probleme de mare complexitate, care ar putea descuraja un nceptor i care rareori sunt utile n practic, ncercndu-se n schimb o prezentare gradat, care s asigure un antrenament sistematic al cursantului. Se recomand ca, pe parcurs, s se integreze astfel de programe, in programe scrise ntr-un limbaj de nivel nalt sau mediu deja cunoscut.

De asemenea, se recomand ca programele propuse s fie scrise i rulate efectiv pe calculator. n faza de execuie (depanare), se vor putea observa deseori diferene fa de ceea ce s-ar atepta n momentul scrierii programului. Tocmai astfel de situaii, n care apar probleme, sunt mai eficiente pentru fixarea cunotinelor de programare i ele au fost de multe ori incluse n mode deliberat n programele propuse.

Aceast lucrare constituie rezultatul experienei didactice de peste 14 ani, perioad n care au fost selectate prin feedback metodele cele mai eficiente de nvare rapid a limbajului de asamblare. Prin respectarea ritmului i etapelor din lucrare, se poate constata chiar c nvarea limbajului de asamblare este mai uoar dect a unui limbaj de nivel nalt.

Trebuie, totui, subliniat c utilizarea sa necesit cunoatera realitii hardware a procesorului i chiar a sistemului, iar scrierea unor programe complexe necesit mult mai mult timp dect alte limbaje. Dac, ns, decizia de a folosi instruciuni main n poriunui ale unui program este luat n mod corect, creterea de performan va fi evident iar efortul depus va fi rspltit corespunztor.

Lucrarea se adreseaz n primul rnd studenilor Facultii de Electronic i Calculatoare a Universitii Hyperion, i studenilor Facultii de Fizic a Universitii Bucureti. Ea poate fi ns util tuturor programatorilor care doresc s-i mreasc performanele prin utilizarea celui mai rapid limbaj de programare - limbajul de asamblare.

Lucrarea de laborator nr. 1

Utilizarea macroasamblorului TASM i a depanatorului TD

Etapele dezvoltrii unui program n limbajul de asamblare sunt urmtoarele:

1. Editarea

2. Asamblarea

3. Linkeditarea

4. Rularea i eventuala depanare

Programul n limbaj de asamblare este scris mai nti cu un editor de text oarecare, constituind aa-numitul program surs. El trebuie s respecte dou categorii de reguli:

Reguli specifice setului de instruciuni ale procesorului pentru care este scris. Aceste reguli cuprind scrierea corect a mnemonicelor instruciunilor, a operanzilor, diverse prefixe i notaii suplimentare, toate fiind precizate n documentaia referitoare la procesorul respectiv.

Reguli specifice programului asamblor cu care se lucreaz. Aceste reguli se refer la declaraii, etichete, directive de asamblare, pseudoinstruciuni, eventual macroinstruciuni, etc. Ele sunt precizate n documentaia aferent mediului de asamblare.

Dup scrierea programului surs, el este incrcat n asamblor care l transforma n final n program obiect. n plus, din procesul de asamblare se pot obine i alte fiiere, care permit vizualizarea programului, a simbolurilor folosite, etc.

Programul obiect este la rndul su preluat de linkeditor, fiind transformat ntr-un fiier executabil - programul final.

Programul executabil obinut este testat n diverse moduri, iar n caz de funcionare necorespunztoare din cauze care nu sunt evidente, se ncarc ntr-un program depanator (debugger). Acesta permite rularea pas cu pas a zonelor neclare din funcionarea programului, cu afiarea continu a coninutului registrelor i memoriei, permind astfel localizarea problemelor. Dup clarificarea lor, este modificat corespunztor programul surs, i procesul se reia.

1.1 Utilizarea TASM i TD n forma clasic (linie de comand, DOS)

Implementarea firmei Borland pentru limbajul de asamblare cuprinde n principal trei aplicaii, care vor fi utilizate n ordinea menionrii lor:

TASM.EXE- asamblorul (Turbo Assembler)

TLINK.EXE - linkeditorul (Turbo Linker)

TD- depanatorul de program (Turbo Debugger)

Evident, n prealabil trebuie scris (editat) programul surs, cu ajutorul unui editor (acesta nefiind inclus n pachetul de la Borland).

ntr-o fereastra DOS din sistemul de operare Windows (obinut n Windows XP din meniul Start-> Programs->Accessories->Command Prompt), comanda de scriere a programului surs poate fi de exemplu cea de apelare a aplicaiei Wordpad a sistemului:

write

n cazul n care se ncepe un program nou, ce urmeaz apoi s fie salvat sub un nume propriu (obligatoriu cu extensia .asm), sau

write cale\Nume_Surs

n cazul n care fiierul surs exist deja i urmeaz a fi editat.

Se poate folosi de asemenea aplicaia NOTEPAD.EXE, avnd avantajul c poate s afieze n bara de stare (jos) numrul liniei pe care se afl cursorul, lucru util pentru identificarea liniei la care asamblorul gsete o eroare. Pentru aceasta va trebui bifat n meniul View opiunea Status Bar.

Dup salvarea fiierului surs el va fi chemat de asamblor cu comanda:

Tasm Nume_surs, Nume_obiect, Nume_listing

unde:

Nume_surs este numele ales pentru fiierul surs editat anterior;

Nume_obiect este numele sub care va apare fiierul obiect ce va fi transformat n fiier executabil;

Nume_listing este numele unui fiier opional care conine o varianta cu informaii rezultate din asamblare a fiierului surs (listing), util pentru o analiza vizual.

Aceast linie de comand admite i anumite opiuni, vizibile dac se d comanda Tasm fr parametri ntr-o fereastr DOS. De exemplu, comanda:

Tasm.exe/zi Nume_surs, Nume_obiect, Nume_listing/l

va genera informaie complet pentru depanare (/zi) i fiier listing normal (/l).

n cazul n care nu exist erori de sintaxa (sunt respectate cele dou categorii de reguli menionate) se obine un mesaj favorabil (ca n figura 1), iar fiierul obiect poate fi prelucrat mai departe.

Figura 1.1 - Exemplu de asamblare fr erori

n cazul n care apar erori, se reia editarea fiierului surs, corectndu-se erorile i se face din nou asamblarea.

Dac n caseta de asamblare exist linia Error messages: None, se poate trece la linkeditare, folosindu-se comanda:

Tlink Nume_obiect, Nume_exefile

unde Nume_obiect este numele folosit n comanda precedenta (de asamblarere) pentru fiierul obiect, iar Nume_exefile este numele ce se alege pentru fiierul executabil. Se pot folosi i aici opiuni de linkeditare, care pot fi vzute rulnd comanda Tlink fr parametri ntr-o fereastra DOS. De exemplu, comanda

Tlink /v Nume_obiect, Nume_exefile

va genera informaii simbolice complete pentru depanare.

n continuare, se poate rula programul executabil obinut pentru a fi testat (ntr-o fereastra DOS) sau se poate ncarca n depanator (de exemplu Turbo Debugger) pentru a fi rulat pas cu pas. n acest caz, comanda va fi:

TD Nume_exefile

Deoarece aceasta suit de comenzi se va repeta de fiecare dat, este comod s se creeze un fiier batch de exemplu Asamblare.bat cu urmtoarea structur:

write.exe %1

pause

\tasm\bin\tasm.exe /zi %1,object,listing/l

pause

\tasm\bin\tlink /v object,exefile

pause

\tasm\bin\TD exefile

Acest fiier automatizeaz comenzile de asamblare, i va fi folosit pentru punerea la punct a unui program surs care a fost creat iniial cu comanda Write i salvat cu un nume avnd obligatoriu extensia .asm . Prin dublu click pe acest fiier, se va selecta cu opiunea Browse calea catre fiierul Asamblare.bat i se va bifa caseta Always use this program to open this file. n continuare, un dublu click pe un astfel de fiier va lansa automat secvena de comenzi necesar asamblrii. La finalul fiecrui ciclu de asamblare, se va deschide fereastra depanatorului Turbo Debugger care n general arat ca n exemplul din figura 1.2

Figura 1.2 - Fereastra principal din TurboDebugger

Se observ existena mai multor zone n aceasta fereastr.

1.Zona principal, care cuprinde partea stnga superioar afieaz codul programului i are urmtoarele cmpuri (de la stnga la dreapta):

Adresa efectiv n hexazecimal

Codul instruciunii n hexazecimal

Mnemonicul instruciunii

Operanzii, cu eventualele constante numerice reprezentate n hexazecimal

2. Zona de memorie de date, din partea stnga jos, care cuprinde cteva linii avnd structura:

Adresa efectiv a segmentului de date - AE

Coninutul exprimat n hexazecimal al memoriei la AE

Coninutul hexa al memoriei la AE+1, .a.m.d pn la AE+7

Echivalentul ASCII al celor 8 octei aflai la adresele respective

Se poate afia o fereastr suplimentar pentru vizualizarea unei zone mai mari de memorie cu comanda "Dump" din submeniul View. Aceasta va apare, n general, aa cum se vede n figur, n partea de jos a ecranului.

3. Zona de registre, aflat n dreapta ferestrei principale, care afieaz n hexazecimal pe 16 bii coninutul tuturor registrelor

4. Zona de flaguri, n extrema dreapt, n care sunt afiate valorile indicatorilor de condiii dup fiecare instruciune executat.

5. n colul din stnga jos este afiat coninutul segmentului curent din stiv.

n fereastra principal se observ un cursor, reprezentat prin colorarea diferit a unei linii (n figur, chiar prima linie) care poate fi folosit pentru a marca un punct de oprire la o comanda de rulare a progranului. Cu opiunea Run to cursor ( tasta F4) din meniul Run se poate rula automat programul pn la acest punct. Poziionarea cursorului este obligatorie dac programul nu are un punct de oprire sau ieire (n caz contrar, se continu automat cu interpretarea codurilor gasite n memorie dup ultima instruciune, iar sistemul se poate bloca). Terminarea se poate face cu o instruciune de salt necondiionat la ea insi, sau folosirea funciei 4Ch a ntreruperii 21h, cum se va arta ulterior.

Ca alternativ, programul poate fi rulat instruciune cu instruciune, cu tasta F7, urmrindu-se evoluia registrelor, a memoriei i a indicatorilor de condiii dup fiecare pas.

Dac asamblarea a decurs fr erori, n funcie de setrile TD, n fereastra acestuia poate s apar chiar programul obiect care poate fi rulat de asemenea instruciune cu instruciune (figura 1.3).

Figura 1.3 - Fiierul obiect n fereastra TD

Dac se dorete vizualizarea registrelor i a memoriei, se poate selecta n meniul View comanda CPU, sau alte ferestre. Eventual se poate bifa n meniul Option ->Display options caseta 43/50 Lines i n Option ->Save options caseta Layout.

1.2 Utilizarea TASM i TD n forma integrata (fereastra Windows)

Se poate lucra mai comod folosind programul MIAD - Mediu Integrat de Asamblare i Depanare ( Universitatea Hyperion), care integreaza editorul, asamblorul, linkeditorul i depanatorul de la Borland ntr-o forma grafic.

La lansare apare fereastra de editare, n care se va scrie textul programului surs, ca n figura 1.4.

Exist posibilitatea de a deschide un fiier cu extensia .asm din directoarea C:\TASM\BIN, sau de a deschide un sablon care conine elementele mininale care trebuie s apar ntr-un program scris n assembler. Dup editare, fiierul se va salva peste cel original, sau cu un nume nou, dar n care se va specifica obligatoriu extensia .asm (alfel nu este recunoscut de asamblor).

Figura 1.4 -Mediul de asamblare

Urmeaz comanda de Asamblare +Link lansat din meniul Execuie sau cu butonul din bara de sub meniu, fiind generat un mesaj care arat condiiile de finalizare ale asamblrii. Dac au aparut erori, este afiat o fereastr cu fiierul Listing, indicnd tipul erorilor i poziia acestora, ca n figura 1.5. n caz c nu sunt erori, listingul nu va fi afiat dect dac este bifat opiunea "Cu afiare listing" din submeniul Execuie.

Dac exist erori, se revine n fereastra iniial, de editare, i se corecteaz acestea.

Se trece n continuare la rularea programului (etap permis numai dac asamblarea s-a facut fr erori). Se poate face rularea direct, cu comanda Run din submeniul Execuie sau cu butonul . Nu se recomand ns aceasta comanda dect atunci cnd programul nou creat este suficient de bine pus la punct pentru a nu bloca sistemul. n fazele iniiale ale dezvoltrii programului se recomand testarea i depanarea cu comanda Debug din submeniul Execuie sau cu butonul . Aceasta produce ncrcarea programului n Turbo Debugger, aprnd fereastra acestuia, ca n figura 1.2

Figura 1.5 - Fiserul Listing cu specificarea erorilor

Dac ordinea operaiilor nu este respectat, programul d mesaje care indic etapele omise. Pe bara de jos a ferestrei principale este afiat numele fiierului curent i stadiul asamblrii acestuia.

Lucrarea de laborator nr. 2

Instruciuni de transfer ntre registre

2.1 Elemente ale limbajului de asamblare

Programul surs este format dintr-un numr de linii, care pot fi:

Directive de asamblare

Etichete i declaraii de simboluri

Comentarii

Linii de instruciuni

O linie de instruciune a programului surs are urmtoarea structur:

{Etichet:}_Mnemonic_{Prefix}_Operand1{,{Prefix}_Operand2}_{;Comentariu}

unde:

Parantezele acolade indic un cmp opional;

Semnul _ indic un separator, care poate fi format din spaii 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 cuvnt rezervat. Ea trebuie urmat de semnul : atunci cnd se afl la nceputul liniei. Cnd este referita ca operand (de exemplu la o instruciune de salt), ea nu mai este urmat de acest semn. Exemple: Eticheta1, Loop15, Salt, Label, L22, etc.

Mnemonicul este o prescurtare a descrierii instruciunii i este conform cu setul de instruciuni al procesorului;

Operandul poate fi un nume de registru, o constant numeric (date sau adrese), sau o etichet, conform descrierii instruciunii respective;

Prefixele dau precizri suplimentare despre operanzi, conform descrierii instruciunii respective;

Comentariul este opional i trebuie precedat de semnul ; . Tot ceea ce urmeaz pe o linie dup acest semn este ignorat de asmblor.

Toate programele care urmeaz a fi asamblate cu macroasamblorul TASM vor avea o parte de preambul minimal, de forma:

.model small

.stack 100h

.code

start:

--------------

Primele trei liniii sunt directive de asamblare, care declar cantitatea de memorie folosita, poziia stivei, i nceputul segmentului de cod. A patra linie este eticheta de intrare n program acesta ncheindu-se cu declaratia END eticheta_de_intrare.

Finalizarea se poate face cu o linie de bucla infinit i cu directiva end, de forma:

Bucla: jmp bucla

End start

Varianta normal de finalizare folosete ntreruperea 21h i se va prezenta ulterior.

2.2 Notaia hexazecimal:

n continuare se vor folosi urmtoarele notaii pentru date (valori imediate, precizate n instruciune):

-de 8 bii - n:0..0FFh; notaie echivalent: imm8;

-de 16 bii - nn:0..0FFFFh;notaie echivalent: imm16;

-de 32 bii - nnnn:0..0FFFFFFFFh;notaie echivalent: imm32;

Pentru reprezentarea comod a datelor, cuvintele n cod binar se mpart n mai multe grupuri de cte 4 bii i se asociaz fiecrui astfel de grup un simbol (cele 10 cifre din sistemul zecimal plus primele 6 litere ale alfabetului), rezultnd aa-numita reprezentare hexazecimal. Cu 4 bii se pot realiza 24=16 combinaii, conform tabelului 2.1.

De exemplu, numrul binar:

1001010011001010

se va scrie:

1001.0100.1100.1010

adic 94CA n hexazecimal. Pentru a se evidenia octeii, se mai folosete i scrierea echivalent 94.CA, unde 94 este octetul mai semnificativ iar CA octetul mai puin semnificativ.

n felul acesta se folosesc de pn la 4 ori mai puine cifre pentru reprezentarea datelor. Un numr binar de 8 bii (octet) se poate scrie cu 2 cifre hexazecimale, un numr de 16 bii (word) cu 4 cifre hexazecimale, etc.

Pentru a preciza ca un numr este reprezentat n hexazecimal (exist astfel de numere care nu conin deloc litere) se folosete sufixul h ataat n dreapta. De exemplu numrul anterior se va scrie ca 94CAh.

Majoritatea asmbloarelor nu fac diferene ntre litere mari i litere mici, deci se pot folosi i notaii de genul: 94CAh , 94cAH sau 94caH.

ZecimalBinarHexazecimal

000000

100011

200102

300113

401004

501015

601106

701117

810008

910019

101010A

111011B

121100C

131101D

141110E

151111F

Tabelul 2.1 - Reprezentarea hexazecimal

Mediul de asamblare consider implicit constantele ca fiind zecimale. Constantele hexazecimale trebuie s fie urmate de sufixul H, iar cele binare de sufixul B (se pot folosi litere mari sau litere mici).

Dac se intenioneaz ca toate numerele din program s fie implicit hexazecimale se poate introduce directiva .Radix 16, de regul naintea directivei .Stack. Toate numerele folosite folosite n continuare sunt implicit hexazecimale. Pentru specificarea numerelor zecimale se va folosi sufixul D.

Deoarece numerele hexazecimale cuprind i litere, ele ar putea fi confundate cu alte simboluri literale (etichete) folosite n program. De exemplu, numrul hexazecimal ADCEH (n binar 1010.1101.1100.1110) ar putea fi o eticheta, o variabila sau o constant. Pentru a preciza c este vorba de un numr, dac numrul ncepe cu o litera se pune n stnga sa cifra 0. De exemplu, numrul anterior se va scrie 0ADCEh, numrul 1011.1000.1001.0001 se va scrie 0B891h, etc.

Dac numrul de bii ai cuvntului binar nu este un multiplu de 4, el se va completa n stnga cu 0 pn devine multiplu de 4 i apoi se face delimitarea cifrelor hexazecimale. De exemplu numrul binar:

1011011001 se va scrie 0010.1101.1001= 2D9h sau 02D9h

Numerele folosite de diveri algoritmi pot fi cu semn sau fr semn. Anumite instruciuni aritmetice se comporta diferit pentru cele dou categorii de numere, aa cum se va arata mai trziu. Pentru numerele cu semn se folosete urmtoarea convenie: primul bit din stnga al numarului (cel mai semnificativ) este bitul de semn. El are valoarea 0 dac numrul este pozitiv i 1 dac este negativ.

2.3 Registreleprocesoarelor Intel x86

Microprocesorul convenional din seria Intel x86 are urmtoarele registre pentru lucrul curent:

Registrul de 16 bii Registrele de 8 bii Utilizare preferenial

AX AH AL

Dedicat nmulirilor i mpririlor,

etc.

BX BH BL

Adresare (baza segmentului de date)

CX CH CL

Contorizare

DX DH DL

Utilizat n inmuliri i impartiri

DS

Adresa segmentului de date

CS

Adresa segmentului de cod

SS

Adresa segmentului de stiv

ES

Adresa extrasegment (transfer de

iruri)

SI

Adresa sursei n transferuri de iruri

DI

Adresa destinaiei n transferuri de

iruri

BP

Adresare (baza segmentului de stiv)

SP

Indicator de stiv

IP

Numrator de program

F

Registrul de flaguri (indicatori de

condiii)

Registrele au fiecare cte 16 bii, cele generale putnd fi mprite n cte dou registre de 8 bii: cel care reine octetul inferior, notat cu sufixul L i cel care reine octetul superior, notat cu sufixul H.

Microprocesoarele de diverse tipuri au mai multe registre, cu mai mult de 16 bii (cele din seriile I-386, I-486 i Pentium ). Registrele de mai sus au de fapt la aceste procesoare un numr de 32 de bii, dar pot fi folosite ca registre de 16 bii cu notatiile de mai sus. n cazul n care se dorete folosirea lor ca registre de 32 de bii, denumirea lor va fi precedat de litera E (de la "extended"), iar n preambulul programului va trebui pus directiva .386, pentru a preciza c este folosit un procesor de la I-386 n sus.

Notaiile folosite pentru registre n cele ce urmeaz sunt:

-de 8 bii - r8: AL,AH,BL,BH,CL,CH,DL,DH;

-de 16 bii - r16: AX,BX,CX,DX,SI,DI,BP,IP,F;

-de 32 bii - r32: EAX,EBX,ECX,EDX,ESI,EDI,EBP,EIP,EF;

-registre de segment -rs: DS,ES,SS,CS.La procesoare de la I-386 n sus mai exist dou registre suplimentare de segment, FS i GS.

2.4. Instruciuni de transfer ntre registre

Mnemonic general: MOV dest,src

Aciune: dst ia valoarea scr

dst src

Operanzi: dst: r8,r16,r32,rs

src:r8,r16,r32,rs,n,nn,nnnn

Restricii: nu sunt posibile transferuri de tip:

-MOV rs,rs (nu sunt posibile transferuri ntre registre de segment)

-MOV rs,nn (nu se poate scrie o constant direct ntr-un registru de segment)

-MOV cs,* (nu se poate transfera nimic n registrul de segment de cod)

Exemplul 2.1:

MOV AX, 33H;ncarc n AX constanta hexa 0033H

MOV DX, 1122H;ncarc n DX constanta hexa 1122H

MOV CL, AL;ncarc n CL coninutul lui AL

MOV BL, DH;ncarc n BL coninutul lui DH

MOV AH, DL;ncarc n AH coninutul lui DL

Mod de lucru :

Toate constantele numerice specificate mai jos sunt hexazecimale, deci n programul surs vor fi urmate de sufixul h.

Rularea programelor se va face cu TD n modul pas cu pas (cu tasta F7) i dup fiecare instruciune se va urmri n fereastra de afiare a registrelor modificarea coninutului acestora.

Se vor scrie i testa urmtoarele programe:

P 2.1. Program de scriere n registrele AL, BL, CL i DL a constantelor 99,AA, BB, respectiv CC.

P 2.2. Se va completa programul anterior pentru a transfera coninutul registrului AL n registrele BL, BH, CL, i DH.

P 2.3. Program de scriere n registrele AX, BX, CX i DX a constantelor 1122, 3344, 5566, respectiv 7788.

P 2.4. Se va completa programul anterior pentru a transfera coninutul registrului registrului BX n registrul DX, i al registrului CX n AX.

P 2.5. Program care s transfere constanta 1234 n registrul DS i constanta 5678 n registrul DX.

P 2.6. S se scrie n registrele AL i BL, constantele 99 i AA i se va face apoi interschimbarea coninutului acestora.

2.5. Instruciuni de interschimbare ntre registre

Mnemonic general:

XCHG dst,src

Aciune: Se interschimba coninuturile registrelor dest i src.

dst src

src dst

Operanzi: dst,src:r8,r16,r32

Restrictii:Nu exist instruciuni de tip:

-XCHG rs,rs

-XCHG cs,*

Mod de lucru :

P 2.7. Se vor ncarca urmtoarele registre astfel:

AL cu 11

BL cu 22

CX cu 3344

DX cu 5566

dup care se va interschimba coninutul celor de 8 bii i coninutul celor de 16 bii.

P 2.8. Se vor ncrca registrele AL, AH, BL i BH constantele AA,BB,CC i DD i apoi se va efectua permutarea circular a coninutului celor 4 registre. Se vor folosi instruciuni de tip XCHG, i dup terminarea rulrii programului registrele vor trebui s aib valorile: AL=BBh, AH=CCh, BL=DDh i BH=AAh

2.6. Instruciuni de adunare i scdere

Mnemonice generale:

-ADD dst,src - Adunare : dst=dst+src;

-ADC dst,src - Adunare cu transport (CF): dst=dst+src+CF

-SUB dst,src - Scdere: dst=dst src;

-SBB dst,src - Scdere cu transport (carry) sau mprumut (borrow): dst=dst-src-CF;

n toate operaiile aritmetice, se folosete implicit convenia complementului fa de 2. Astfel, numerele pozitive au bitul cel mai semnificativ (MSB) 0, iar cele negative au MSB 1. Numerele negative vor avea valoarea diferenei ntre valoarea lor absoluta i 28n , unde n este numrul de octei folosii.

Exemple:

25h=0010.0101 este un numr pozitiv, avnd echivalentul zecimal 37;

0B3Ch= 0000.1011.0011.1100 este un numr pozitiv, cu echivalent zecimal 2876;

0A7h=1010.0111 este un numr negativ (dac este considerat de un octet), cu valoare absoluta 167 i valoare n complement fa de 2 care se calculeaza conform formulei 167-28 = -89;

0CEACh = 1100.1110.1010.1100 este un numr negativ de doi octei, cu valoare absoluta 52908 i valoare n complement fa de 2 care se calculeaza conform formulei 52908-216 = -12628;

Se observ c un eventual 0 n faa numrului scris n format hexazecimal nu nseamna c acesta are semn pozitiv. Conteaz numai primul bit al octetului cel mai semnificativ.

Aceste transformri se pot face cu utilitarul Calculator din Windows, avnd opiunea View - > Scientific.

Mod de lucru:

P 2.9. Se vor ncarca registrele cu constantele: AX=1122, BX=3344, CX=5566, DX=7788

i se va efectua urmtoarea succesiune de operaii:

AL+66

AL+BL

AL-CL

AL-22

AL+BL+CL+DL

P 2.10. Se vor ncarca registrele cu constantele: AX=1122, BX=3344, CX=5566, DX=7788

i se va efectua urmtoarea succesiune de operaii:

AX+6666

AX+BX

AX-CX

AX-22

AX+BX+CX+DX

P 2.11 Se vor ncarca dou numere de 32 de bii n registre n felul urmtor:

- primul numr 11223344 n AX (octeii superiori) i BX (octeii inferiori)

- al doilea numr 55667788 n CX (octeii superiori) i DX (octeii inferiori) n continuare se va efectua adunarea celor dou numere. Rezultatul trebuie s fie 6688AACC

P 2.12 Acelai program ca la 2.11, numerele fiind 55667788 i 99AABBCC. Rezulatul trebuie s fie EF113354.

P 2.13 Acelai program ca la 2.11 dar, numerele fiind 55667788 i 11223344, se va efectua scderea lor. Rezultatul trebuie s fie 44444444.

P 2.14 Acelai program ca la 2.13, numerele fiind 22334455 i 66778899. Rezultatul trebuie s fie BBBBBBBC.

Lucrarea de laborator nr. 3

Transferuri de date i operaii aritmetice cu memoria

3.1 Componentele unei adrese logice

Pentru a modulariza blocurile de memorie folosite de diverse task-uri i pentru a nu trebui specificat pe tot parcursul unui program o adresa logica de 32 de bii, arhitectura procesoarelor Intel x86 folosete procedeul segmentrii. Astfel, spaiul de memorie este mparit n blocuri de maxim 64 KB n Modul Real (respectiv 1 MB sau 4 GB n Modul Protejat), blocuri numite segmente.

Aceasta permite ca n Modul Real specificarea unei adrese de memorie s se fac prin numai 16 bii, considerai ca fiind poziia locaiei respective de memorie fa de baza segmentului n care se afl. Acesti 16 bii formeaz adresa efectiv sau deplasamentul (offset). Ne vom referi n continuare, dac nu se va specific altfel, numai la Modul Real de funcionare.

Segment n

. .

. .

. .

. .

. . Locaia vizat

Segment 2

Adresa efectiv (AE)

Adresa logica (AL)

Segment 1

Adresa baza segment (ABS)

Figura 3.1 - Adresarea n cadrul unui segment

Blocul de management al memoriei din interiorul procesorului va forma automat o adresa logic de memorie ca n figura 3.1, dup urmtoarea formul general:

AL = AS*16 +AE

unde:

AL este adresa logic (coincide cu adresa fizic, transmis pe magistrala de adrese, dac nu se folosete paginarea).

AS este adresa de segment, coninut n unul din urmtoarele registre:

-CS pentru segmente de coduri de instruciuni

-DS pentru segmente de date

-SS pentru segmente de stiv

-ES pentru extrasegmente

Ea nu coincide cu adresa bazei segmentului , acesta fiind obtinuta prin deplasarea cu 4 bii spre stanga a adresei de segment (inmulire cu 16):

ABS=16*AS

Prin acest procedeu de scriere a dreselor de segment, ele vor avea numai 16 bii, iar adresa bazei segmentului va avea 20 si se obtine automat in unitatea de management a memoriei din interiorul microprocesorului.

AE este adresa efectiv , indicnd poziia n interiorul unui segment, adic deplasamentul fa de baza segmentului. Ea are 16 bii,ceea ce nseamn c un segment are o lungime de maxim 64k (216 locaii).

Convenii :

Orice operand pus ntre paranteze drepte reprezint o adresa de memorie . De exemplu [3A21] reprezint coninutul locaiei de memorie cu adresa efectiv 3A21, iar [BX+DI] reprezint coninutul locaiei de memorie a carei adresa efectiv este dat de suma ntre registrele BX i DI.

Este permis i scrierea RG[const] cau const[RG] unde RG este un registru general iar const este un deplasament (numr sau etichet ) care se adun la coninutul acestui registru. Acest forma este echivalent cu [RG+const], deci scrierea de termeni alaturai are semnificaie de sumare i nu de nmulire.

Exemplu 3.1:

MOV CL,BX[10h]

; ncarc n CL coninutul ;locaiei de memorie a carei adresa efectiv este suma ;ntre coninutul lui BX i constanta 10h, iar adresa de ;segment este coninut n DS.

Instruciunea este echivalent cu forma MOV CL, 10h[BX].

n mod normal, programatorul va specific numai adresa efectiv, dar n cazuri speciale se poate folosi totui i adresa fizic, prin specificarea i a adresei de segment, cu sintaxa:

AF=AS:AE

Exemplul 3.2:

MOV AH,DS:[20h] ;Transfer n AH coninutul

;locaiei 20h din segmentul a crui

;adres este coninut n registrul DS

MOV SS:[BX+10h], CL ;Transfer coninutul lui CL

;n locaia a carei adresa efectiv este

;dat de coninutul lui BX adunat cu 10h,

;din segmentula crui adres este

;coninut n SS.

Modul de lucru:

P 3.1 Se va scrie i se va testa un program care efectueaza urmtoarele:

ncarc constanta 22h n registrul AL

Trimite aceast constant n memorie la adresa BX[20] i la adresa DS:30

Indicaii:

Ambele locaii sunt plasate n segmentul de date i se pot vizualiza n zona Dump din fereastra inferioar a Turbo Debugger.

3.2 Componentele unei adrese efective

Este comod s se lucreze n mod normal cu adrese efective, adresa de segment fiind incrcat de procesor n mod automat din registrul de segment implicit pentru operaia respectiv. Aceasta conduce ns la necesitatea cunoasterii registrelor implicite pentru diversele adresri, registre care vor fi specificate n continuare.

AE se alctuiete dup formula general:

AE = (BX/BP)* + (SI/DI)* + (D8/D16)*

unde:

* indic un termen opional (nu se admite o AE format numai din ultimul termen)

/ separ variantele unui termen

BX i BP sunt registrele de tip baz

SI i DI sunt registrele index ( surs i respectiv destinaie)

D8 i D16 reprezint un deplasament exprimat pe 8, respectiv 16 bii

Deci, adresa efectiv se exprima i sub forma:

Adresa = Baza + Index + Deplasament,

unii dintre aceti termeni fiind opionali.

n funcie de registrele generale folosite n formarea unei adrese, registrele de segment implicite sunt cele din tabelul 3.1.

Registru generalRegistru de segment implicit

SPSS

BPSS

BXDS

SIDS

DIES

BP+SI sau BP+DISS

BX+SI sau BX+DIDS

IPCS

Tabelul 3.1- Registrele de segment implicite la formarea unei adrese

Trebuie s se in seama n permanen de regulile registrelor de segment implicite deoarece asamblorul nu poate semnala erori n cazul utilizarii lor incorecte. De exemplu, dac se dorete citirea unei valori din segmentul de date i se folosete registrul general BP n instruciunea:

MOV CH,[BP+10]

asamblorul consider ca aceasta instruciune este corect i ca intenia programatorului a fost s citeasc din segmentul de stiv (vezi tabelul). Programatorul ar fi trebuit s foloseasca unul din registrele BX sau SI dac dorea citirea din segmentul de date.

Observaie: Asamblorul nu accept AE specificat numai ca o constant numeric, deoarece nu poate ti registrul de segment implicit. De aceea, se vor folosi forme de sumare cu un registru (eventual adus la 0 n prealabil), sau adrese logice . Exemplu: n loc de MOV AL, [3000] se va folosi MOV AL,[BX+3000], dac BX a fost facut 0 n prealabil. Unele asambloare dau ns doar o avertizare i folosesc segmentul de date, indiferent dac aceasta a fost intenia programatorului sau nu.

Modul de lucru:

n programele care urmeaz se va incerca, de cte ori este posibil, s se foloseasc adrese efective, lsnd procesorul s ncarce automat adresa de segment din registrul implicit specificat n tabelul 3.1.

P 3.2. Se va scrie i se va testa un program care efectueaz urmtoarele:

ncarc constanta 22 n registrul AL;

Trimite aceast constant n memorie n segmentul de date la adresa 10 i la adresa 30;

Trimite aceast constant n memorie n segmentul de stiv la adresa 120.

Indicaii:

Primele dou locaii se pot vedea n fereastra Dump, iar ultima n fereastra Stack din dreapta jos a Turbo Debugger.

Pentru a se specific segmentul de stiv, se va folosi adresarea prin registrul BP.

3.3 Transferuri pe 1 octet i pe 2 octei

O locaie de memorie are prin convenie un octet, astfel c ea poate fi operand numai pentru un registru de 8 bii. n cazul n care se fac transferuri cu registre de 2 octei se utilizeaz urmtoarea convenie ("little-endian"): la adresa specificat se afl octetul inferior al registrului dublu, iar la adresa imediat urmtoare octetul superior.

Specificarea lungimii operandului (1 octet sau 2 octei) este sau implicit sau declarat cu prefixele BYTE PTR repectiv WORD PTR .

Exemplul 3.3:

MOV AL, [BX+3000] transfer numai n AL octetul de la adresa 3000 din segmentul de date. Nu este nevoie de prefix deoarece operandul AL este de 8 bii i rezulta implicit un transfer de un octet.

MOV AX, [SI+3000] transfer n AL octetul de la adresa 3000 din segmentul de date i n AH octetul de la adresa 3001 din segmentul de date (ntotdeauna n octetul superior coninutul locaiei de memorie cu adresa mai mare). Nu este nevoie de prefix deoarece operandul AX este de 16 bii i rezult implicit un transfer de doi octei.

ADD word ptr [BX+3000],59 adun la cuvntul (numr de 16 bii) coninut n locaiile 3001 i 3000 din segmentul de date, numrul 59. Dac nu s-ar specific lungimea "word ptr", s-ar face adunarea pe un singur octet ntre coninutul locaiei 3000 i constanta 59.

ADD byte ptr [BP+3000],59 adun la octetul coninut n locaia 3000 din segmentul de stiv, numrul 59, fr vreo influenta asupra locaiei 3001. Dac nu s-ar specifica lungimea, operaia s-ar efectua tot pe un octet, dar asamblorul ar afia totui o avertizare legat de lungimea operanzilor.

Modul de lucru :

Se vor scrie i testa urmtoarele programe, folosindu-se pe cat posibil numai adrese efective:

P 3.3. Program care ncarc n AX constanta 3344 i o trimite n memorie la adresa 20h. Se va observ n ce fel apar octeii acestei constante n memorie.

P 3.4.Trimite n memorie la adresa 20 constanta 1122 i la 30 constanta 44

P 3.5. Program care:

ncarc constanta 33EE n AX

o trimite n memorie la adresa 30

ncarc constanta 22 n AL

adun aceast constant la numrul din locaiile ncarcate anterior cu constanta 33EE.

Indicaii:

Pentru a avea rezultatul adunrii pe 16 bii, va trebui folosit registrul AX, dup ce se ncarc AH cu 00.

n memorie, la adresa DS:30 vor apare octeii 10.34, adic numrul 3410, rezultatul adunrii lui 33EE cu 22.

P 3.6. Program care trimite n memorie la adresa 10 din segmentul de date suma constantelor 44 i 122, fr s se specifice explicit registrul de segment.

Indicaii:

Rezultatul, la adresa 10 trebuie s apar sub forma 66.01.

P 3.7. Acelasi program ca la punctul 3.6 dar se vor folosi adrese logice, fr a implica alte registre generale (se presupune ca nu trebuie modificat coninutul acestora).

Indicaii:

Va fi necesar s se specifice explicit registrul de segment.

3.4 Moduri de adresare

n funcie de termenii folosii n formula general a adresei efective, se definesc urmtoarele moduri de adresare:

1. Adresare imediat la memorie:

Se specific n adresa efectiv numai deplasamentul, care constituie chiar adresa efectiv. Conform observaiei de la paragraful 3.2, este necesar s se specifice i registrul de segment, deci se va scrie de fapt o adresa logic.

Exemplul 3.4:

MOV AX,DS:[54] ;ncarc n AL coninutul locaiei cu adresa efectiv 54 din segmentul de date, iar n AH coninutul locaiei urmtoare

MOV ES:[3AC2],DL;ncarc n locaia cu adresa efectiv 3AC2 din extrasegment coninutul registrului de 8 bii DL

Adresa efectiv poate fi specificat i printr-o etichet (n paranteze drepte i cu specificarea unui segment sau a unui registru general) care a fost declarat anterior. Declararea unei etichete se face cu una din variantele:

etichetaEQU numr

etichetaEQUir

eticheta= numr

Dac se folosete forma cu EQU, se admite pentru asignare i un ir de caractere, n schimb nu se mai poate face alt asignare ulterioar n program. Forma cu = admite reasignri, dar nu permite asignarea cu iruri.

Exemplul 3.5:

adresa1 equ20h

adresa2equ adresa1+2

adresa3=30h

.

.

.

mov AL,DS:[adresa1]; ncarc n AL continutul

;locaiei de memorie de la adresa 20h

;din cadrul segmentului de date

mov SI[adresa2],ch ;ncarc CH n adresa 22h

;din cadrul segmentului de date

mov AH,[BP+adresa3];ncarc n AH de la

;adresa 30h din cadrul segmentului de

;stiv

.

.

.

2. Adresarea direct

n caz c se utilizeaz numele unei locaii declarate n cadrul segmentului de date, nu mai sunt necesare parantezele drepte i un alt registru. Adresa de segment este coninut implicit n DS, dac nu se specific altfel.

Aceasta form este posibil pentru segmentul de date, care poate fi declarat n partea iniial a programului, fr ca programatorul s se preocupe de plasarea sa exact n memorie. Se utilizeaz directive de rezervare a unor locaii de memorie, DB, DW, etc. care vor fi prezentate pe larg mai trziu. Adresa va fi calculat automat de asamblor i nlocuit n instruciune cu valoarea numeric corespunztoare.

Exemplul 3.6:

.model small

.stack 100h

.DATA

locaie

db33,44,55,66 ;Stabilete adresa

;"locaie" la nceputul

;segmentului de date

.code

MOV AX,@dat;ncarc adresa segmentului de date

MOV DS,AX

;n registrul DS

MOV AL,locaie+2;ncarc n AL octetul de la a

;locaia 02 din DS

MOVlocaie+1, byte ptr AL;ncarc n locaia 01

;coninutul lui AL

.

.

.

Se observ c nu este necesar punerea operandului de adresa n paranteze, prin eticheta declarat dup directiva .DATA nelegndu-se implicit coninutul unei locaii de memorie.

Observaie: Instruciunile care urmeaz imediat dup directiva .code din exemplul de mai sus ( cele cu caractere bold) sunt necesare ntotdeauna atunci cnd se declar un segment de date. Asamblorul i linkeditorul plaseaz acest segment acolo unde au memorie liber i adresa acestui segment trebuie incrcat explicit n registrul de segment de date, DS. Cum acest registru nu admite o ncrcare direct cu o constant, aceast adres, cunoscut de asamblor prin simbolul @dat se ncarc nti ntr-un registru general i apoi se transfer n registrul DS. Se poate folosi i forma de referire la o variabil sau constant din segmentul de date (forma nerecomandat totui n astfel de cazuri):

MOV AX, seg locaie

Programul Turbo Debugger, dac are implicit afiata o fereastra Dump, dup rularea instruciunii MOV DS,AX va afia automat zona respectiv cu registrul de segment ES. Pentru a afia chiar segmentul de date, trebuie dat o noua comanda Dump din submeniul View, atunci cnd fereastra CPU este activata (dac nu este, se da un click pe aceasta fereastra). n noua fereastra dump se vor observa datele declarate.

3.Adresare indirect la memorie prin registru.

Se specific n instruciune registrul din care se va lua adresa efectiv. Dup cum rezulta din formula, registrul este unul din urmtoarele: BX,BP,SI,DI.

Exemplul 3.7:

MOV AL, [BX]

;ncarc n AL coninutul ;locaiei de memorie a carei adresa efectiv este ;coninut n BX i adresa de segment coninut n ;registrul implicit DS.

MOV [BP],CX

;ncarc coninutul lui CL n ;locaia de memorie a carei adresa efectiv este ;coninut n BP i adresa de segment coninut n ;registrul implicit SS, iar coninutul lui CH n locaia ;de memorie urmtoare.

Dac nu se specific n adresa i un registru de segment, acesta va fi cel implicit, specificat de tabelul 3.1

4.Adresare indirect la memorie prin registru cu deplasare.

Adresa efectiv este dat de suma registrului i deplasamentului specificate de instruciune. Adresa de segment va fi dat de DS, cu excepia cazului n care se utilizeaza registrul BP, caz n care adresa de segment este dat de SS.

Exemplul 3.8:

MOV AL,[DI+31] ; Transfer n AL coninutul locaiei a carei adresa este dat de coninutul lui DI la care se adun 31, iar adresa de segment este dat de DS.

MOV [BP+1226],CX; Transfer pe CL n locaia a carei adresa este dat de coninutul lui BP la care se aduna 1226, iar adresa de segment este dat de SS, iar CH n locaia urmtoare.

Aceste instruciuni se mai pot scrie i :

MOV AL,31[DI] respectiv

MOV 1226[BP],CX

Modul de adresare prin registru cu deplasare se recomand pentru adresarea elementelor irurilor i tabelelor. De exemplu, dac s-a definit anterior constanta numeric TAB ( de exemplu TAB EQU 2100) se poate adresa elementul de tabel cu numrul coninut n registrul SI printr-o instruciune de genul ADD BX, TAB[SI].

5.Adresare indirect la memorie prin 2 registre.

Adresa efectiv este dat de suma a dou registre specificate de instruciune (una din cele 4 variante posibile conform expresiei generale).

Registrul de segment implicit este DS cu exceptia cazului cnd este menionat BP, n care caz segmentul este cel de stiv, cu adresa coninut n SS.

Modul de adresare prin registru cu deplasare se recomand pentru adresarea elementelor irurilor i tabelelor. De exemplu, dac s-a incrcat anterior constanta numeric TAB ntr-un registru de baza ( de exemplu MOV BX,2100) se poate adresa elementul de tabel cu numrul coninut n registrul SI printr-o instruciune de genul MOV CX,[BX+SI].

Exemplul 3.9:

MOV CL,[BP+SI] sau MOV CL,[BP][SI]

SBB DX,[BX+DI] sau SBB DX,[BX][DI]

6.Adresare indirect la memorie prin 2 registre cu deplasare.

Adresa efectiv este dat de suma a dou registre i un deplasament, toate elementele fiind specificate de instruciune.

Registrul de segment implicit este DS cu exceptia cazului cnd este menionat BP, n care caz segmentul este cel de stiv, cu adresa coninut n SS.

Exemplul 3.10:

MOV CX,[BX+SI+2C]

SUB DX,[BP+SI+2455]

Modul de adresare prin 2 registre cu deplasare se recomand pentru adresarea elementelor matricilor. De exemplu, dac s-a definit anterior constanta numeric MAT ( de exemplu 2100) iar BP conine numrul unei linii nmulit cu numrul total de coloane se poate adresa elementul din linia respectiv avnd indicele (numrul de coloan) coninut n registrul SI, printr-o instruciune de genul:

ADD BX,MAT[BP][SI];echivalent cu ADD BX,[BP+SI+2100]

De exemplu, pentru o matrice cu 5 linii i 6 coloane, care ncepe la adresa 20h, dac se dorete accesarea elememtului al treilea din linia a patra, vom scrie:

MAT=20h

MOV BX, 18

MOV SI,3

MOV CL, MAT[BX+SI]

Modul de lucru

P 3.8. Se va realiza un program care s execute prin adresri imediate urmtoarele operaii:

n CH se va citi (transfer) de la adresa 10 din memoria de date

n DX se va citi de la adresa 11

Se va scrie la adresa 20 constanta 22

Se va scrie la adresa 21 constanta 8877

Se va scrie la adresa 30 coninutul lui CH

Se va scrie la adresa 31 coninutul lui DX

P 3.9. Se va realiza un program care are urmtoarele date iniiale: constantele de un octet A=11 i B=22 i constantele de doi octei C=3344 i D=5566.Se va calcula in BX expresia (C+D)-(A+B).

P 3.10. Se vor ncarca registrele n felul urmtor: AX=2233, CX= 99AA, DL=10 BX=20. Suma dintre AX i CX se va trimite n memorie la adresa format din suma ntre BX i DL iar diferenta lor la adresa imediat urmtoare.

Indicaii:

- AX trebuie salvat nainte de sumare;

-DL nu poate fi adunat direct cu BX i nici nu poate fi folosit la formarea AE.

-n memorie, la adresa DS:0030 va apare irul: DD.BB.89.88

P 3.11. Se vor ncarca registrele n felul urmtor: AX=1122, BX= 3344, CX=5566 i DX=7788. Sa se fac permutarea cicular a acestor registre (AX ia valoarea lui BX, BX a lui CX, CX a lui DX iar DX a lui AX). Se vor folosi pentru stocarea temporar n memorie a unui registru modul imediat, modul direct i modul indirect.

P 3.12. Folosind instrunciunea de adunare a unui registru cu o constant, se vor ncarc 4 locaii succesive de memorie ncepnd de la 10, cu numere cresctoare de un octet, ncepnd cu 1.

P 3.13. Acelasi program ca la punctul 3.12, dar cu numere pe doi octei ncepnd cu 1000.

P 3.14. Acelasi program ca la punctul 3.12, dar cu numere pe un octet multipli de 5.

P 3.15. Acelasi program ca la punctul 3.13, dar cu numere pe doi octei, multipli de 201.

P 3.16. Se va completa ultima varianta de program pentru a se transfer coninutul zonei de memorie de la 10 la 15 ncepnd de la adresa 30 .

Lucrarea de laborator nr. 4

Procedee de transfer cu memoria

Deoarece numrul registrelor de uz general este mic, de multe ori este necesar ca anumite rezultate intermediare sau alte variabile s fie stocate n memorie. Pentru efectuarea de trensferuri cu memoria sunt utilizabile mai multe soluii.

4.1 Transferuri prin adresare la memorie.

n acest caz, adresa efectiv este specificat de program, folosind unul din modurile de adresare prezentate anterior. Metoda va fi folosit atunci cnd se dorete cunoaterea adresei de memorie respective, ea fiind impus de algoritm. De exemplu, dac se dorete scrierea n memoria ecran care ncepe la adresa A000h, adresa efectiv unde se va scrie poate fi specificat explicit de program.

4.2 Transferuri prin stiv

Pentru salvarea n memorie i readucerea din memorie a unor registre se pot folosi instruciunile complementare PUSH rs i POP rd.

Instruciunea PUSH rs:

Mnemonic: PUSH rs:

Efect:

Mai nti, registrul SP este decrementat cu 2. Apoi, coninutul registrului surs dublu rs este trimis n memorie (n stiv) la adresa specificat de registrul SP (stack pointer).

SP SP-2.

[SP] rsL

[SP+1] rsH

POP rd:

Efect:

Mai nti, coninutul registrului destinaie dublu rd este incrcat din memorie (din stiv) de la adresa specificat acum de registrul SP (stack pointer). Apoi, registrul SP este incrementat cu 2.

rdL [SP]

rdH [SP+1]

SP SP+2.

Lucrul cu stiva prin instruciunile PUSH i POP este comod deoarece nu necesit calculul sau specificarea adresei de memorie. Trebuie s se in cont ns de ordinea n care au fost salvate registrele n stiv, astfel ca dac dorim refacerea lor, ncrcarea trebuie facut n ordine invers.

Exemplul 4.1:

.

.

.

PUSH AX;Acum SP=SPiniial-2.

;Salveaz AX la [SPiniial -2].

PUSH BX;Salveaz BX la [SPiniial-4]

.

;Alte instruciuni

.

;pe parcursul carora SP=SPiniial- 4

.

POP BX;Readuce BX de la[SPiniial-4].

;Acum SP=SPiniial-2.

POP AX;Readuce AX de la [SPiniial-2].

;Acum SP=SPiniial.

.

.

.

Uneori poate fi alterat n mod voit ordinea invers, pentru a se folosi alt registru destinaie dect cel care a fost iniial surs:

Exemplul 4.2:

.

.

.

PUSH AX;Salveaz AX la [SP].Acum SP=SPiniial-2

.

;Alte instruciuni

.

;pe parcursul carora SP=SPiniial- 2

.

POP BX;Acum SP=SPiniial. Readuce n BX de la

;[SPiniial], ceea ce a fost nainte n

;AX

.

.

.

Modul de lucru

P 4.1. Se vor ncarca registrele n felul urmtor: AX=1122, BX= 3344, CX=5566 i DX=7788. Sa se fac permutarea cicular a acestor registre (AX ia valoarea lui BX, BX a lui CX, CX a lui DX iar DX a lui AX). Se vor folosi numai instruciuni PUSH i POP (se va observ evoluia stivei i a SP n partea din dreapta mijoc a TD) .

Indicaie:

Se va folosi un registru suplimentar pentru a memora temporar coninutul unuia dintre registrele specificate.

4.3 Transferul prin iniializarea/rezervarea de locaii de catre asamblor

n cazul n care nu este necesar o adres anume de memorie, variabila putnd fi stocat acolo unde exist loc liber, nu mai este necesar specificarea explicit a adresi efective. Se va folosi o directiv de asamblare de tip DB pentru rezervarea unei locaii de 1 octet sau DW pentru rezervarea unei locaii de 2 octei (vezi anexa 1 - Directive de asamblare).

De regul, se va defini mai nti un segment de date, cu directiva:

.DATA

i aici se pot plasa directive de tip DB sau DW.

Exemplul 4.3:

.Radix 16

.Model small

.Stack 100h

.DATA

variabila1 DB ?

variabila2 DB 3F

variabila3 DW ?

sir1

DB 10 DUP(1A)

.Code

start:

mov ax,@dat

;ncarc adresa

;segmentului

mov ds,ax

;de date n DS

mov al,variabila2;ncarc n AL constanta

;3Fh

add al, 55h ;Aduna cu 55h

mov varibila1,al;Depune octetul din AL n

;memorie la adresa

;variabila1

mov ah,variabila2;Aduce i n AH constanta

;3Fh

mov variabila3,ax;Depune cuvntul din AX

;n memorie la adresa

;variabila3

term: jmp temp

endstart

Referirea n program a locaiei se face prin numele asignat n stnga directivei. Se observ c dac se dorete iniializarea locaiei, se va specific constanta care trebuie s fie iniial acolo, iar dac nu, se va folosi simbolul "?".

Se pot iniializa mai multe locaii cu directiva DB sau DW, valorile respective fiind separate prin virgule.

Exemplul 4.4:

numere1DW23A4h,0BC56h,96h ;Declar 4 numere

;de 2 octei

caractereDB'F','2','7' ;Declar 3

;caractere de un octet

const1DB21,0A2h,'L' ;Declar 3 valori

;diverse

De asemenea, se pot iniializa sau rezerva un numr de n locaii cu formularea n DUP(const) sau respectiv n DUP(?) ca n exemplul de mai sus pentru constanta IR.

Observaie: Cum s-a aratat i n lucrarea precedenta, instruciunile care urmeaz imediat dup directiva .code (cele cu caractere bold in exemplul 4.3), sunt necesare ntotdeauna atunci cnd se declar un segment de date. Asamblorul i linkeditorul plaseaz acest segment acolo unde au memorie libera i adresa acestui segment trebuie incrcat explicit n registrul de segment de date, DS.

Dup rularea instruciunii MOV DS,AX programul Turbo Debugger, dac are implicit afiata o fereastra Dump, va afia automat zona respectiv cu registrul de segment ES, aceasta zona nefiind cea de date. Pentru a afia chiar segmentul de date, trebuie dat o noua comanda Dump din submeniul View dup rularea acestei instruciuni atunci cnd fereastra CPU este activata (dac nu este, se da un click pe aceasta fereastra). n noua fereastra dump se vor observ datele declarate.

Modul de lucru

P 4.2. Se va rula programul din exemplul precedent i se va observa evoluia registrelor i a zonei de memorie de date.

P 4.3. Se vor declara n segmentul de date irul de cuvintele 1122, 3344 i 5566 i se vor transfera n alte trei locaii rezervate (n locaii consecutive variabilelor declarate iniial).

Observaii:

Se vor folosi directive DW, deci adresa locaiei 3344 este surs+2, etc. Pentru locaiile de destinaie se poate folosi o directiva de tipul:

destDW 3 DUP(?)

P 4.4. Se va declara n segmentul de date un ir de 10 numere cresctoare de un octet, ncepnd cu 1, i se va inversa coninutul primei locaii cu ultima i a celei de a doua cu penultima.

4.4 Instruciunea de translatare a unei adrese, XLAT

Dac n memorie este definit un ir sau o tabel a crei adres este specificat de BX , se poate face ncrcarea n AL a valorii coninute n locaia de memorie [BX+AL], adic a locaiei cu indexul dat chiar de AL n acea tabel.

Atenie: Indexarea incepe de la 0.

Formatul instruciunii este:

XLAT

Aciune:

AL [BX+AL]

Exemplul 4.5:

.

.

.

mov bx, 1200h

mov al,5

xlat; n AL va apare coninutul locaiei de memorie

;1205h adic al locaiei cu numrul 5 din tabel, TABELA5

.

.

.

Modul de lucru

P 4.5. Se va scrie un program care s aduc n DL coninutul locaiei cu indexul 5 dintr-o tabel care ncepe la adresa 10 din segmentul de date i n DH coninutul locaiei cu indexul 8 din acea tabel. Se va folosi instruciunea XLAT.

4.5 Instruciuni de transfer pentru registrul de flaguri

Verificarea/modificarea individual sau n bloc a flagurilor se poate face prin transferul ntre registrul AH i registrul de flaguri folosind urmtoarele instruciuni:

LAHF

Aciune: ncarc flagurile din registrul de flaguri n AH.

AH7=SF (flagul de semn, 1 dac este minus, 0 dac este plus);

AH6=ZF (flagul de zero, 1 dac este 0, 0 dac nu este 0);

AH5=0;

AH4=AF (flagul de transport auxiliar de la cei 4 bii inferiori ai unui rezultat);

AH3=0 ;

AH2=PF (flagul de paritate, 1 dac este par, 0 dac este impar);

AH1=IF (flagul de ntreruperi, 1 dac dac ntreruperile sunt activate, 0 dac nu);

AH0=CF (flagul de transport 1 dac exist transport de la rezultat);

SAHF

Aciune: Salveaz flagurile AH n registrul de flaguri.

SF=AH7 (flagul de semn, 1 dac este minus, 0 dac este plus);

ZF=AH6 (flagul de zero, 1 dac este rezultatu 0, 0 dac nu este 0);

AF= AH4 (flagul de transport auxiliar de la cei 4 bii inferiori ai unui rezultat);

PF=AH2 (flagul de paritate, 1 dac este par, 0 dac este impar);

IF= AH1 (flagul de ntreruperi, 1 dac dac ntreruperile sunt activate, 0 dac nu);

CF=AH0 (flagul de transport 1 dac exist transport de la rezultat);

Biii AH5 i AH3 trebuie s fie 0.

4.6 ncrcarea unei adrese logice din memorie

Dac n memorie la adresa nn se afl un pointer (ca o adres logic de 32 de bii), ea poate fi adus ntr-o pereche format dintr-un registru de segment i un registru de 16 bii, folosind instruciunile LGS/LSS/LDS/LES/LFS.

Sintaxa: LDS r16,RS:nn

LSS r16,RS:nn

etc.

Aciune:

LDS r16,nn: R16L[RS:nn], R16H[RS:nn+1], DSL[RS:nn+2], DSH[RS:nn+3]

LSS r16,nn: R16L[RS:nn], R16H[RS:nn+1], SSL[RS:nn+2], SSH [RS:nn+3]

LES r16,nn: R16L[RS:nn], R16H[RS:nn+1], ESL[RS:nn+2], DEH[RS:nn+3]

LFS r16,nn: R16L[RS:nn], R16H[RS:nn+1], FSL[RS:nn+2], FSH[RS:nn+3]

LGS r16,nn: R16L[RS:nn], R16H[RS:nn+1], GSL[RS:nn+2], GSH[RS:nn+3]

unde r16 este un registru de 16 bii de uz general, RS este un registru de segment (DS,SS,ES,FS sau GS) iar nn este un numr de 16 bii.

Observaii:

Instruciunile LSS, LGS, LFS nu apar la procesoare anterioare lui 80386 (nici nu existau registrele de segment FS i GS), de aceea, n cazul folosirii lor, n partea iniial a programului trebuie introdus directiva .386. Cu specificarea directivei .386, se poate folosi n al doilea operand i un numr nnnn (de 32 de bii).

Modul de lucru

P 4.6. S se scrie un program care s aduc n perechea ES:AX coninutul a patru locaii de memorie a caror adres de nceput este dat de DS+10h. Se va folosi instruciunea LES.

4.7 ncrcarea unei adrese efective

Atunci cnd trebuie specificat o adres care a fost calculat de asamblor i nu este cunoscut numeric, se poate folosi instruciunea LEA (Load Effective Adress):

Sintaxa: LEA r16, m16

Aciune: r16 m16

Exemplul 4.6:

.radix 16

.model small

.stack 100h

.DATA

sir1db 13,14,15,1,2,3

sir2db 16,17,18,19

.code

start: mov ax,@dat;Adresa segmentului de date

mov ds,ax

;se ncarc n DS

lea di,sir2;n DI se va afl offset-ul

;irului notat "sir2"(n acest caz 06),

;n memoria de date

mov al,[di+2];Transfer din a treia locaie

;a acestui ir n AL

Observaii:

Pentru transferurile care implic segmentul de date vor fi folosite ca registre destinaie la instruciunea LEA numai registrele BX, SI i DI i nu va fi folosit BP.

Instruciunea LEA rd, adresa_efectiv poate fi inlocuit n majoritatea cazurilor cu instruciunea MOV rd,OFFSET adresa_efectiv, lsnd astfel asamblorul s calculeze i s ncarce valoarea corect a adresei efective n registrul dorit. Sunt situaii ns cnd instruciunea LEA este mai eficient (de exemplu la lucrul cu directive de grupare).

P 4.7. S se scrie un program care s inverseze al treilea element al primului ir declarat ca n exemplul 4.6 cu elementul al patrulea al celui de-al doilea ir. Se va folosi instruciunea LEA.

Lucrarea de laborator nr. 5

Operaii aritmetice

Exist urmtoarele tipuri de operaii efectuate de ALU:

aritmetice;

logice;

deplasri i rotaii;

Toate acestea afecteaz corespunztor unul sau mai muli din urmtorii indicatori de condiii:

CF (Carry Flag) - indicator de transport -reflect transportul n exterior al bitului cel mai semnificativ al rezultatului operaiilor aritmetice.Acest indicator poate fi folosit n cazul adunrii sau scderii numerelor pe mai muli octei, semnificind n primul caz transport la adunare i n al doilea caz mprumut la scdere. Indicatorul CF nu este modificat de instruciuni de incrementare i decrementare.

PF (Parity Flag) -indicator de paritate - este poziionat pe 1 dac rezultatul are un numr par de bii 1.

AF (Auxiliary Carry Flag) - indicator de transport auxiliar - este poziionat n 1 dac a fost transport de la nivelul inferior la nivelul superior al octetului rezultatului (de la bitul 3 la bitul 4). Acest indicator se folosete n programele de calcule n aritmetic zecimal.

ZF (Zero Flag) - indicatorul de zero - este poziionat n 1 dac rezultatul operaiei a fost zero.

SF (Sign) indicatorul de semn - este poziionat n 1 dac cel mai semnificativ bit al rezultatului (MSB) este 1, adic dac n reprezentarea numerelor n complement fa de 2 rezultatul este negativ.

OF (Overflow Flag) - Indicator de depire aritmetic (a gamei de valori posibil de reprezentat) - este poziionat n 1 dac dimensiunea rezultatului depete capacitatea locaiei de destinaie i a fost pierdut un bit (la valorile cu semn se altereaz semnul).

5.1 Reprezentarea n complement fa de 2

Toate structurile algebrice presupun existena unui element simetric fa de operaia de adunare, definit prin relatia:

numr+simetric =0

n notaia zecimala obisnuita, avem de exemplu:

1 are simetric pe 1 deoarece suma lor da 0

2 are simetric pe 2 deoarece suma lor da 0

etc.

n binar se poate face o notaie fr a specific separat semnul, dac se consider cuvinte de o lungime fixa, L. Astfel, de exemplu dac L=4, putem spune ca 1 are ca simetric numrul binar 1111=F, deoarece

1+F= 0001+1111=0000 plus un transport (care ns nu mai ncape n numrul de L=4 bii).

Similar:

0010 are ca simetric 1110 deoarece suma lor d 0000. Deci E = -2

0011 are ca simetric 1101 deoarece suma lor d 0000. Deci D = -3

0100 are ca simetric 1100 deoarece suma lor d 0000. Deci C = -4

0101 are ca simetric 1011 deoarece suma lor d 0000. Deci B = -5

etc.

Dac L=8, putem spune ca 1 are ca simetric numrul binar 1111.1111=FF, deoarece

1+FF= 0000.0001+1111.1111=0000.0000 plus un transport (care ns nu mai incape n numrul de L=8 bii).

Similar:

0000.0010 are ca simetric 1111.1110 deoarece suma lor d 0000.0000.

Deci FE = -2

0000.0011 are ca simetric 1111.1101 deoarece suma lor d 0000.0000.

Deci FD = -3

0000.0100 are ca simetric 1111.1100 deoarece suma lor d 0000.0000.

Deci FC = -4

0000.0101 are ca simetric 1111.1011 deoarece suma lor d 0000.0000.

Deci FB = -5

etc.

Aceast reprezentare se numete reprezentarea n complement fa de 2, deoarece numrul simetric este egal cu cel iniial sczut din 2L.

Se poate arata c complementul fa de 2 se obine prin negarea biilor numrului i adunarea unui 1.

n limbaj de asamblare, complementul fa de 2 al unui numr (negativul acelui numr) se obine cu instruciunea NEG (vezi mai jos descrierea instruciunii).

5.2 Prezentarea instruciunilor aritmetice

ADD dst,src - Adunare

Aciune: dst = dst + src;

Operanzi: dst: r8, r16, r32, m8, m16, m32

src: r8, r16, r32, m8, m16, m32, n, nn, nnnn

ADC dst,src - Adunare cu carry (transport)

Aciune: dst = dst + src +CF;

Operanzi: dst: r8, r16, r32, m8, m16, m32

src: r8, r16, r32, m8, m16, m32, n, nn, nnnn

INC dst -Incrementare

Aciune:dst = dst + 1

Operand:r8, r16, r32, m8, m16, m32

SUB dst,src - Scdere

Aciune: dst = dst - src;

Operanzi: dst: r8, r16, r32, m8, m16, m32

src: r8, r16, r32, m8, m16, m32, n, nn, nnnn

Exemplul 5.1:

mov al,33h;Desc zutul

mov bl,44h;este mai mic decat scztorul

sub al,bl ;rezultatul n AL va fi negativ,0EFh

;i va apare i CARRY

SBB dst,src - Scdere cu borrow (mprumut)

Aciune: dst = dst - src - CF;

Operanzi: dst: r8, r16, r32, m8, m16, m32

src: r8, r16, r32, m8, m16, m32, n, nn, nnnn

Exemplul 5.2:

mov al,33

mov bl,44

sub al,bl ;La aceast scdere apare mprumut

sbb cl,al ;Acesta e luat n consideraie aici

DEC dst -Decrementare

Aciune:dst = dst + 1

Operand:r8, r16, r32, m8, m16, m32

NEG dst-Negare aritmetica

Aciune:dst = - dst ( se obine complementul fa de doi)

Operand:r8, r16, r32, m8, m16, m32

Descriere: Instruciunea NEG genereaza complementul fa de 2 al opernadului adic numrul respectiv cu semn schimbat. CF este setat automat, cu excepia cazului cnd Operandul este 0.

Exemplul 5.3:

mov al,0EFh;In complement fata de 2 este negativ

neg al;Se schimba semnul si rezulta 11

NOT dst -Complementare fa de 1.

Aciune: dst 0FFh - dst ; pentru Operand de 8 bii

dst 0FFFFh - dst ; pentru Operand de 16 bii

dst 0FFFFFFFFh - dst ; pentru Operand de 32 bii

Operand:r8, r16, r32, m8, m16, m32

Descriere: Instruciunea NOT inverseaz operandul; orice 1 devine 0 i viceversa. Nu sunt afectai indicatorii de condiii.

CMP dst,src-Comparaie aritmetic (prin scdere)

Aciune:dst-src;fr generare rezultat - modifica doar indicatorii de condiii.

Operanzi: dst: r8, r16, r32, m8, m16, m32

src: r8, r16, r32, m8, m16, m32, n, nn, nnnn

MUL src - nmulirea fr semn lui AL, AX sau EAX cu un numr.

Aciunea depinde de marimea Operandului src, lund urmtoarele forme:

- src de 8 bii: AX AL * src8; src: r8,m8

Dac AH = 0 atunci CF 0; n celelalte cazuri CF 1 i

OF CF

-src de 16 bii: DX: AX AX * src16; src: r16,m16

Dac DX = 0 atunci CF 0; n celelalte cazuri CF 1 i

OF CF

- src de 32 bii: EDX: EAX EAX * src32; src: r32,m32

Dac EDX = 0 atunci CF 0; n celelalte cazuri CF 1 i

OF CF

Exemplul 5.4:

mul bl; Se inmulteste AL cu BL (8 bii) iar

;rezultatul este in AX

mul cx; Se inmulteste AX cu CX iar rezultatul

;este n DX (octeii superiori) i AX

;(ocetii inferiori)

IMUL (dst,)src - nmulirea cu semn a lui AL, AX, EAX sau a altui registru cu un numr.

Aciunea depinde de Operandul destinaie i de mrimea Operandului src.

n cazul n care destinatia este acumulatorul AL,AX sau EAX se obine rezultatul complet, chiar dac apare flagul Overflow, deoarece rezultatul va fi memorat cu precizie dubl fa de a operanzilor:

-src de 8 bii: AX AL * src8; src: r8,m8

Dac AH = 0 sau AH = FF atunci CF 0; n celelalte cazuri CF 1 i

OF CF

- src de 16 bii: DX: AX AX * src16; src: r16,m16

Dac DX = 0 sau AH = FF atunci CF 0; n celelalte cazuri CF 1 i

OF CF

- src de 32 bii: EDX: EAX EAX * src32; src: r32,m32

Dac EDX = 0 sau AH = FF atunci CF 0; n celelalte cazuri CF 1 i

OF CF

Spre deosebire de nmulirea numerelor fr semn (cu instruciunea MUL), n cazul instruciunii IMUL este posibil ca denmulitul s fie i alt registru n afar de acumulator, iar sursa poate s fie o valoare numeric imediat. n acest caz ns, dac rezultatul are mai muli bii dect registrul care conine denmulitul, se pierd biii care depaesc lrgimea acestuia. Aciunea este urmtoarea:

- IMUL dst,src

dst dst * src; (dst= r16; src=r16/m16 /imm8/imm16)

Dac DX = 0 sau AH = FF atunci CF 0; n celelalte cazuri CF 1 i

OF CF

Dac src este de tip imm8, acesta se extinde cu semn pn la lungimea dst.

- IMUL dst,src

dst dst * src; (dst= r32; src=r32/m32 /imm8/imm32)

Dac DX = 0 sau AH = FF atunci CF 0; n celelalte cazuri CF 1 i

OF CF

Dac src este de tip imm8, acesta se extinde cu semn pn la lungimea dst

DIV src - mprirea fr semn a acumulatorului cu un registru sau locaie de memorie.

Aciune: - dac src este de 8 bii:

AL AX/src8; (ctul mpririi)

AL AX % src8 (restul mpririi)

src: r8,m8.

- dac src este de 16 bii:

AX DX : AX/srcl6; (ctul mpririi)

DX DX : AX % srcl6 (restul mpririi)

src: r16,m16.

- dac src este de 32 bii:

EAX EDX : EAX/srcl6; (ctul mpririi)

EDX EDX : EAX % srcl6 (restul mpririi)

src: r32,m32.

Observaii: Dac rezultatul (catul) nu incape n registrul destinaie AL, AX respectiv EAX, sau impartitorul este 0, se genereaza ntrerupere 0 (DE - Divide Error) i se sare automat din program. De aceea trebuie facuta o evaluare prealabila a domeniului de valori ale rezultatului i trebuie folosit un registru destinaie corespunztor.

Dac ctul este subunitar, el este ajustat la 0.

Indicatorii de condiii sunt nedefinii.

Exemplul 5.5:

mov ax, 0F0h

mov cl,10

div cl; Se imparte AX la CL(8bii). Ctul este in AL iar restul in AH

Exemplul 5.6:

mov ax, 0F0h

mov cl,5

div cl; Se imparte AX la CL (8bii). Ctul este mai

;mare decat dect FF si apare eroare

;(intreruperea 0).

Corect ar fi fost:

mov ax,0F0h

mov cl,5

mov dx,0 ; Se pregateste ca deimpartitul sa fie in

;perechea DX:AX

mov ch,0; Se pregateste ca impartitorul sa fie in CX

div cx; Impartire pe 16 bii, deci ctul va fi in

;AX iar restul in DX

IDIV src - mprirea cu semn a acumulatorului cu un registru sau locaie de memorie.

Aciune: - dac src este de 8 bii:

AL AX/src8; (ctul mpririi, cu semn)

AL AX % src8 (restul mpririi,cu semn)

src: r8,m8.

- dac src este de 16 bii:

AX DX : AX/srcl6; (ctul mpririi,cu semn)

DX DX : AX % srcl6 (restul mpririi,cu semn)

src: r16,m16.

- dac src este de 32 bii:

EAX EDX : EAX/srcl6; (ctul mpririi,cu semn)

EDX EDX : EAX % srcl6 (restul mpririi,cu semn)

src: r32,m32.

Observaie: Dac rezultatul (ctul) nu ncape n registrul destinaie AL, AX respectiv EAX, sau mpritorul este 0, se genereaz ntreruperea 0 (DE - Divide Error) i se sare automat din program. De aceea trebuie facut o evaluare prealabil a domeniului de valori ale rezultatului i trebuie folosit un registru destinaie corespunztor.

Dac ctul este subunitar, el este ajustat la 0.

Semnul restului este acelai cu al mpritorului.

Indicatorii de condiii sunt nedefinii.

CBW

- Conversie de la Byte (8 bii) la Word (16 bii) cu pstrare semn.Aciune:AL 7 = 0 => AH =0;

AL 7 = 1 => AH =0FF;

CWD

- Conversie de la Word (16 bii) la Dword (32 bii) cu pstrare semn.Aciune: AX 15 = 0 => DX =0;

AL 15 = 1 => DX =0FFFF;

Modul de lucru

P 5.1 S se scrie un program care s ncarce constantele 11,10,33 i 44 hexa n AL, BX, CL, respectiv DL, constanta 99h n memorie la adresa indicat de BX, apoi s adune coninutul registrelor AL,CL i DL ,s scad rezultatul din memorie de la adresa coninut n BX i s memoreze rezultatul final la adresa de memorie urmtoare.

Indicaii:

Cnd se transfer un numr de un octet cu memoria, el trebuie precedat de prefixul byte ptr.

P 5.2 Acelai program ca la punctul 1, dar coninutul registrelor va fi 1122, 10, 3344, 5566 iar n memorie [BX]=AABB.

Indicaii:Cnd se transfer un numr de doi octei cu memoria, i octetul cel mai semnificativ este 00 sau lipsete, el trebuie precedat de prefixul word ptr. Dac octetul cel mai semnificativ este diferit de 00, prefixul respectiv poate fi omis, el subinelegndu-se.

Constantele care ncep cu o liter trebuie precedate de cifra 0. Dac se i termin cu o liter trebuie urmate de sufixul H.

n final, n memorie ncepnd de la adresa 10 trebuie s fie octeii: EF.10.EF.10.

P 5.3 S se scrie un program care s ncarce constantele 9, 19 i 29 n AL, BL respectiv CL S se incrementeze coninuturile acestor registre i s se nmuleasc apoi ntre ele. Se va verifica rezultatul cu aplicaia Calculator.

Indicaii:

Atunci cnd denmulitul este (sau poate fi) de doi octei, nmulirea trebuie facuta cu un nmulitor care ocup un registru de 16 bii, chiar dac nmulitorul este de numai 8 bii.

n final, n AX trebuie s fie rezultatul 2AA8.

P 5.4 Se vor ncarca registrele n felul urmtor: BX=1122, DX=22 i CX=5566. Sa se nmuleasc aceste registre ntre ele iar rezultatul s se trimit n memorie la adresa 20h.

Indicaii:

Algoritmul poate fi urmtorul:

11.22*55.66*22 = 05.B7.1D.8C*22 = 1D.8C*22+10000*05.B7*22 = C251.EC98

Coninutul unora dintre registre va trebui salvat n memorie.

P 5.5 Sa se ncarce n CX , BL i DL numerele 6655, 44 respectiv 22 s se mparta CX la BL , ctul fiind apoi nmulit cu DL i adunat cu restul.

Indicaii:

Coninutul unora dintre registre va trebui salvat n memorie.

Imprirea va avea un rezultat mai mare de 8 bii, deci trebuie ca dempritul s fie format din DX i AX. Pentru aceasta, DX va fi fcut 0 iar mpritorul va fi BX (cu BH=0).

Adunarea final trebuie fcut pe 4 octei, deci dup ce se va face o prima adunare pe 16 bii pentru octeii mai puin semnificativi, se va anula un registru i se va aduna cu CARRY la cei 16 bii mai semnificativi.

Lucrarea de laborator nr. 6

Operaii logice, deplasri i rotaii

6.1. Operaii logice

Operanzii n modul real sunt aceiai ca la operaiile aritmetice obinuite:

dst:r8,r16,r32,m8,m16,m32;

src:r8,r16,r32,m8,m16,m32,n,nn,nnnn.

NOTdst - Complementare fa de 1 a fiecrui bit din Operandul destinaie, dstn .

Aciune:dstn 1-dstn .

Operanzi:dst.

Descriere:Instruciunea NOT inverseaz biii Operandului; orice 1 devine 0 i viceversa. S-a notat dstn bitul n al operandului destinaie.

ANDdst,src -SI logic pe bit.

Aciune:dstn (srcn)SI (dstn).

Operanzi:dst,src.

Descriere:Un bit al rezultatului instruciunii AND este un 1 dac ambii bii corespunztori ai operanzilor sunt 1; altminteri, bitul devine 0. S-a notat cu srcn i dstn bitul n al operandului surs, respectiv destinaie. Rezultatul nlocuiete primul operand.

TESTdst,src -Testare (SI fr generare de rezultat).

Aciune:(srcn)SI (dstn).

Operanzi:dst,src.

Descriere: Instruciunea TEST calculeaza SI logic pe bit ntre cei doi operanzi. Un bit al rezultatului este 1 dac ambii bii corespunztori ai operanzilor sunt 1; altminteri, bitul este 0. Rezultatul operaiei este sters i doar flagurile sunt modificate. S-a notat cu srcn i dstn bitul n al operandului surs, respectiv destinaie.

ORdst,src -SAU logic pe bit.

Aciune:dstn (srcn)SAU (dstn).

Operanzi:dst,src.

Descriere:Instruciunea OR calculeaza SAU pe bit ntre cei doi operanzi i rezultatul este plasat n primul operand. Un bit al rezultatului este 0 dac ambii bii corespunztori ai operanzilor sunt 0; altminteri, bitul este 1. Rezultatul nlocuiete primul operand.

XORdst src -SAU EXCLUSIV logic pe bit.

Aciune:dstn (srcn) XOR (dstn).

Operanzi:dst,src.

Descriere:Instruciunea XOR calculeaza SAU EXCLUSIV pe bit ntre cei doi operanzi. Un bit al rezultatului este 1 dac biii corespunztori ai operanzilor sunt diferii; bitul rezultatului este 0 dac biii corespunztori sunt identici. Rezultatul nlocuiete primul operand.

6.2. Deplasri i rotaii

SHLdst,[nr]-Deplasare logic spre stnga cu nr poziii (numere fr semn).

Aciune:

C MSB LSB

Operanzi:-dst;

-[nr]: 1, CL,imm8.

Descriere: Operandul src este nmulit cu 2 de [nr] ori.

Exemple:

SHL al,1 -deplaseaz spre stnga AL cu 1 bit;

SHL al,cl -deplaseaza spre stnga AL cu un numr de bii egal cu coninutul lui CL.

SHRdst,[nr]-Deplasare logic spre dreapta cu nr poziii (numere fr semn).

Aciune:

MSB LSB C

Operanzi:-dst;

-[nr]: 1, CL,imm8.

Descriere: Operandul src este impartit cu 2 de [nr] ori.

SALsrc,[nr]-Deplasare aritmetic spre stnga cu nr poziii (numere cu semn).

Aciune:

C MSB LSB

Operanzi:-dst;

-[nr]: 1, CL,imm8.

Descriere: Operandul src cu semn este nmulit cu 2 de [nr] ori.

SARsrc,[nr]-Deplasare aritmetica spre dreapta cu nr pozitii (numere cu semn)

Aciune:

MSB LSB C

Operanzi:-dst.

-[nr]: 1, CL,imm8.

Descriere: Operandul src cu semn este mprit cu 2 de [nr] ori.

ROLsrc,[nr]-Rotaie prin Carry spre stnga cu [nr] poziii

Aciune:

C MSB LSB

Operanzi:-dst;

-[nr]: 1, CL,imm8.

RORsrc,[nr]-Rotatie prin carry spre dreapta cu [nr] poziii

Aciune:

MSB LSB C

Operanzi:-dst;

-[nr]: 1, CL,imm8.

RCLsrc,[nr]-Rotatie cu carry spre stnga cu [nr] poziii

Aciune:

C MSB LSB

Operanzi:-dst;

-[nr]: 1, CL,imm8.

RCRsrc,[nr]-Rotatie cu carry spre dreapta cu [nr] pozitii

Aciune:

MSB LSB C

Operanzi:-dst;

-[nr]: 1, CL,imm8.

Descriere: Fiecare instruciune de rotaie deplaseaz biii operandului de registru sau memorie dat. Instruciunile de rotaie spre stnga deplaseaz toti biii ctre poziia cea mai semnificativ (catre MSB) ,exceptnd bitul din poziia cea mai semnificativ, care este mutat n poziia cea mai puin semnificativa (LSB). Instruciunile de rotaie spre dreapta acioneaz invers: biii sunt deplasai ctre poziia cea mai puin semnificativ iar bitul din poziia cea mai puin semnificativ ajunge n poziia cea mai semnificativ.

Pentru instruciunile RCL i RCR, flagul CF este o parte a cantitii rotite. Instruciunea RCL deplaseaz flagul CF n bitul cel mai puin semnificativ i cel mai semnificativ bit n flagul CF; instruciunea RCR deplaseaza flagul CF n bitul cel mai semnificativ i bitul cel mai puin semnificativ n flagul CF. La instruciunile ROL i ROR, valoarea flagului CF nu este parte a rezultatului, dar flagul CF recepioneaz o copie a bitului care a fost deplasat de la un capt la altul.

n modul real sau virtual 8086, rotaia este repetata de un numr de ori indicat de al doilea operand, care este unu sau coninutul registrului CL.De la procesoare I-386 n sus, operandul al doilea poate fi i o constant imediat.

Flagul OF este definit numai pentru forme cu o singura rotaie ale instruciunilor (al doilea operand este un 1). Este nedefinit n toate celelalte cazuri. Pentru deplasri/rotiri spre stnga, bitul CF de dup deplasare este sau-exclusivat cu bitul rezultat de cel mai nalt ordin. Pentru deplasri/rotiri spre dreapta, cei doi bii cu cel mai nalt ordin ai rezultatului sunt sau-exclusivai spre a rezulta flagul OF.

Observaie: Dei microprocesoarele sub I-386 admit deplasarea numai cu un bit sau cu numrul contiinut de CL, unele asambloare admit i un operand numeric mai mare de 1 ca al doilea operand. Astfel, n TASM sunt admise forme ca:

SHL BP,8

SHL DX,6

SHR AL,2

.

.

.

Dup asamblare i linkeditare, n programul obiect apar ns n mod corect 8 instruciuni SHL BP,1 sau 6 instruciuni SHL DX,1 s.a.m.d.

Cu directiva .386 sunt admise direct i deplasri cu imm8.

6.3. Operaii aritmetice BCD (opional, vezi Anexa 1)

AAA

-Ajustare AL dup adunare (BCD despachetat).

AAS

-Ajustare AL dup scdere (BCD despachetat).

DAA

-Ajustare AL dup adunare (BCD inpachetat).

DAS

-Ajustare AL dup scdere (BCD impachetat).

AAM

-Ajustare AL dup nmulire.

AAD

-Ajustare AL nainte de mprire.

4.Modul de lucru

Iniial, n partea de nceput a programelor urmtoare, registrele i memoria vor fi ncrcate astfel: AX=1122h, Bx=10h, CX=3344h, DX=5566, [BX]=99AAh, BP= 77h.

P 6.1 S se scrie un program care s transforme n 0 biii lui AX=0EEEEh cu excepia biilor 0..3. Aceast operaie va fi denumit n continuare Mascare a biilor 4..15. Rezultatul mascrii va fi memorat n DX iar AX va trebui s rmn la valoarea iniial.

P 6.2 S se scrie un program care s transforme n 1 biii lui AX=0EEEEh cu excepia biior 4...7. Rezultatul acestei mascari va fi memorat n DX iar AX va trebui s ramn la valoarea iniial.

P 6.3 S se scrie un program care s copieze biii 2 i 3 ai lui BL=0A6h n aceleasi pozitii din CL=1Fh, lasind restul biilor lui CL neschimbati.

P 6.4 S se scrie un program care s ncarce n 4 locaii consecutive din memorie, ncepnd de la adresa 10h , cei 4 bii inferiori ai lui DL=05 (bitul 0 n prima locaie, bitul 1 n a doua locaie, .a.m.d.).

P 6.5 S se scrie un program care s inverseze semioctetul superior al lui BL=12h cu cel inferior al lui CH=56h, pastrnd ordinea biilor.

P 6.6 S se scrie un program care s anuleze n CL=25h biii care sunt identici cu cei omologi din DH=55h.

P 6.7 S se scrie un program care s seteze n CL=25h biii care sunt identici cu cei omologi din DH=55h.

P 6.8 S se scrie un program care s nmuleasc cu 320 coninutul registrului BP, folosind deplasri spre stnga. Aceast operaie este necesar pentru calculul adresei unui punct din memoria ecran n modul grafic 320 x 200 i va fi folosit frecvent n programele de afiare grafic. Rezultatul pentru BP=77h va trebui s fie 94C0h.

Indicaii: Se va ine seama c 320=256+64 adic 320 = 28 + 26 . Prin urmare, se va face o copie a lui BP n alt registru apoi se vor deplasa spre stnga cele dou registre cu 8 respectiv cu 6 poziii i se vor aduna.

P 6.9 Se va scrie un program care s faca nmulirea cu 640 a coninutului registrului BP folosind deplasri spre stnga. Aceasta operaie este necesar pentru calculul adresei unui punct din memoria ecran n modul grafic 640 x 480 i se folosete frecvent n programele de afiare grafica. Rezultatul pentru BP=33h va trebui s fie 7F80h.

Lucrarea de laborator nr. 7

Instruciuni de salt

7.1 Instruciuni de salt necondiionat

Mnemonic: JMP adr - salt necondiionat

Aciune : PC adr

Salturile de acest tip pot fi absolute sau relative, cu adresa dat direct sau coninut ntr-un registru sau locaie de memorie, n acelasi segment sau intersegment, etc. Pentru lista complet a tipurilor de salt necondiionat se poate consulta Anexa 1 de la sfritul lucrrii. ntr-o prim instan se vor folosi numai salturi simple, cu adresa specificat sub forma de etichet, iar asamblorul i linkeditorul vor transpune automat argumentul saltului. n general numai n Modul Protejat este nevoie de toate instruciunile prezentate n lista complet.

7.2 Instruciuni de salt condiionat

Mnemonic: Jcc deplasament, unde cc reprezint condiia testat.

Aciunea:

Dac condiia este adevarata, PCPC+deplasament (se execut saltul la noua adres).

Dac condiia este fals , PCPC+n, unde n este numrul de octei ai instruciunii de salt (aceasta este ignorat i se continu cu instruciunea urmtoare).

Salturile condiionate sunt salturi relative, deci adresa de salt este dat de suma ntre coninutul curent al PC i deplasamentul specificat de instruciune.

Deplasamentul admis de unele asambloare este cu numai 8 bii, astfel ca operandul adr trebuie s difere de adresa curenta cu maxim +/- 128 octei.

Procesoarele de la I-386 n sus admit i salturi relative cu depalasament pe 16 sau 32 de bii, dar numai n interiorul aceluiai segment. Dac se dorete saltul n afara segmentului, se va folosi instruciunea de sal