+ All Categories
Home > Documents > Laborator Sisteme Cu Microprocesoare

Laborator Sisteme Cu Microprocesoare

Date post: 18-Jul-2015
Category:
Upload: neagu-cristian
View: 160 times
Download: 5 times
Share this document with a friend

of 256

Transcript

Prof. dr. Sever Spnulescu

Programarea n limbaj de asamblare a microprocesoarelor -Lucrri de laborator-

Editura Victor 2004

-1-

-2-

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. Intradevr, 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 -3-

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. -4-

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 sau 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.

-5-

-6-

Lucrarea de laborator nr.1 Utilizarea macroasamblorului TASM i a depanatorului TDEtapele 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 ntrun 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) -7-

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.

-8-

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

-9-

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 - 10 -

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 Zona de flaguri, n extrema dreapt, n care sunt afiate valorile 4. 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.

- 11 -

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).

- 12 -

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 . Nu se recomand ns aceasta comanda submeniul Execuie sau cu butonul 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 . Aceasta depanarea cu comanda Debug din submeniul Execuie sau cu butonul produce ncrcarea programului n Turbo Debugger, aprnd fereastra acestuia, ca n figura 1.2 - 13 -

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.

- 14 -

Lucrarea de laborator nr. 2 Instruciuni de transfer ntre registre2.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: -------------- 15 -

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.

- 16 -

Zecimal Binar Hexazecimal 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9 10 1010 A 11 1011 B 12 1100 C 13 1101 D 14 1110 E 15 1111 F 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. - 17 -

2.3 Registrele procesoarelor Intel x86 Microprocesorul convenional din seria Intel x86 are urmtoarele registre pentru lucrul curent: Registrul de 16 bii AX BX CX DX DS CS SS ES SI DI BP SP IP F Registrele de 8 bii Utilizare preferenial

AH BH CH DH

AL BL CL DL

Dedicat nmulirilor i mpririlor, etc. Adresare (baza segmentului de date) Contorizare Utilizat n inmuliri i impartiri Adresa segmentului de date Adresa segmentului de cod Adresa segmentului de stiv Adresa extrasegment (transfer de iruri) Adresa sursei n transferuri de iruri Adresa destinaiei n transferuri de iruri Adresare (baza segmentului de stiv) Indicator de stiv Numrator de program Registrul de flaguri (indicatori de condiii) - 18 -

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 MOV MOV MOV MOV AX, DX, CL, BL, AH, 33H 1122H AL DH DL ;ncarc ;ncarc ;ncarc ;ncarc ;ncarc n n n n n AX DX CL BL AH constanta hexa constanta hexa coninutul lui coninutul lui coninutul lui 0033H 1122H AL DH DL

- 19 -

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 - 20 -

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: - 21 -

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.

- 22 -

Lucrarea de laborator nr. 3 Transferuri de date i operaii aritmetice cu memoria3.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 . . . . . Segment 2 Adresa efectiv (AE) Adresa logica (AL) Adresa baza segment (ABS) . . . . .

Locaia vizat

Segment 1

Figura 3.1 - Adresarea n cadrul unui segment

- 23 -

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]. - 24 -

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 segmentul a 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 - 25 -

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 general SP BP BX SI DI BP+SI sau BP+DI BX+SI sau BX+DI IP Registru de segment implicit SS SS DS DS ES SS DS CS

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.

- 26 -

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- 27 -

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:

- 28 -

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: eticheta EQU numr eticheta EQU ir 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 equ 20h adresa2 equ 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 . . . - 29 -

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

db

.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 MOV locaie+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 - 30 -

33,44,55,66 ;Stabilete adresa ;"locaie" la nceputul ;segmentului de date

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 - 31 -

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] SBB DX,[BX+DI] sau MOV CL,[BP][SI] 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:

- 32 -

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.

- 33 -

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 .

- 34 -

Lucrarea de laborator nr. 4 Procedee de transfer cu memoriaDeoarece 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.

