Programarea in Limbaj de Asamblare a Microprocesoarelor

download Programarea in Limbaj de Asamblare a Microprocesoarelor

of 255

Transcript of Programarea in Limbaj de Asamblare a Microprocesoarelor

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    1/255

    Programarea n limbaj de asamblare a microprocesoarelor

    -Lucrri de laborator-

    1

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    2/255

    Introducere

    Dei limbajele de programare s-au perfecionat continuu pe parcursulultimelor decenii, se pare c suntem nc departe de apariia unui limbaj absolutoptimal care s mbine toate avantajele celorlalte limbaje i s evite dezavantajele lor.De altfel, majoritatea limbajelor de programare actuale au evoluat tocmai n direciaeliminrii propriilor puncte slabe i a achiziionrii celor mai moderne concepte dinteoria 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 preiasoluiile optimale ale diverselor limbaje de programare, ceea ce ar micora eforturilede 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 principialnerezolvabil i coexistena mai multor nivele n complexitatea actului de programareeste obligatorie.

    Intr-adevr, n dialogul om-main se constat n permanen o anumedistribuie a eforturilor se dezvoltare i utilizare a unui program. Se poate folosi unlimbaj care s necesite un efort mai mic din partea programatorului n partea dedezvoltare 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 irespectiv 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 instruciunilemain. Cnd grupurile respective sunt mari, programatorul are de scris mai puincod, efortul su fiind sczut, i se spune c nivelul instruciunilor i al limbajului estenalt. Astfel de limbaje sunt: Basic, Pascal, etc. Dac numrul de instruciuni maindintr-o instruciune a limbajului este mai sczut, efortul programatorului crete, eltrebuind s scrie un cod mai complex pentru o sarcin dat. Astfel de instruciuni ide 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 esteevident 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 attviteza lor de execuie scade. n plus, scade i probabilitatea ca o anumit instruciunes fie soluia optim pentru o problem dat.

    Programatorul are la dispozie anumite tipuri de prefabricate - instruciuniledin care trebuie s alctuiasc programul, mbinndu-le pe cele mai apropiate de

    2

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    3/255

    necesitile sale reale, chiar dac acestea sunt uneori departe de prototipul cu eficienaoptim. Pe msur ce dimensiunile acestor blocuri scad este mai posibil ca ele s sembine mai eficient, mrind i performana ansamblului. n fine, atunci cndperformana este critic se pot folosi blocurile cu cele mai mici dimensiuni posibile -instruciunile main ale limbajului de asamblare. Eficiena codului este n acest cazmaxim, la fel i efortul programatorului.

    O alt variant de adaptare eficient a unui limbaj la o gam larg de aplicaiio constituie diversificarea instruciunilor acestuia pentru a oferi soluii prefabricatentr-un numr ct mai mare de situaii. n acest caz se constat ns o cretereanormal 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 ajunseserdeja de la varianta Windows 3.1 la un numr de peste 1300, pentru versiunile viitoarede Windows evitndu-se chiar menionarea numrului total. Fiind scrise de mai multegrupuri i chiar generaii de programatori, ele se suprapun uneori, mrind confuziautilizatorului.

    In schimb, utilizarea limbajului de asamblare permite scrierea cuinstruciunuile cele mai adecvate posibile a oricrei poriuni de program, aducndprin aceasta viteza maxim care se poate astepta de la un anumit procesor. In plus, se pot obtine creteri de performan datorit posibilitii repartizrii eficiente avariabilelor 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 rapiddect 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 maifrecvent folosite ntr-o zon de program dat. Compilatoarele repartizeaz n modoarecum arbitrar variabilele ntre registre i memorie, neputnd intui frecvena loraa cum poate face un programator n limbaj de asamblare.

    O bun soluie de compromis o reprezint utilizarea nivelului mediu, nvariantele limbajului C, al crui succes este de altfel recunoscut. Dar chiar i n cazulfolosirii limbajelor de nivel mediu, i cu att mai mult a celor de nivel nalt, potaprea poriuni de program n care viteza este un parametru critic iar instruciunileproprii 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 deasamblare i cel mai frecvent cmp de aplicare a acestuia.

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

    3

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    4/255

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    5/255

    5

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    6/255

    Lucrarea de laborator nr.1Utilizarea macroasamblorului TASM i a depanatorului TD

    Etapele dezvoltrii unui program n limbajul de asamblare sunt urmtoarele:1. Editarea2. Asamblarea3. Linkeditarea4. Rularea i eventuala depanare

    Programul n limbaj de asamblare este scris mai nti cu un editor de textoarecare, constituind aa-numitul program surs. El trebuie s respecte doucategorii 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 documentaiareferitoare la procesorul respectiv.

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

    Dup scrierea programului surs, el este incrcat n asamblor care l transforman final n program obiect. n plus, din procesul de asamblare se pot obine i altefiiere, 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 defuncionare necorespunztoare din cauze care nu sunt evidente, se ncarc ntr-unprogram depanator (debugger). Acesta permite rularea pas cu pas a zonelor neclaredin funcionarea programului, cu afiarea continu a coninutului registrelor imemoriei, permind astfel localizarea problemelor. Dup clarificarea lor, estemodificat 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 principaltrei 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)

    6

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    7/255

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

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

    write

    n cazul n care se ncepe un program nou, ce urmeaz apoi s fie salvat sub

    un nume propriu (obligatoriu cu extensia .asm), sauwrite 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 utilpentru identificarea liniei la care asamblorul gsete o eroare. Pentru aceasta va trebuibifat n meniul View opiunea Status Bar.

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

    Tasm Nume_surs, Nume_obiect, Nume_listingunde:

    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 oanaliza 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 obiectpoate fi prelucrat mai departe.

    7

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    8/255

    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 trecela 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 fiierulexecutabil. Se pot folosi i aici opiuni de linkeditare, care pot fi vzute rulndcomanda 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 TurboDebugger) 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 sse creeze un fiier batch de exemplu Asamblare.bat cu urmtoarea structur:

    write.exe %1pause\tasm\bin\tasm.exe /zi %1,object,listing/lpause\tasm\bin\tlink /v object,exefilepause\tasm\bin\TD exefile

    8

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    9/255

    Acest fiier automatizeaz comenzile de asamblare, i va fi folosit pentrupunerea la punct a unui program surs care a fost creat iniial cu comanda Write isalvat 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 bifacaseta Always use this program to open this file. n continuare, un dublu click peun astfel de fiier va lansa automat secvena de comenzi necesar asamblrii. Lafinalul fiecrui ciclu de asamblare, se va deschide fereastra depanatorului TurboDebugger care n general arat ca n exemplul din figura 1.2

    Figura 1.2 - Fereastra principal din TurboDebugger

    9

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    10/255

    Se observ existena mai multor zone n aceasta fereastr.

    1. Zona principal, care cuprinde partea stnga superioar afieaz codulprogramului 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 maride memorie cu comanda "Dump" din submeniul View. Aceasta va apare, ngeneral, aa cum se vede n figur, n partea de jos a ecranului.

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

    4. Zona de flaguri, n extrema dreapt, n care sunt afiate valorileindicatorilor 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 diferita unei linii (n figur, chiar prima linie) care poate fi folosit pentru a marca un punctde oprire la o comanda de rulare a progranului. Cu opiunea Run to cursor ( tastaF4) 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 nmemorie dup ultima instruciune, iar sistemul se poate bloca). Terminarea se poateface cu o instruciune de salt necondiionat la ea insi, sau folosirea funciei 4Ch antreruperii 21h, cum se va arta ulterior.

    Ca alternativ, programul poate fi rulat instruciune cu instruciune, cu tastaF7, urmrindu-se evoluia registrelor, a memoriei i a indicatorilor de condiii dupfiecare pas.

    10

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    11/255

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

    Figura 1.3 - Fiierul obiect n fereastra TD

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

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

    Se poate lucra mai comod folosind programul MIAD - Mediu Integrat deAsamblare 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 programuluisurs, ca n figura 1.4.

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

    11

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    12/255

    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 definalizare ale asamblrii. Dac au aparut erori, este afiat o fereastr cu fiierulListing, indicnd tipul erorilor i poziia acestora, ca n figura 1.5. n caz c nu sunterori, listingul nu va fi afiat dect dac este bifat opiunea "Cu afiare listing" dinsubmeniul Execuie.

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

    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 dinsubmeniul Execuie sau cu butonul . Nu se recomand ns aceasta comandadect atunci cnd programul nou creat este suficient de bine pus la punct pentru a nubloca sistemul. n fazele iniiale ale dezvoltrii programului se recomand testarea i

    depanarea cu comanda Debug din submeniul Execuie sau cu butonul . Aceastaproduce ncrcarea programului n Turbo Debugger, aprnd fereastra acestuia, ca nfigura 1.2

    12

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    13/255

    Figura 1.5 - Fiserul Listing cu specificarea erorilor

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

    13

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    14/255

    Lucrarea de laborator nr. 2Instruciuni 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 lanceputul liniei. Cnd este referita ca operand (de exemplu la o instruciune desalt), 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 cusetul de instruciuni al procesorului;

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

    Prefixele dau precizri suplimentare despre operanzi, conform descrieriiinstruciunii respective;

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

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

    .model small

    .stack 100h

    .codestart:

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

    14

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    15/255

    Primele trei liniii sunt directive de asamblare, care declar cantitatea dememorie folosita, poziia stivei, i nceputul segmentului de cod. A patra linie esteeticheta de intrare n program acesta ncheindu-se cu declaratia ENDeticheta_de_intrare.

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

    Bucla: jmp buclaEnd 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-numitareprezentare hexazecimal. Cu 4 bii se pot realiza 2 4=16 combinaii, conformtabelului 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 scriereaechivalent 94.CA, unde 94 este octetul mai semnificativ iar CA octetul mai puinsemnificativ.

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

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

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

    15

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    16/255

    Zecimal Binar Hexazecimal0 0000 01 0001 12 0010 23 0011 34 0100 45 0101 56 0110 67 0111 78 1000 8

    9 1001 910 1010 A11 1011 B12 1100 C13 1101 D14 1110 E15 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 desufixul B (se pot folosi litere mari sau litere mici).

    Dac se intenioneaz ca toate numerele din program s fie implicithexazecimale 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 confundatecu alte simboluri literale (etichete) folosite n program. De exemplu, numrulhexazecimal ADCEH (n binar 1010.1101.1100.1110) ar putea fi o eticheta, ovariabila sau o constant. Pentru a preciza c este vorba de un numr, dacnumrul ncepe cu o litera se pune n stnga sa cifra 0. De exemplu, numrulanterior 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 vacompleta n stnga cu 0 pn devine multiplu de 4 i apoi se face delimitarea cifrelorhexazecimale. De exemplu numrul binar:

    1011011001 se va scrie 0010.1101.1001= 2D9h sau 02D9hNumerele folosite de diveri algoritmi pot fi cu semn sau fr semn. Anumite

    instruciuni aritmetice se comporta diferit pentru cele dou categorii de numere, aacum se va arata mai trziu. Pentru numerele cu semn se folosete urmtoareaconvenie: primul bit din stnga al numarului (cel mai semnificativ) este bitul desemn. El are valoarea 0 dac numrul este pozitiv i 1 dac este negativ.

    16

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    17/255

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    18/255

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

    Microprocesoarele de diverse tipuri au mai multe registre, cu mai mult de 16bii (cele din seriile I-386, I-486 i Pentium ). Registrele de mai sus au de fapt laaceste procesoare un numr de 32 de bii, dar pot fi folosite ca registre de 16 bii cunotatiile 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 preambululprogramului va trebui pus directiva .386, pentru a preciza c este folosit un procesorde 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,rssrc: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 0033HMOV DX, 1122H ;ncarc n DX constanta hexa 1122HMOV CL, AL ;ncarc n CL coninutul lui ALMOV BL, DH ;ncarc n BL coninutul lui DHMOV AH, DL ;ncarc n AH coninutul lui DL

    18

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    19/255

    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 modificareaconinutului 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 coninutulregistrului AL n registrele BL, BH, CL, i DH.

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

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

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

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

    2.5. Instruciuni de interschimbare ntre registre

    Mnemonic general:XCHG dst,src

    Aciune: Se interschimba coninuturile registrelor dest i src.dst srcsrc dst

    Operanzi: dst,src:r8,r16,r32Restrictii:Nu exist instruciuni de tip:-XCHG rs,rs-XCHG cs,*

    Mod de lucru :P 2.7. Se vor ncarca urmtoarele registre astfel:AL cu 11BL cu 22

    19

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    20/255

    CX cu 3344DX 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 iDD i apoi se va efectua permutarea circular a coninutului celor 4 registre. Se vorfolosi instruciuni de tip XCHG, i dup terminarea rulrii programului registrele vortrebui 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 celenegative au MSB 1. Numerele negative vor avea valoarea diferenei ntre valoarealor 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 calculeazaconform formulei 167-28 = -89;

    0CEACh = 1100.1110.1010.1100 este un numr negativ de doi octei, cuvaloare absoluta 52908 i valoare n complement fa de 2 care se calculeazaconform 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 maisemnificativ.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=7788i se va efectua urmtoarea succesiune de operaii:

    20

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    21/255

    AL+66AL+BLAL-CLAL-22AL+BL+CL+DL

    P 2.10. Se vor ncarca registrele cu constantele: AX=1122, BX=3344,CX=5566, DX=7788i se va efectua urmtoarea succesiune de operaii:

    AX+6666

    AX+BXAX-CXAX-22AX+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 fie6688AACC

    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.

    21

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    22/255

    Lucrarea de laborator nr. 3Transferuri de date i operaii aritmetice cu memoria

    3.1 Componentele unei adrese logice

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

    Aceasta permite ca n Modul Real specificarea unei adrese de memorie s sefac prin numai 16 bii, considerai ca fiind poziia locaiei respective de memoriefa de baza segmentului n care se afl. Acesti 16 bii formeaz adresa efectivsau 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

    22

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    23/255

    Blocul de management al memoriei din interiorul procesorului va formaautomat o adresa logic de memorie ca n figura 3.1, dup urmtoarea formulgeneral:

    AL = AS*16 +AEunde:

    AL este adresa logic (coincide cu adresa fizic, transmis pe magistrala deadrese, 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

    -SSpentru segmente de stiv-ES pentru extrasegmenteEa 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 16bii, iar adresa bazei segmentului va avea 20 si se obtine automat in unitatea demanagement 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 unsegment 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 adresaefectiv 3A21, iar [BX+DI] reprezint coninutul locaiei de memorie a carei adresaefectiv este dat de suma ntre registrele BX i DI.

    Este permis i scrierea RG[const] cau const[RG] unde RG este un registrugeneral iar const este un deplasament (numr sau etichet ) care se adun laconinutul 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 adresade ;segment este coninut n DS.

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

    23

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    24/255

    n mod normal, programatorul va specific numai adresa efectiv, dar ncazuri speciale se poate folosi totui i adresa fizic, prin specificarea i a adresei desegment, 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 DSMOV 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 adresaDS: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 segmentfiind incrcat de procesorn mod automat din registrul de segment implicit pentru

    operaia respectiv. Aceasta conduce ns la necesitatea cunoasterii registrelorimplicite 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 ultimultermen)

    / separ variantele unui termen

    24

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    25/255

    BX i BP sunt registrele de tip bazSI 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 Registru de segment implicitSP SSBP SSBX DSSI DSDI ES

    BP+SI sau BP+DI SSBX+SI sau BX+DI DS

    IP CS

    Tabelul 3.1- Registrele de segment implicite la formarea unei adrese

    Trebuie s se in seama n permanen de regulile registrelor de segmentimplicite 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 foloseteregistrul 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 constantnumeric, deoarece nu poate ti registrul de segment implicit. De aceea, se vor folosiforme 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], dacBX a fost facut 0 n prealabil. Unele asambloare dau ns doar o avertizare i folosescsegmentul de date, indiferent dac aceasta a fost intenia programatorului sau nu.

    25

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    26/255

    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 segmentdin 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 fereastraStack din dreapta jos a Turbo Debugger.

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

    3.3 Transferuri pe 1 octet i pe 2 octei

    O locaie de memorie are prin convenie un octet, astfel c ea poate fi operandnumai 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 seafl octetul inferior al registrului dublu, iar la adresa imediat urmtoare octetulsuperior.

    Specificarea lungimii operandului (1 octet sau 2 octei) este sau implicit saudeclarat 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 irezulta 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 noctetul superior coninutul locaiei de memorie cu adresa mai mare). Nu este nevoiede prefix deoarece operandul AX este de 16 bii i rezult implicit un transfer de doioctei.

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

    26

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    27/255

    ADD byte ptr [BP+3000],59 adun la octetul coninut n locaia 3000 dinsegmentul 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 afiatotui o avertizare legat de lungimea operanzilor.

    Modul de lucru :

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

    P 3.3. Program care ncarc n AX constanta 3344 i o trimite n memorie laadresa 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 44P 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 datesuma 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 coninutulacestora).

    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, sedefinesc urmtoarele moduri de adresare:

    27

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    28/255

    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 specificei 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 urmtoareMOV ES:[3AC2],DL ;ncarc n locaia cu adresaefectiv 3AC2 din extrasegment coninutul registrului de8 bii DL

    Adresa efectiv poate fi specificat i printr-o etichet (n paranteze drepte icu specificarea unui segment sau a unui registru general) care a fost declaratanterior. 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 decaractere, n schimb nu se mai poate face alt asignare ulterioar n program. Formacu = admite reasignri, dar nu permite asignarea cu iruri.

    Exemplul 3.5:adresa1 equ 20hadresa2 equ adresa1+2adresa3=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

    .

    .

    28

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    29/255

    .

    2. Adresarea direct

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

    Aceasta form este posibil pentru segmentul de date, care poate fi declarat npartea iniial a programului, fr ca programatorul s se preocupe de plasarea saexact 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 automatde asamblor i nlocuit n instruciune cu valoarea numeric corespunztoare.

    Exemplul 3.6:.model small.stack 100h.DATAlocaie db 33,44,55,66 ;Stabilete adresa

    ;"locaie" la nceputul;segmentului de date

    .code

    MOV AX,@dat ;ncarc adresa segmentului de dateMOV 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 uneilocaii de memorie.

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

    29

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    30/255

    MOV AX, seg locaie

    Programul Turbo Debugger, dac are implicit afiata o fereastra Dump, duprularea instruciuniiMOV DS,AX va afia automat zona respectiv cu registrul desegment ES. Pentru a afia chiar segmentul de date, trebuie dat o noua comandaDump din submeniul View, atunci cnd fereastra CPU este activata (dac nu este, seda un click pe aceasta fereastra). n noua fereastra dump se vor observa dateledeclarate.

    3.Adresare indirect la memorie prin registru.Se specific n instruciune registrul din care se va lua adresa efectiv. Dupcum 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 nlocaia ;de memorie urmtoare.

    Dac nu se specific n adresa i un registru de segment, acesta va fi celimplicit, 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 seutilizeaza 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 seadun 31, iar adresa de segment este dat de DS.

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

    Aceste instruciuni se mai pot scrie i :

    30

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    31/255

    MOV AL,31[DI] respectivMOV 1226[BP],CX

    Modul de adresare prin registru cu deplasare se recomand pentru adresareaelementelor irurilor i tabelelor. De exemplu, dac s-a definit anterior constantanumeric TAB ( de exemplu TAB EQU 2100) se poate adresa elementul de tabel cunumrul 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 estemenionat 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 constantanumeric TAB ntr-un registru de baza ( de exemplu MOV BX,2100) se poate adresaelementul de tabel cu numrul coninut n registrul SI printr-o instruciune de genulMOV 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, ncare 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 adresareaelementelor matricilor. De exemplu, dac s-a definit anterior constanta numericMAT ( de exemplu 2100) iar BP conine numrul unei linii nmulit cu numrul totalde coloane se poate adresa elementul din linia respectiv avnd indicele (numrul decoloan) coninut n registrul SI, printr-o instruciune de genul:

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

    31

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    32/255

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

    MAT=20hMOV BX, 18MOV SI,3MOV CL, MAT[BX+SI]

    Modul de lucru

    P 3.8. Se va realiza un program care s execute prin adresri imediateurmtoarele 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 vacalcula 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 dinsuma 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 iavaloarea lui BX, BX a lui CX, CX a lui DX iar DX a lui AX). Se vor folosi pentrustocarea temporar n memorie a unui registru modul imediat, modul direct i modulindirect.

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

    32

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    33/255

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

    P 3.14. Acelasi program ca la punctul 3.12, dar cu numere pe un octetmultipli 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 .

    33

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    34/255

    Lucrarea de laborator nr. 4Procedee de transfer cu memoria

    Deoarece numrul registrelor de uz general este mic, de multe ori este necesarca anumite rezultate intermediare sau alte variabile s fie stocate n memorie. Pentruefectuarea 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 dinmodurile de adresare prezentate anterior. Metoda va fi folosit atunci cnd se doretecunoaterea adresei de memorie respective, ea fiind impus de algoritm. De exemplu,dac se dorete scrierea n memoria ecran care ncepe la adresa A000h, adresaefectiv 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 potfolosi 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 (stackpointer).

    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]

    34

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    35/255

    SP SP+2.

    Lucrul cu stiva prin instruciunile PUSH i POP este comod deoarece nunecesit calculul sau specificarea adresei de memorie. Trebuie s se in cont ns deordinea 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 altregistru 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

    .

    .

    35

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    36/255

    .

    Modul de lucruP 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 iavaloarea lui BX, BX a lui CX, CX a lui DX iar DX a lui AX). Se vor folosi numaiinstruciuni PUSH i POP (se va observ evoluia stivei i a SP n partea din dreaptamijoc 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 putndfi stocat acolo unde exist loc liber, nu mai este necesar specificarea explicit aadresi efective. Se va folosi o directiv de asamblare de tip DB pentru rezervarea uneilocaii 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

    .DATAvariabila1 DB ?variabila2 DB 3Fvariabila3 DW ?sir1 DB 10 DUP(1A)

    .Codestart:

    mov ax,@dat ;ncarc adresa;segmentului

    mov ds,ax ;de date n DSmov al,variabila2 ;ncarc n AL constanta

    ;3Fhadd al, 55h ;Aduna cu 55h

    36

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    37/255

    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 tempend start

    Referirea n program a locaiei se face prin numele asignat n stngadirectivei. Se observ c dac se dorete iniializarea locaiei, se va specificconstanta 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 respectivefiind separate prin virgule.

    Exemplul 4.4:numere1 DW 23A4h,0BC56h,96h ;Declar 4 numere

    ;de 2 octeicaractere DB 'F','2','7' ;Declar 3

    ;caractere de un octetconst1 DB 21,0A2h,'L' ;Declar 3 valori

    ;diverse

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

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

    Dup rularea instruciunii MOV DS,AX programul Turbo Debugger, dac areimplicit afiata o fereastra Dump, va afia automat zona respectiv cu registrul desegment 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 acesteiinstruciuni atunci cnd fereastra CPU este activata (dac nu este, se da un click peaceasta fereastra). n noua fereastra dump se vor observ datele declarate.

    37

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    38/255

    Modul de lucru

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

    P 4.3. Se vor declara n segmentul de date irul de cuvintele 1122, 3344 i5566 i se vor transfera n alte trei locaii rezervate (n locaii consecutive variabilelordeclarate 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 deun octet, ncepnd cu 1, i se va inversa coninutul primei locaii cu ultima i a celeide 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 specificatde 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:XLATAciune:AL [BX+AL]

    Exemplul 4.5:

    .

    .

    .mov bx, 1200hmov al,5xlat ; n AL va apare coninutul locaiei de memorie

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

    38

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    39/255

    Modul de lucru

    P 4.5. Se va scrie un program care s aduc n DL coninutul locaiei cuindexul 5 dintr-o tabel care ncepe la adresa 10 din segmentul de date i n DHconinutul 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 printransferul ntre registrul AH i registrul de flaguri folosind urmtoarele instruciuni:

    LAHFAciune: 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);SAHFAciune: 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 debii), ea poate fi adus ntr-o pereche format dintr-un registru de segment i unregistru de 16 bii, folosind instruciunile LGS/LSS/LDS/LES/LFS.

    39

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    40/255

    Sintaxa: LDS r16,RS:nnLSS r16,RS:nnetc.

    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 (nicinu existau registrele de segment FS i GS), de aceea, n cazul folosirii lor, npartea iniial a programului trebuie introdus directiva .386.

    Cu specificarea directivei .386, se poate folosi n al doilea operand i unnumr nnnn (de 32 de bii).

    Modul de lucru

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

    4.7 ncrcarea unei adrese efective

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

    Sintaxa: LEA r16, m16Aciune: r16 m16

    Exemplul 4.6:

    .radix 16

    .model small

    .stack 100h

    .DATA

    40

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    41/255

    sir1 db 13,14,15,1,2,3sir2 db 16,17,18,19

    .codestart: mov ax,@dat ;Adresa segmentului de date

    mov ds,ax ;se ncarc n DSlea 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 registredestinaie la instruciunea LEA numai registrele BX, SI i DI i nu va fi folositBP.

    Instruciunea LEA rd, adresa_efectiv poate fi inlocuit n majoritateacazurilor cu instruciunea MOV rd,OFFSET adresa_efectiv, lsnd astfelasamblorul s calculeze i s ncarce valoarea corect a adresei efective nregistrul dorit. Sunt situaii ns cnd instruciunea LEA este mai eficient (deexemplu la lucrul cu directive de grupare).

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

    41

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    42/255

    Lucrarea de laborator nr. 5Operaii 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.Acestindicator poate fi folosit n cazul adunrii sau scderii numerelor pe mai mulioctei, semnificind n primul caz transport la adunare i n al doilea cazmprumut la scdere. Indicatorul CF nu este modificat de instruciuni deincrementare i decrementare.

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

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

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

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

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

    5.1 Reprezentarea n complement fa de 2

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

    numr+simetric =0

    42

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    43/255

    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 seconsider cuvinte de o lungime fixa, L. Astfel, de exemplu dac L=4, putem spune ca1 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 maiincape 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 biilornumrului i adunarea unui 1.

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

    43

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    44/255

    5.2 Prezentarea instruciunilor aritmetice

    ADD dst,src - AdunareAciune: 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, m32src: r8, r16, r32, m8, m16, m32, n, nn, nnnn

    INC dst -IncrementareAciune: dst = dst + 1Operand: r8, r16, r32, m8, m16, m32

    SUB dst,src - ScdereAciune: dst = dst - src;Operanzi: dst: r8, r16, r32, m8, m16, m32

    src: r8, r16, r32, m8, m16, m32, n, nn, nnnnExemplul 5.1:mov al,33h;Desc zutulmov bl,44h;este mai mic decat scztorulsub 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,33mov bl,44sub al,bl ;La aceast scdere apare mprumutsbb cl,al ;Acesta e luat n consideraie aici

    DEC dst -Decrementare

    44

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    45/255

    Aciune: dst = dst + 1Operand: r8, r16, r32, m8, m16, m32NEG dst -Negare aritmeticaAciune: dst = - dst ( se obine complementul fa de doi)Operand: r8, r16, r32, m8, m16, m32Descriere: Instruciunea NEG genereaza complementul fa de 2 al

    opernadului adic numrul respectiv cu semn schimbat. CF este setat automat, cuexcepia cazului cnd Operandul este 0.

    Exemplul 5.3:

    mov al,0EFh;In complement fata de 2 este negativneg 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 biidst 0FFFFFFFFh - dst ; pentru Operand de 32 bii

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

    Descriere: Instruciunea NOT inverseaz operandul; orice 1 devine 0 iviceversa. 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,m8Dac AH = 0 atunci CF 0; n celelalte cazuri CF 1 iOF CF

    -src de 16 bii: DX: AX AX * src16; src: r16,m16Dac DX = 0 atunci CF 0; n celelalte cazuri CF 1 iOF CF

    45

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    46/255

    - src de 32 bii: EDX: EAX EAX * src32; src: r32,m32Dac EDX = 0 atunci CF 0; n celelalte cazuri CF 1 iOF 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 registrucu 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 fimemorat 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 iOF CF

    - src de 16 bii: DX: AX AX * src16; src: r16,m16Dac 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,m32Dac 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), ncazul instruciunii IMUL este posibil ca denmulitul s fie i alt registru n afar deacumulator, iar sursa poate s fie o valoare numeric imediat. n acest caz ns, dacrezultatul are mai muli bii dect registrul care conine denmulitul, se pierd biiicare depaesc lrgimea acestuia. Aciunea este urmtoarea:

    - IMUL dst,srcdst dst * src; (dst= r16; src=r16/m16 /imm8/imm16)

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

    46

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    47/255

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

    - IMUL dst,srcdst dst * src; (dst= r32; src=r32/m32 /imm8/imm32)

    Dac DX = 0 sau AH = FF atunci CF 0; n celelalte cazuri CF 1 iOF 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 locaiede 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, AXrespectiv EAX, sau impartitorul este 0, se genereaza ntrerupere 0 (DE - DivideError) i se sare automat din program. De aceea trebuie facuta o evaluare prealabila adomeniului de valori ale rezultatului i trebuie folosit un registru destinaiecorespunztor.

    Dac ctul este subunitar, el este ajustat la 0.Indicatorii de condiii sunt nedefinii.

    Exemplul 5.5:

    mov ax, 0F0hmov cl,10div cl; Se imparte AX la CL(8bii). Ctul este in AL iar restul in AH

    Exemplul 5.6:

    mov ax, 0F0hmov cl,5

    47

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    48/255

    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,0F0hmov cl,5mov dx,0 ; Se pregateste ca deimpartitul sa fie in

    ;perechea DX:AXmov 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 dememorie.

    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, AXrespectiv EAX, sau mpritorul este 0, se genereaz ntreruperea 0 (DE - DivideError) i se sare automat din program. De aceea trebuie facut o evaluare prealabil adomeniului de valori ale rezultatului i trebuie folosit un registru destinaiecorespunztor.

    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 pstraresemn. Aciune: AL 7 = 0 => AH =0;

    AL 7 = 1 => AH =0FF;

    48

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    49/255

    CWD - Conversie de la Word (16 bii) la Dword (32 bii) cu pstraresemn. 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 nAL, BX, CL, respectiv DL, constanta 99h n memorie la adresa indicat de BX, apois adune coninutul registrelor AL,CL i DL ,s scad rezultatul din memorie de laadresa 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. Dacoctetul 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 itermin 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, BLrespectiv CL S se incrementeze coninuturile acestor registre i s se nmuleascapoi ntre ele. Se va verifica rezultatul cu aplicaia Calculator.

    Indicaii:

    Atunci cnd denmulitul este (sau poate fi) de doi octei, nmulirea trebuiefacuta cu un nmulitor care ocup un registru de 16 bii, chiar dac nmulitorul estede 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 iCX=5566. Sa se nmuleasc aceste registre ntre ele iar rezultatul s se trimit nmemorie la adresa 20h.

    Indicaii:

    49

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    50/255

    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 semparta 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 unregistru i se va aduna cu CARRY la cei 16 bii mai semnificativi.

    50

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    51/255

    Lucrarea de laborator nr. 6Operaii 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.

    NOT dst - Complementare fa de 1 a fiecrui bit din Operanduldestinaie, dstn .

    Aciune: dstn1-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 idstn bitul n al operandului surs, respectiv destinaie. Rezultatul nlocuiete primuloperand.

    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 doioperanzi. Un bit al rezultatului este 1 dac ambii bii corespunztori ai operanzilorsunt 1; altminteri, bitul este 0. Rezultatul operaiei este sters i doar flagurile suntmodificate. 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.

    51

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    52/255

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

    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 suntdiferii; bitul rezultatului este 0 dac biii corespunztori sunt identici. Rezultatulnlocuiete primul operand.

    6.2. Deplasri i rotaii

    SHL dst,[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.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 frsemn).Aciune:

    MSB LSB C

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

    52

    0

    0

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    53/255

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

    SAL src,[nr]-Deplasare aritmetic spre stnga cu nr poziii (numere cusemn).

    Aciune:C MSB LSB

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

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

    SAR src,[nr]-Deplasare aritmetica spre dreapta cu nr pozitii (numere cusemn)

    Aciune:MSB LSB C

    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] poziiiAciune:

    C MSB LSB

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

    ROR src,[nr]-Rotatie prin carry spre dreapta cu [nr] poziiiAciune:

    MSB LSB C

    53

    0

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    54/255

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

    RCL src,[nr]-Rotatie cu carry spre stnga cu [nr] poziiiAciune:

    C MSB LSB

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

    RCR src,[nr]-Rotatie cu carry spre dreapta cu [nr] pozitiiAciune:

    MSB LSB C

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

    Descriere: Fiecare instruciune de rotaie deplaseaz biii operandului deregistru sau memorie dat. Instruciunile de rotaie spre stnga deplaseaz toti biiictre poziia cea mai semnificativ (catre MSB) ,exceptnd bitul din poziia cea maisemnificativ, care este mutat n poziia cea mai puin semnificativa (LSB).Instruciunile de rotaie spre dreapta acioneaz invers: biti sunt deplasai ctrepoziia cea mai puin semnificativ iar bitul din poziia cea mai puin semnificativajunge 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 maisemnificativ bit n flagul CF; instruciunea RCR deplaseaza flagul CF n bitul cel maisemnificativ i bitul cel mai puin semnificativ n flagul CF. La instruciunile ROL iROR, valoarea flagului CF nu este parte a rezultatului, dar flagul CF recepioneaz ocopie 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 indicatde 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.

    54

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    55/255

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

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

    SHL BP,8SHL DX,6SHR 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 memoriavor fi ncrcate astfel: AX=1122h, Bx=10h, CX=3344h, DX=5566, [BX]=99AAh,BP= 77h.

    55

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    56/255

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

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

    P 6.3 S se scrie un program care s copieze biii 2 i 3 ai lui BL=0A6h naceleasi 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 dinmemorie, ncepnd de la adresa 10h , cei 4 bii inferiori ai lui DL=05 (bitul 0 n primalocaie, bitul 1 n a doua locaie, .a.m.d.).

    P 6.5 S se scrie un program care s inverseze semioctetul superior al luiBL=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 registruluiBP, folosind deplasri spre stnga. Aceast operaie este necesar pentru calcululadresei unui punct din memoria ecran n modul grafic 320 x 200 i va fi folositfrecvent n programele de afiare grafic. Rezultatul pentru BP=77h va trebui s fie94C0h.

    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 douregistre 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 coninutuluiregistrului BP folosind deplasri spre stnga. Aceasta operaie este necesar pentrucalculul adresei unui punct din memoria ecran n modul grafic 640 x 480 i sefolosete frecvent n programele de afiare grafica. Rezultatul pentru BP=33h vatrebui s fie 7F80h.

    56

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    57/255

    Lucrarea de laborator nr. 7Instruciuni de salt

    7.1 Instruciuni de salt necondiionat

    Mnemonic: JMP adr -salt necondiionatAciune : PC adrSalturile de acest tip pot fi absolute sau relative, cu adresa dat direct sau

    coninut ntr-un registru sau locaie de memorie, n acelasi segment sauintersegment, etc. Pentru lista complet a tipurilor de salt necondiionat se poateconsulta Anexa 1 de la sfritul lucrrii. ntr-o prim instan se vor folosi numaisalturi simple, cu adresa specificat sub forma de etichet, iar asamblorul ilinkeditorul vor transpune automat argumentul saltului. n general numai n ModulProtejat este nevoie de toate instruciunile prezentate n lista complet.

    7.2 Instruciuni de salt condiionatMnemonic: Jcc deplasament, unde cc reprezint condiia testat.Aciunea:

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

    Dac condiia este fals , PCPC+n, unde n este numrul de octei aiinstruciunii de salt (aceasta este ignorat i se continu cu instruciuneaurmtoare).

    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 nafara segmentului, se va folosi instruciunea de salt relativ cu condiia invers i dupea o instruciune de salt necondiionat intersegment.

    57

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    58/255

    n funcie de indicatorii de condiii testati de instruciunea de salt, existurmtoarele tipuri de salturi condiionate (cu variantele echivalente scrise nparanteze).

    JP adr (JPE adr) Jump ifParity - salt condiionat de paritate par.JNP adr (JPO adr) Jump ifNot Parity - salt condiionat de paritate impar.

    JO adr - Jump ifOverflow- salt condiionat de OF =1 - a fost depire.JNO adr - Jump ifNot Overflow- salt condiionat de OF = 0 - nu a fost

    depire .

    JS adr Jump ifSign bit- salt condiionat de SF=1 - rezultatul a fost negativ.JNS adr - Jump ifNo Sign bit - salt condiionat de SF = 0 rezultatul a fost

    pozitiv.

    JE adr (JZ adr) Jump ifEqual (Jump ifZero flag) - salt condiionat deZF=1 - egalitate la comparaia anterioara.

    JNE adr (JNZ adr) - Jump if Not Equal (Jump if No Zero flag) - saltcondiionat 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 ifLess (Jump ifNot Greater or Equal) - salt

    condiionat de SFOF (SF xor OF = 1) - mai mic la comparaia anterioar a unorvalori cu semn.

    JLE adr (JNG adr) - Jump if Less or Equal (Jump if Not Greater) saltcondiionat de ZF=1 sau SFOF - mai mic sau egal la comparia anterioar aunor valori cu semn.

    JG adr (JNLE adr) Jump ifGreater (Jump ifNot Less or Equal) - saltcondiionat de ZF=0 i SF=OF - mai mare la comparaia anterioar a unor valori cu

    semn. JGE adr (JNL adr) Jump ifGreater orEqual (Jump ifNot Less) - saltcondiionat de SF=OF - mai mare sau egal la comparaia anterioar a unor valori cusemn.

    Pentru compararea numerelor fr semn se folosesc atributele Below iAbove:

    58

  • 8/8/2019 Programarea in Limbaj de Asamblare a Microprocesoarelor

    59/255

    JB adr (JNAE adr , JC adr) Jump ifBelow (Jump ifNot Above orEqual) -salt condiionat de CF = 1 - mai mic la comparaia anterioar a unor valori fr semnsau transport la operaia anterioar.

    JBE adr (JNA adr) Jump ifBelow orEqual (Jump ifNot Above) - saltcondiionat de CF=1 sau ZF=1 - mai mic sau egal la comparaia anterioar a unorvalori fr semn.

    JA adr (JNBE adr ) Jump ifAbove ( Jump ifNot Below orEqual) - saltcondiionat de CF =ZF = 0 - mai mare la comparaia anterioar a unor valori frsemn.

    JAE adr (JNB adr , JNC adr) Jump if Above orEqual (Jump if NotBelow, Jump if Not Carry) - salt condiionat de CF=0 - mai mare sau egal lacomparaia anterioar a unor valori fr semn sau nu exist transport la operaiaanterioar.

    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, nafara instruciunilor de salt i instruciunile specializate pentru ciclare LOOP i

    LOOPcc. Acestea folosesc implicit registrul contor CX, pe care l decrementeazautomat la fiecare execuie i, dac acesta nu a ajuns la 0, execut saltul la adresaspecificat.

    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 ocomparaie sau scdere cu operanzi egali).

    Mnemonic: LOOPNE rel8 (cicleaz atta timp ct nu exist egalitate).Aciune: DEC CX; jump short if co