- 35 -

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 PUSH BX . . . POP BX POP AX . . .

;Acum SP=SPiniial-2. ;Salveaz AX la [SPiniial -2]. ;Salveaz BX la [SPiniial-4] ;Alte instruciuni ;pe parcursul carora SP=SPiniial- 4 ;Readuce BX de la[SPiniial-4]. ;Acum SP=SPiniial-2. ;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 . . . POP BX . . . - 36 -

;Salveaz AX la [SP].Acum SP=SPiniial-2 ;Alte instruciuni ;pe parcursul carora SP=SPiniial- 2 ;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 variabila3 DW sir1 DB .Code start: mov ax,@dat mov ds,ax mov al,variabila2 add al, 55h ;ncarc adresa ;segmentului ;de date n DS ;ncarc n AL ;3Fh ;Aduna cu 55h

? 3F ? 10 DUP(1A)

constanta

- 37 -

mov varibila1,al mov ah,variabila2 mov variabila3,ax term: jmp temp end start

;Depune octetul din AL n ;memorie la adresa ;variabila1 ;Aduce i n AH constanta ;3Fh ;Depune cuvntul din AX ;n memorie la adresa ;variabila3

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: numere1 DW caractere DB const1 DB 23A4h,0BC56h,96h ;Declar 4 numere ;de 2 octei 'F','2','7' ;Declar 3 ;caractere de un octet 21,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.

- 38 -

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: dest DW 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 . . .

- 39 -

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 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. - 40 -

nu);

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 - 41 -

sir1 db 13,14,15,1,2,3 sir2 db 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.

- 42 -

Lucrarea de laborator nr. 5 Operaii aritmeticeExist 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: - 43 -

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).

- 44 -

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 Aciune: Operand: -Incrementare dst = dst + 1 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 mov sub sbb al,33 bl,44 al,bl ;La aceast scdere apare mprumut cl,al ;Acesta e luat n consideraie aici -Decrementare dst = dst + 1 r8, r16, r32, m8, m16, m32 - 45 -

DEC dst Aciune: Operand:

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 - 46 -

Dac EDX = 0 atunci CF 0; n celelalte cazuri CF 1 i OF CF Exemplul 5.4: mul bl mul cx ; Se inmulteste AL cu BL (8 bii) iar ;rezultatul este in AX ; 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. - 47 -

- 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). - 48 -

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 semn. Aciune: - Conversie de la Byte (8 bii) la Word (16 bii) cu pstrare 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; - 49 -

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.

- 50 -

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.

- 51 -

Lucrarea de laborator nr. 6 Operaii logice, deplasri i rotaii6.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. NOT dst - 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. AND dst,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. TEST dst,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. OR dst,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. - 52 -

XOR dst 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 SHL dst,[nr] -Deplasare logic spre stnga cu nr poziii (numere fr semn). Aciune: C MSB LSB 0 -dst; -[nr]: 1, CL,imm8. Descriere: Operandul src este nmulit cu 2 de [nr] ori. Exempe: 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. SHR dst,[nr] -Deplasare logic spre dreapta cu nr poziii (numere fr semn). Aciune: MSB 0 Operanzi: -dst; -[nr]: 1, CL,imm8. Descriere: Operandul src este impartit cu 2 de [nr] ori. LSB C Operanzi:

- 53 -

SAL semn).

src,[nr] -Deplasare aritmetic spre stnga cu nr poziii (numere cu

Aciune: C Operanzi: MSB LSB 0 -dst; -[nr]: 1, CL,imm8. Descriere: Operandul src cu semn este nmulit cu 2 de [nr] ori. SAR semn) Aciune: MSB LSB C src,[nr] -Deplasare aritmetica spre dreapta cu nr pozitii (numere cu

Operanzi:

-dst. -[nr]: 1, CL,imm8. Descriere: Operandul src cu semn este mprit cu 2 de [nr] ori. ROL src,[nr]-Rotaie prin Carry spre stnga cu [nr] poziii Aciune: C MSB LSB

Operanzi:

-dst; -[nr]: 1, CL,imm8.

ROR src,[nr]-Rotatie prin carry spre dreapta cu [nr] poziii Aciune: MSB LSB C

Operanzi:

-dst; -[nr]: 1, CL,imm8.

- 54 -

RCL src,[nr]-Rotatie cu carry spre stnga cu [nr] poziii Aciune: C MSB LSB

Operanzi:

-dst; -[nr]: 1, CL,imm8.

RCR src,[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: biti 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 I386 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.

- 55 -

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 AAS DAA DAS AAM AAD -Ajustare AL dup adunare (BCD despachetat). -Ajustare AL dup scdere (BCD despachetat). -Ajustare AL dup adunare (BCD inpachetat). -Ajustare AL dup scdere (BCD impachetat). -Ajustare AL dup nmulire. -Ajustare AL nainte de mprire.

4.Modul de lucruIniial, 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. - 56 -

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.

- 57 -

Lucrarea de laborator nr. 7 Instruciuni de salt7.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 salt relativ cu condiia invers i dup ea o instruciune de salt necondiionat intersegment. n funcie de indicatorii de condiii testati de instruciunea de salt, exist urmtoarele tipuri de salturi condiionate (cu variantele echivalente scrise n paranteze). JP adr (JPE adr) Jump if Parity - salt condiionat de paritate par. JNP adr (JPO adr) Jump if Not Parity - salt condiionat de paritate impar. JO adr - Jump if Overflow- salt condiionat de OF =1 - a fost depire. - 58 -

JNO adr - Jump if Not Overflow- salt condiionat de OF = 0 - nu a fost depire . JS adr Jump if Sign bit- salt condiionat de SF=1 - rezultatul a fost negativ. JNS adr - Jump if No Sign bit - salt condiionat de SF = 0 rezultatul a fost pozitiv. JE adr (JZ adr) Jump if Equal (Jump if Zero flag) - salt condiionat de ZF=1 - egalitate la comparaia anterioara. JNE adr (JNZ adr) - Jump if Not Equal (Jump if No Zero flag) - salt condiionat de ZF=0 - inegalitate la comparaia anterioar. Pentru compararea numerelor cu semn (MSB d semnul: 1 pentru negativ, 0 pentru pozitiv) se folosesc atributele Less i Greater: JL adr (JNGE adr) Jump if Less (Jump if Not Greater or Equal) - salt condiionat de SFOF (SF xor OF = 1) - mai mic la comparaia anterioar a unor valori cu semn. JLE adr (JNG adr) - Jump if Less or Equal (Jump if Not Greater) salt condiionat de ZF=1 sau SFOF - mai mic sau egal la comparia anterioar a unor valori cu semn. JG adr (JNLE adr) Jump if Greater (Jump if Not Less or Equal) - salt condiionat de ZF=0 i SF=OF - mai mare la comparaia anterioar a unor valori cu semn. JGE adr (JNL adr) Jump if Greater or Equal (Jump if Not Less) - salt condiionat de SF=OF - mai mare sau egal la comparaia anterioar a unor valori cu semn. Pentru compararea numerelor fr semn se folosesc atributele Below i Above: JB adr (JNAE adr , JC adr) Jump if Below (Jump if Not Above or Equal) salt condiionat de CF = 1 - mai mic la comparaia anterioar a unor valori fr semn sau transport la operaia anterioar. JBE adr (JNA adr) Jump if Below or Equal (Jump if Not Above) - salt condiionat de CF=1 sau ZF=1 - mai mic sau egal la comparaia anterioar a unor valori fr semn.

- 59 -

JA adr (JNBE adr ) Jump if Above ( Jump if Not Below or Equal) - salt condiionat de CF =ZF = 0 - mai mare la comparaia anterioar a unor valori fr semn. JAE adr (JNB adr , JNC adr) Jump if Above or Equal (Jump if Not Below, Jump if Not Carry) - salt condiionat de CF=0 - mai mare sau egal la comparaia anterioar a unor valori fr semn sau nu exist transport la operaia anterioar. JCXZ (Jump if CX is Zero) - salt condiionat de coninutul lui CX = 0 7.3 Instruciuni de ciclare LOOP, LOOPcc Pentru execuia repetat a unui grup de instruciuni (ciclu) se pot folosi, n afara instruciunilor de salt i instruciunile specializate pentru ciclare LOOP i LOOPcc. Acestea folosesc implicit registrul contor CX, pe care l decrementeaz automat la fiecare execuie i, dac acesta nu a ajuns la 0, execut saltul la adresa specificat. Mnemonic: LOOP rel8. Aciune: DEC CX; jump short if CX 0. Se execut ciclul pn cnd contorul CX ajunge la 0. Mnemonic: LOOPE rel8 (cicleaz atta timp ct exist egalitate). Aciune: DEC CX; jump short if count 0 and ZF=1. Se execut ciclul pn cnd contorul CX ajunge la 0, sau pn cnd apare ZF (la o comparaie sau scdere cu operanzi egali). Mnemonic: LOOPZ rel8 (cicleaz atta timp ct exist egalitate). Aciune: DEC CX; jump short if count 0 and ZF=1. Se execut ciclul pn cnd contorul CX ajunge la 0, sau pn cnd apare ZF (la o comparaie sau scdere cu operanzi egali). Mnemonic: LOOPNE rel8 (cicleaz atta timp ct nu exist egalitate). Aciune: DEC CX; jump short if count 0 and ZF=0. Se execut ciclul pn cnd contorul CX ajunge la 0, sau pn cnd apare ZF (la o comparaie sau scdere cu operanzi diferii). Mnemonic: LOOPNZ rel8 (cicleaz atta timp ct nu exist egalitate). Aciune: DEC CX; jump short if count 0 and ZF=0. Se execut ciclul pn cnd contorul CX ajunge la 0, sau pn cnd apare ZF (la o comparaie sau scdere cu operanzi diferiti). - 60 -

Modul de lucru: n continuare, dac nu se specific altfel, se va folosi pentru adresa efectiv valoarea implicit 0. P 7.1 Sa se ncarce n primele 3 locaii de memorie constantele 5566h, 3322h i 8899h i s se ordoneze n ordine cresctoare coninutul acestor locaii din memorie. Se va testa programul i cu valorile 4444h, 6666h i 2222h, respectiv 7777h, 3333h, 2222h. P 7.2 Sa se ncarce o zon de memorie de 20h de octei cu constanta 33h. P 7.3 Sa se ncarce o zona de memorie de 20h de octei cu numere cresctoare de un octet ncepnd cu 5. P 7.4 Sa se adune coninutul celor 20 de locaii de memorie ncarcate de programul anterior, iar rezultatul, pe 16 bii, s se plaseze n memorie cu octetul cel mai puin semnificativ la adresa efectiv 21h, i cel mai semnificativ la adresa 20h. P 7.5 S se ncarce o zona de memorie de 20h de octei cu numere cresctoare din 10h n 10h . P 7.6 S se ncarce o zona de memorie de 20h de octei cu numere descresctoare din 10h n 10h ncepnd cu 200h. P 7.7 S se gaseasc i s se plaseze, la sfritul irului, octetul maxim din 10h locaii de memorie ncepnd de la adresa 0.

- 61 -

Lucrarea de laborator nr. 8 Instruciuni de lucru cu irurin multe aplicaii este necesar s se transfere iruri de date dintr-o zona de memorie n alta. Desi acest lucru este posibil folosind instruciuni MOV i adresri adecvate la memorie, s-au prevazut i instruciuni speciale n acest scop, care permit o vitez superioar, fiind recomandate n majoritatea situaiilor de acest gen. Pentru aceste instruciuni s-au prevazut dou registre index: SI i DI - Source Index, respectiv Destination Index. Aceste registre conin adresele efective implicate n transfer, i se modifica automat, incrementandu-se sau decrementndu-se, cu 1 , cu 2, sau cu 4, la fiecare instruciune de acest tip. Transferul se poate face pe 8 bii, pe 16 bii , sau pe 32 bii (de la I-386 n sus - vezi Anexa 1). Sunt prezentate aici doar transferuri pe 8 i pe 16 bii. irul surs are adresa efectiv coninut n registrul index surs SI i se afl n segmentul de date (cu adresa de segment n DS). irul destinaie are adresa efectiv coninut n registrul index destinaie DI i se afl n extrasegment (cu adresa de segment n ES). Sensul parcurgerii irurilor este dat de flagul DF - Direction Flag, fiind cresctor dac DF=0 i descresctor dac DF=1. La utilizarea repetat a unor astfel de instruciuni este recomandabil folosirea prefixului REP n loc de utilizarea unei bucle clasice. 8.1. Instruciunile LODSB, LODSW, STOSB, STOSW Mnemonic: Aciune: Mnemonic: Aciune: LODSB - ncarc de la DS:SI n AL. AL[SI]. SISI +1 dac DF=0, SISI-1 dac DF=1. LODSW - ncarc de la DS:SI n AX. AL[SI]. AH[SI+1]. SISI +2 dac DF=0, SISI-2 dac DF=1. STOSB - ncarc AL la ES:DI . [SI]AL. SISI +1 dac DF=0, SISI-1 dac DF=1.

Mnemonic: Aciune:

- 62 -

Mnemonic: Aciune:

STOSW - ncarc AL la ES:DI. [SI]AL. [SI+1]AH. SISI +2 dac DF=0, SISI-2 dac DF=1.

Pentru instruciunile de transfer LODSB i LODSW, surs este locaia de memorie cu adresa efectiv dat de registrul index surs SI i adresa de segment dat de DS. Pentru instruciunile de transfer STOSB i STOSW, destinatia este locaia de memorie cu adresa efectiv dat de registrul index destinaie DI i adresa de segment dat de ES. n urma efecturii unei astfel de instruciuni, registrul index SI respectiv DI se modific n funcie de starea flagului DF (de direcie). Dac DF este 0, registrul index va fi incrementat cu 1 la LODSB i STOSB i cu 2 la LODSW i STOSW. Dac DF este 1, registrul index va fi decrementat cu 1, respectiv cu 2. Registrul general implicit este AL la transferul de un octet i AX la transferul de doi octei. n exemplul urmtor se arat utilizarea unor astfel de instruciuni la copierea unui bloc dintr-o zon memorie n alta. Exemplul 8.1: .radix 16 .model small .stack 100h LungimeBloc equ 30 .DATA BlocSursa db 40 dup(56) BlocDest db 40 dup(?) .code start: mov ax,seg BlocSursa mov ds,ax mov ax,seg BlocDest mov es,ax

;Se putea folosi i mov ;ax,@dat ;Segmentul surs n DS ;Necesar numai dac ;blocurile sunt n ;segmente diferite ;Segmentul destinaie ES - 63 -

;direcia n sensul ;creterii adreselor mov i, offset BlocSursa ;AE a sursei n SI mov di, offset BlocDest ;AE a destinaiei n DI mov cx, LungimeBloc ;Numrul de transferuri n CX bucla: lodsb ;ncarc n AL un octet stosb ;i l trimite la destinaie loop bucla ;Decrementeaz CX i reia ;bucla pn cnd CX devine 0 term: jmp term end start Modul de lucru: P 8.1 Sa se iniializeze un bloc de 20h de cuvinte de forma 1122h n memorie ncepnd de la adresa 0 din segmentul de date i s se copieze acest bloc ntr-o zona ncepnd de la adresa 60h din segmentul de date. Observaie: Reamint


Recommended