You are on page 1of 256

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 TD


Etapele dezvoltrii unui program n limbajul de asamblare sunt urmtoarele: 1. Editarea 2. Asamblarea 3. Linkeditarea 4. Rularea i eventuala depanare Programul n limbaj de asamblare este scris mai nti cu un editor de text oarecare, constituind aa-numitul program surs. El trebuie s respecte dou categorii de reguli: Reguli specifice setului de instruciuni ale procesorului pentru care este scris. Aceste reguli cuprind scrierea corect a mnemonicelor instruciunilor, a operanzilor, diverse prefixe i notaii suplimentare, toate fiind precizate n documentaia referitoare la procesorul respectiv. Reguli specifice programului asamblor cu care se lucreaz. Aceste reguli se refer la declaraii, etichete, directive de asamblare, pseudoinstruciuni, eventual macroinstruciuni, etc. Ele sunt precizate n documentaia aferent mediului de asamblare. Dup scrierea programului surs, el este incrcat n asamblor care l transforma n final n program obiect. n plus, din procesul de asamblare se pot obine i alte fiiere, care permit vizualizarea programului, a simbolurilor folosite, etc. Programul obiect este la rndul su preluat de linkeditor, fiind transformat 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 registre


2.1 Elemente ale limbajului de asamblare Programul surs este format dintr-un numr de linii, care pot fi: Directive de asamblare Etichete i declaraii de simboluri Comentarii Linii de instruciuni O linie de instruciune a programului surs are urmtoarea structur:

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

unde: Parantezele acolade indic un cmp opional; Semnul _ indic un separator, care poate fi format din spaii sau tab-uri; ntre Operand1 i Operand2, separatorul este de regula o virgul; Eticheta este un grup de caractere care ncepe cu o litera i nu coincide cu un cuvnt rezervat. Ea trebuie urmat de semnul : atunci cnd se afl la nceputul liniei. Cnd este referita ca operand (de exemplu la o instruciune de salt), ea nu mai este urmat de acest semn. Exemple: Eticheta1, Loop15, Salt, Label, L22, etc. Mnemonicul este o prescurtare a descrierii instruciunii i este conform cu setul de instruciuni al procesorului; Operandul poate fi un nume de registru, o constant numeric (date sau adrese), sau o etichet, conform descrierii instruciunii respective; Prefixele dau precizri suplimentare despre operanzi, conform descrierii instruciunii respective; Comentariul este opional i trebuie precedat de semnul ; . Tot ceea ce urmeaz pe o linie dup acest semn este ignorat de asmblor. Toate programele care urmeaz a fi asamblate cu macroasamblorul TASM vor avea o parte de preambul minimal, de forma: .model small .stack 100h .code start: -------------- 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 memoria


3.1 Componentele unei adrese logice Pentru a modulariza blocurile de memorie folosite de diverse task-uri i pentru a nu trebui specificat pe tot parcursul unui program o adresa logica de 32 de bii, arhitectura procesoarelor Intel x86 folosete procedeul segmentrii. Astfel, spaiul de memorie este mparit n blocuri de maxim 64 KB n Modul Real (respectiv 1 MB sau 4 GB n Modul Protejat), blocuri numite segmente. Aceasta permite ca n Modul Real specificarea unei adrese de memorie s se fac prin numai 16 bii, considerai ca fiind poziia locaiei respective de memorie fa de baza segmentului n care se afl. Acesti 16 bii formeaz adresa efectiv sau deplasamentul (offset). Ne vom referi n continuare, dac nu se va specific altfel, numai la Modul Real de funcionare.

Segment n . . . . . 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 memoria


Deoarece numrul registrelor de uz general este mic, de multe ori este necesar ca anumite rezultate intermediare sau alte variabile s fie stocate n memorie. Pentru efectuarea de trensferuri cu memoria sunt utilizabile mai multe soluii. 4.1 Transferuri prin adresare la memorie. n acest caz, adresa efectiv este specificat de program, folosind unul din modurile de adresare prezentate anterior. Metoda va fi folosit atunci cnd se dorete cunoaterea adresei de memorie respective, ea fiind impus de algoritm. De exemplu, dac se dorete scrierea n memoria ecran care ncepe la adresa A000h, adresa efectiv unde se va scrie poate fi specificat explicit de program. 4.2 Transferuri prin stiv Pentru salvarea n memorie i readucerea din memorie a unor registre se pot folosi instruciunile complementare PUSH rs i POP rd. Instruciunea PUSH rs: Mnemonic: PUSH rs: Efect: Mai nti, registrul SP este decrementat cu 2. Apoi, coninutul registrului surs dublu rs este trimis n memorie (n stiv) la adresa specificat de registrul SP (stack pointer). SP SP-2. [SP] rsL [SP+1] rsH POP rd: Efect: Mai nti, coninutul registrului destinaie dublu rd este incrcat din memorie (din stiv) de la adresa specificat acum de registrul SP (stack pointer). Apoi, registrul SP este incrementat cu 2. rdL [SP] rdH [SP+1] SP SP+2.

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


Exist urmtoarele tipuri de operaii efectuate de ALU: aritmetice; logice; deplasri i rotaii;

Toate acestea afecteaz corespunztor unul sau mai muli din urmtorii indicatori de condiii: CF (Carry Flag) - indicator de transport -reflect transportul n exterior al bitului cel mai semnificativ al rezultatului operaiilor aritmetice.Acest indicator poate fi folosit n cazul adunrii sau scderii numerelor pe mai muli octei, semnificind n primul caz transport la adunare i n al doilea caz mprumut la scdere. Indicatorul CF nu este modificat de instruciuni de incrementare i decrementare. PF (Parity Flag) -indicator de paritate - este poziionat pe 1 dac rezultatul are un numr par de bii 1. AF (Auxiliary Carry Flag) - indicator de transport auxiliar - este poziionat n 1 dac a fost transport de la nivelul inferior la nivelul superior al octetului rezultatului (de la bitul 3 la bitul 4). Acest indicator se folosete n programele de calcule n aritmetic zecimal. ZF (Zero Flag) - indicatorul de zero - este poziionat n 1 dac rezultatul operaiei a fost zero. SF (Sign) indicatorul de semn - este poziionat n 1 dac cel mai semnificativ bit al rezultatului (MSB) este 1, adic dac n reprezentarea numerelor n complement fa de 2 rezultatul este negativ. OF (Overflow Flag) - Indicator de depire aritmetic (a gamei de valori posibil de reprezentat) - este poziionat n 1 dac dimensiunea rezultatului depete capacitatea locaiei de destinaie i a fost pierdut un bit (la valorile cu semn se altereaz semnul). 5.1 Reprezentarea n complement fa de 2 Toate structurile algebrice presupun existena unui element simetric fa de operaia de adunare, definit prin relatia: numr+simetric =0 n notaia zecimala obisnuita, avem de exemplu: - 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 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 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 lucru
Iniial, n partea de nceput a programelor urmtoare, registrele i memoria vor fi ncrcate astfel: AX=1122h, Bx=10h, CX=3344h, DX=5566, [BX]=99AAh, BP= 77h. P 6.1 S se scrie un program care s transforme n 0 biii lui AX=0EEEEh cu excepia biilor 0..3. Aceast operaie va fi denumit n continuare Mascare a biilor 4..15. Rezultatul mascrii va fi memorat n DX iar AX va trebui s rmn la valoarea iniial. - 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 salt


7.1 Instruciuni de salt necondiionat Mnemonic: JMP adr - salt necondiionat Aciune : PC adr Salturile de acest tip pot fi absolute sau relative, cu adresa dat direct sau coninut ntr-un registru sau locaie de memorie, n acelasi segment sau intersegment, etc. Pentru lista complet a tipurilor de salt necondiionat se poate consulta Anexa 1 de la sfritul lucrrii. ntr-o prim instan se vor folosi numai salturi simple, cu adresa specificat sub forma de etichet, iar asamblorul i linkeditorul vor transpune automat argumentul saltului. n general numai n Modul Protejat este nevoie de toate instruciunile prezentate n lista complet. 7.2 Instruciuni de salt condiionat Mnemonic: Jcc deplasament, unde cc reprezint condiia testat. Aciunea: Dac condiia este adevarata, PCPC+deplasament (se execut saltul la noua adres). Dac condiia este fals , PCPC+n, unde n este numrul de octei ai instruciunii de salt (aceasta este ignorat i se continu cu instruciunea urmtoare).

Salturile condiionate sunt salturi relative, deci adresa de salt este dat de suma ntre coninutul curent al PC i deplasamentul specificat de instruciune. Deplasamentul admis de unele asambloare este cu numai 8 bii, astfel ca operandul adr trebuie s difere de adresa curenta cu maxim +/- 128 octei. Procesoarele de la I-386 n sus admit i salturi relative cu depalasament pe 16 sau 32 de bii, dar numai n interiorul aceluiai segment. Dac se dorete saltul n afara segmentului, se va folosi instruciunea de 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 SF<>OF (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 SF<>OF - 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 iruri


n 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: Reamintim ca dup ncrcarea lui DS, zona de memorie afiat n fereastra DUMP va fi cea a segmentului ES. Pentru a vedea segmentul de date, se d comanda Dump din submeniul View, avnd activ fereastra CPU. 8.2 Instruciunile MOVSB i MOVSW Aceste instruciuni combin instruciunile LODSB i STOSB, respectiv LODSW i STOSW, fr a afecta AL sau AX. Mnemonic: Aciune: MOVSB - Mut un octet de la adresa DS:SI la adresa ES:DI. [DS][SI]. SISI +1 dac DF=0, SISI-1 dac DF=1. DIDI +1 dac DF=0, DIDI-1 dac DF=1. MOVSW - Mut un cuvnt de la adresa DS:SI la adresa ES:DI [DI][SI]. [DI+1][SI+1]. SISI +2 dac DF=0, SISI-2 dac DF=1. DIDI +2 dac DF=0, DIDI-2 dac DF=1. - 64 -

cld

Mnemonic: Aciune:

Exemplul 8.2: n exemplul 8.1 se pot nlocui instruciunile LODSB i LODSW cu MOVSB ca n secvena: . . . bucla: movsb

;Un octet din blocul surs ;este trimis la destinaie loop bucla ;Decrementeaza CX i sare la ;eticheta "Bucla" pn cnd CX ajunge la 0

term: jmp term end start Instruciunile MOVSB i MOVSW admit prefix de repetare, REP. n felul acesta instruciunea precedat de REP este executat de attea ori ct se afl n registrul CX (maxim 65536 ori). Aceali exemplu poate avea partea final scris n felul urmtor: Exemplul 8.3: . . . bucla: REP movsb ;un numr de octei egal cu ;coninutul registrului CX sunt citii ;din blocul surs i trimii la destinaie term: jmp term end start Modul de lucru P 8.2 Sa se modifice programul de la punctul 6.1 pentru a folosi prefixul REP i instruciuni care s nu afecteze coninutul lui AX .

- 65 -

8.3 Instruciunile pentru analiza coninutului irurilor, SCASB i SCASW Mnemonic: SCASB - Compar coninutul registrului AL cu coninutul locaiei ES:DI i poziioneaz corespunztor flagurile. Aciune: AL - [ES:DI]. Mnemonic: SCASW - Compar coninutul registrului AX cu coninutul locaiei ES:DI i ES:DI+1 i poziioneaz corespunztor flagurile. Aciune: AL - [ES:DI]. AH - [ES:DI+1]. Instruciunea SCASB compar octetul din locaia de memorie cu adresa ES:DI cu coninutul lui AL i poziioneaz indicatorii de condiii n funcie de rezultatul comparrii. Registrul DI va fi incrementat cu 1. Instruciunea SCASW compar cuvntul punctat de locaia de memorie cu adresa ES:DI (octetul inferior fiind la aceast adres, iar cel superior la cea urmtoare), cu coninutul lui AX i poziioneaz indicatorii de condiii n funcie de rezultatul comparrii.Registrul DI va fi incrementat cu 2. n conformitate cu regulile aritmeticii n complement fa de 2 (numerele negative au bitul cel mai semnificativ 1 iar scderea cu rezultat negativ d un mprumut) , dac numrul din memorie este mai mic dect cel din registru, indicatorii C (transport la adunare i mprumut la scdere) i S (semn) se poziioneaz n 1 . Dac numrul din memorie este mai mare dect cel din cu cel din registru, indicatorii C i S se poziioneaz n 0. Dac numrul din memorie este egal cu cel din registru, se poziioneaz n 1 indicatorul Z. Exemplul 8.4 Programul prezentat n continuare efectueaz urmtoarele: - Declar un ir de 15 octei cu numere ntregi cresctoare de la 1 la 5; - ncarc n AL constanta 04; - Numr de cte ori apare aceast constant n ir (compar pe rnd coninutul lui AL cu fiecare din locaiile irului declarat i incrementeaza BH de cate ori este gsit constanta respectiv). .radix 16 .model small .stack 100h .DATA BlocSursa db LB equ

3 dup(1,2,3,4,5) $-BlocSursa ;Asamblorul ;calculeaza lungimea blocului - 66 -

;ncarc n ES segmentul de ;date (pentru SCASB) mov di, offset BlocSursa ;ncarc n DI adresa ;irului(Pentru SCASB) mov cx, LB ;n CX lungimea irului mov al,4 ;Constanta de comparat mov bh,0 ;Valoare iniiala contor bucla: scasb ;Compar AL cu un octetul de ;la [ES:DI] din ir jnz conti ;Daca nu e egalitate sare inc bh ;Daca e 4, incrementeaza BH conti: loop bucla ;Reluare dac nu s-a terminat term: jmp term end start

.code start: mov ax,@dat mov ds,ax mov es,ax

Observaii: - Instruciunea MOV DS,AX nu este necesar dect pentru a putea vizualiza n TD irul declarat n memorie (cnd fereastra CPU este activat, cu View-> Dump). Totui, dac nu se introduce aceasta instruciune, prima instruciune din bucl va trebui scrisa n forma MOV BL,ES:[DI]pentru a se citi din segmentul de date. -Nici instruciunea de ncrcare n BL a octetului ce se compara nu este n mod normal necesar (dac o folosim, s-ar putea face comparaia fr SCASB). Aici ea a fost introdus n scop didactic, pentru a putea vizualiza n fiecare moment termenii de comparat. -Simbolul LB a fost introdus pentru a putea calcula automat lungimea blocului. Simbolul $ n limbaj de asamblare desemneaz adresa curent. -Dac era cunoscut lungimea blocului, ea se putea declara explicit (de exemplu LB equ 0F). Modul de lucru P 8.3 Se va rula pas cu pas programul din exemplul 6.3 i se va observa la fiecare comparaie eventuala schimbare a indicatorilor de condiii

- 67 -

P 8.4 Se va modifica programul de mai sus pentru a introduce un ir de cel puin 20 de caratere oarecare i a contoriza n BH numrul de apariii ale caracterului 'a'. Indicaie: Caracterele sau irurile de caractere se scriu ntre apstroafe, de exemplu: 'ghafs3yDGfa'. P 8.5 Se va modifica programul de mai sus pentru a contoriza n BH numrul de apariii ale unui subirului 'fa' n irul 'ghfafasfasfahsyfhhhsaad'. Indicaii: - n final, va trebui s avem BH=4; - Se va folosi instruciunea de comparaie SCASW, deci n AX va trebui incrcat subirul 'af', (caracterele s-au inversat conform conveniei "little-endian"- v. lucrarea de laborator 3); - Instruciunea SCASW va incrementa DI cu 2, deci s-ar putea pierde subirul care ncepe de la o pozitie par (caracterele 8 i 9). Pentru a se cauta din unu n unu, imediat nainte de ultima instruciune a buclei se va decrementa DI cu 1, pentru a se compensa saltul de 2 al DI. 8.4. Instruciunile de comparare iruri CMPSB i CMPSW Mnemonic: CMPSB - Compar coninutul locaiei DS:SI cu continutul locaiei ES:DI i poziioneaza corespunztor flagurile. [DS:SI] - [ES:DI] Aciune: SISI +1 dac DF=0, SISI-1 dac DF=1 DIDI +1 dac DF=0, DIDI-1 dac DF=1 Mnemonic: CMPSW - Compar coninutul locaiilor DS:SI i DS:SI+1 cu coninutul locaiilor ES:DI i ES:DI+1 i poziioneaz corespunztor flagurile. Aciune: [DS:SI] - [ES:DI] [DS:SI+1] - [ES:DI+1] SISI +2 dac DF=0, SISI-2 dac DF=1 DIDI +2 dac DF=0, DIDI-2 dac DF=1 Pentru instruciunea de comparaie CMPSB primul operand este locaia de memorie cu adresa efectiv dat de registrul index surs SI i adresa de segment dat de DS iar al doilea operand este locaia de memorie cu adresa efectiv dat de registrul index destinaie DI i adresa de segment dat de ES. Pentru instruciunea de comparaie CMPSW primul operand este dat de locaiile de memorie cu adresele DS:SI (octetul inferior) i DS:SI+1 (octetul superior)

- 68 -

iar al doilea operand este dat de locaiile de memorie cu adresele ES:DI (octetul inferior) i ES:DI+1 (octetul superior). n urma efecturii unei astfel de instruciuni, registrele index SI respectiv DI se modifica n funcie de starea flagului DF (de direcie). Dac DF este 0, registrele index vor fi incrementate cu 1 la CMPSB i cu 2 la CMPSW. Dac DF este 1, registrele index vor fi decrementate cu 1, respectiv cu 2. n exemplul urmtor se arat utilizarea unor astfel de instruciuni la compararea a dou zone de memorie. Programul numar n BH cazurile de coinciden a unui caracter dintr-un ir cu caracterul din aceeai poziie din al doilea ir. Exemplul 8.5 .radix 16 .model small .stack 100h .DATA Sir1 db 'ghfafasfasfahsyfhhhsaad' LB equ $-Sir1 ;Lungimea este dat de irul 1 Sir2 db 'ahgfasgfasjkhajhasdjgdd' .code start: mov ax,@dat mov ds,ax ;ncarc n DS segmentul de date mov es,ax ;ncarc n ES segmentul de date mov i, offset Sir1;ncarc n SI adresa irului 1 mov di, offset Sir2;ncarc n DI adresa irului 2 mov cx,LB ;Contorul de comparaii n CX bucla: mov dl,[si] mov dh,[di] cmpsb jnz b1 inc bh b1: term: loop bucla jmp term end start - 69 ;Aduce n DL octetul din irul 1 ;i n DH octetul din irul 2 ;(instruciuni n scop didactic, permit vizualizarea elementelor) ;Compar AL cu octetul respectiv ;Dac nu este egalitate, se sare ;Dac s-a gasit egalitate, se ;incrementeaz BH ;Reluare dac nu s-a terminat ;irul 1

Modul de lucru P 8.6 Se va rula pas cu pas programul din exemplul 6.4 i se va urmri cum se modifica registrele i indicatorii de condiii la fiecare comparaie. P 8.7 Se va modifica programul anterior introducandu-se dou iruri de caractere numerice: '6512631827961792' i '7531790734264725'. n BH se va contoriza de cte ori cifrele omoloage coincid, n DL de cte ori cifra din primul ir este mai mic dect cea din al doilea ir, iar n DH de cte ori cifra din primul ir este mai mare dect cea din al doilea ir. 8.5 Prefixele REPE, REPZ, REPNE i REPNZ Instruciunile de comparaie SCASB, SCASW, CMPSB i CMPSW pot fi precedate de prefixele REPE ( echivalent cu REPZ) i REPNE (echivalent cu REPNZ) care cer procesorului s repete instruciunea pe care o preced pn cnd CX devine 0 (prin decrementare automata), sau pn cnd este gasit relaia de ordine specificat de prefixul respectiv. Astfel, pentru: REPE i REPZ - repet att timp ct termenii comparaiei sunt egali (pn cnd apare o diferen); REPNE i REPNZ- repet atta timp ct termenii comparaiei nu sunt egali (pn cnd apare o situaie de egalitate). Modul de lucru Se vor folosi prefixe de repetare pentru urmtoarele programe: P 8.8 S se scrie un program care s indice n BH poziia (numrul de ordine) n irul 'ABCDEFGHIJKL' al caracterului 'E'. P 8.9 S se scrie un program care s indice n BH numrul de ordine al primelor elemente egale n irurile: '123456789' i '987654321'. P 8.10 S se scrie un program care s indice n BH numrul de ordine al primelor elemente omoloage diferite din irurile '112233445566' i 112244335566'.

- 70 -

Lucrarea de laborator nr. 9 Funcii sistem (INT 21h)


9.1 Utilizarea ntreruperilor software Anumite aciuni standard pe care trebuie s le execute un program pot fi realizate mai simplu folosind ntreruperile software i apelul funciilor sistem, BIOS sau BDOS. Acestea sunt colecii de rutine de larg utilitate existente n sistemul de operare i n firmware-ul computerului i care pot fi apelate de orice program. Cele mai utilizate rutine ale sistemului de operare sunt cele apelate prin intermediul ntreruperii 21H. Aceasta se realizeaz cu instruciunea INT 21H, dup ce n prealabil au fost ncarcate unele registre cu parametrii specifici. De exemplu, afiarea unui ir de caractere pe ecran se poate face ca n programul urmtor: Exemplul 9.1: .radix 16 .model small .stack 100h .DATA Sir1 db 'abcdefghij ABC...$'

.code start: mov ax,seg Sir1 mov mov mov int

;Adresa segmentului de date ;unde se afl irul ds,ax ;se ncarc n DS dx, offset sir1 ;Se va apela funcia sistem 09 ;care necesita adresa efectiv ;a irului n DX ah,09 ;Codul funciei sistem n AH 21 ;Se cheam ntreruperea pentru ;funcii sistem

- 71 -

;Ieirea catre sistemul de operare mov ah,4c ;se face cu funcia 4C ;al carei cod se ncarc n AH int 21 ;Se cheam ntreruperea pentru ;funcii sistem end start Observaii: - irul de caractere trebuie s fie scris ntre semne apostrof i, pentru funcia 09, trebuie s se termine cu caracterul $ (dup cum se va arta mai jos). - n locul instruciunii mov ax,seg Sir1 se putea folosi aici i instruciunea mov ax,@data. Dac ns erau mai multe iruri, n segmente diferite, era necesar instruciunea din exemplu. 9.2 Funcii sistem de intrare i ieire Funciile sistem sunt apelate prin execuia ntreruperii 21H, cu anumite valori n registre. Dintre acestea, funciile de intrare de la tastatura sunt: 01H Intrare caracter de la keyboard. 06H Intrare/Ieire caracter de la keyboard/display. 07H Intrare caracter nefiltrat de la keyboard fr ecou. 08H Intare caracter de la keyboard fr ecou. 0AH Intrare de la keyboard n buffer. 3FH Intrare de la dispozitiv sau din fiier. Funciile de ieire la display sunt: 02H Ieire caracter la display. 09H Ieire ir la display. 40H Scriere n dispozitiv de ieire sau fiier. n afara de acestea mai exist i funcii de lucru cu fiierele i cu discul, cu memoria, etc prezentate n Anexa 3. O funcie larg folosit este funcia 4Ch care permite ieirea din program catre sistemul de operare.

- 72 -

01H FUNCTION- Citire caracter de la keyboard cu ecou (afiare automat pe ecran) Registre: AH = 01H Ieire n registre: AL = Caracterul citit n caz c este un caracter cu cod extins, n AL se va obine 0 i va fi necesar fie apelat funcia din nou pentru a se obine codul extins. Exemplul 9.2: . . ;Aici se va citi un caracter de la keyboard MOV AH,01H; Funcia de citire a unui caracter INT 21 H . . 07H FUNCTION- Citire caracter nefiltrat de la keyboard fr ecou Registre: AH = 07H Ieire n registre: AL = Caracterul citit. n caz c este un caracter cu cod extins, n AL se va obine 0 i va fi necesar fie apelat funcia din nou pentru a se obine codul extins.

Exemplul 9.3: . . MOV AH,07H INT 21 H . . Observaie: Funcia 07h nu testeaz caracterul, i nu sesizeaz de exemplu Ctrl+C, astfel c la redirectarea spre un fiier nu este detectat caracterul de sfrit de fiier, i se continu scrierea n fiierul imediat urmtor. Pentru sesizarea Ctrl-C se poate folosi n loc funcia 08h, care face filtrarea i este similara cu 07h n rest. - 73 -

FUNCTION 0AH- Citire de la keyboard n buffer Registre: AH = 0AH. DS:DX = Adresa zonei unde se vor memora caracterele i n care structura datelor va fi urmtoarea: BYTE 0 = Numrul total de caractere care urmeaz s fie citite; BYTE 1 = Numrul de caractere citite pn la un moment dat. De la BYTE 2 pn la [BYTE 0] + 2 = caracterele citite Caracterele vor fi memorate ncepnd cu octetul al treilea al zonei specificate. Terminarea introducerii se face automat cnd s-a citit un numr de caractere egal cu cel specificat n primul octet (moment n care difuzorul va genera un beep) sau cnd se apas tasta ENTER. 3FH FUNCTION Citire din dispozitiv sau fiier Registre: AH = 3FH; BX = Numrul asignat dispozitivului; CX = Numrul de octei care trebuie citit; DS:DX = Adresa zonei n care se va face memorarea. Ieiri n registre: CF = 0 nu au fost erori iar AX = numrul de octei cititi; CF = 1 dac au existat erori iar AX conine codul erorii. 02H FUNCTION - Afiare caracter Registre: AH = 02H; DL = Codul hexa al caracterului de afiat. Exemplul 9.4: ;Afieaz caracterul '1' MOV AH, 02 MOV DL,31h ; Caracterul '1' are codul ASCII 31H INT 21h 09H FUNCTION Afiare ir de caractere Registre: AH = 09H; DS:DX = Adresa de nceput a irului de caractere. - 74 -

Funcia afieaz caracterele unul cite unul pn intilneste caracterul $ care este interpretat ca sfrit de ir. n locul acestei funcii se recomand utilizarea funciei 40H. 40H FUNCTION Scriere n dispozitiv sau fiier Registre: AH = 40H; BX = Numrul dispozitivului ( 1 pentru display); CX = Numrul de octei de scris; DS:DX = Adresa de nceput a irului de scris. Ieiri n registre: CF = 0 dac nu au fost erori; AX = Numrul de octei scrii; CF = 1 dac au aprut erori; AX = codul de eroare. 4CH FUNCTION Ieire ctre sistemul de operare Registre: AH = 4CH; Ieiri n registre: AL = codul de terminare; Modul de lucru: Se recomand ca la programele urmtoare ieirea sa se faca cu funcia 4Ch, ca n exemplul 9.1. Rularea se poate face direct, in care caz revenirea in Windows se face cu Alt+Tab sau cu tasta "Windows" (cea dintre Ctrl si Alt). Se poate face rularea si prin TD, eventual pas cu pas. P 9.1 Se va scrie un program care afieaz la ecran caracterele avnd codurile ASCII cuprinse ntre 30h i 80h. Indicaii: Se va folosi funcia 02. P 9.2 Se va scrie un program care s afieze un ir de caractere la ecran. Indicaii: irurile de caractere se scriu ntre semne apostrof, iar n interiorul unui ir apostroful se dubleaza (de exemplu ntr'adevr se va scrie ca ir sub forma 'ntr''adevr'). Pentru folosirea funciei 09h irul trebuie s se termine cu caracterul $. P 9.3 Program care s afieze dou iruri de caractere pe dou rnduri. - 75 -

Indicaii: Pentru a putea trece la un nou rnd pe ecran, trebuie trimise ctre acesta caracterele 0Dh (Carriage Return - aducere la nceputul rndului) i 0Ah (Line Feed - avans cu un rnd mai jos pe ecran). P 9.4 Se va scrie un program care s citeasc de la tastatur caractere i s le afieze cu ecou la ecran. Dac se apasa tasta ENTER (care genereaz caracterul Carriage Return -ODh), se va afia mesajul 'Citire tastatura incheiata.' (mesajele sunt fr diacritice). Indicaii: Se va folosi funcia 01, care va afia automat caracterul tastat; programul l va afia din nou , de exemplu cu funcia 02, astfel c fiecare caracter va aprea pe ecran dublat - cu ecou. P 9.5 Se va modifica programul precedent pentru afiare fr ecou. P 9.6 Se va scrie un program care s citeasc de la tastatur caractere i s le afieze cu majuscule la ecran. Se va testa varianta cu ecou i cea fr ecou. Indicaii: Codul ASCII pentru majuscule se obine scznd 20h din codul curent. P 9.7 Se va scrie un program care s citeasca ntr-un buffer un ir de caractere (cu funcia 0Ah) i s le afieze (cu funcia 09h) pe linia urmtoare atunci cnd se apas Enter. P 9.8 Se va scrie un program care afieaz pe ecran textul: "Care din urmtoarele registre folosite la adresare indirect, implic segmentul de date? 1. BX 2. BP 3. SI 4. DI" i asteapta un caracter (1..4) de la tastatur. Dac rspunsul este corect s se afieze textul: "Corect", iar dac este greit s afieze textul: "Gresit!! Este BX sau SI!"

- 76 -

Lucrarea de laborator nr. 10 Afiarea n mod grafic


10.1 Utilizarea ntreruperii 10h Plcile grafice au o zon tampon n memoria RAM a crei copie se regsete n ecran. In modul grafic, aceast zon ncepe in general la adresa 0A000H (vezi i Anexa 2 pentru diverse moduri grafice). Orice scriere n memorie n aceast zon se va reflecta asupra ecranului n funcie de modul de lucru ales pentru placa grafic. Stabilirea atributelor ecranului se poate face cu ntreruperea INT 10 H, care ofer mai multe servicii aflate n BIOS n funcie de coninutul lui AH. Menionm n continuare unele dintre acestea, restul funciilor fiind prezentat n Anexa2 : Funcia 0: Stabilire mod de lucru AH = 0; AL = Identificator de mod. Ex: Pentru AL = 10 H modul 640x480x 16 culori; Pentru AL = 13 H modul 320x200x256 culori. Urmtoarea secven va trece ecranul n modul 13H: Exemplul 10.1: ;Mod video 320x200 mov ah,0 mov al,13h int 10h Funcia 06: Defilare ecran AH=06h; AL=Numr de rnduri cu care se face defilarea. Pentru AL=0 se face tergerea ecranului. BH = Atributele liniilor inserate Urmtoarea secven va face stergerea ecranului: Exemplul 10.2: sterge: ;Sterge ecran mov ah,06h mov al,0 int 10h

- 77 -

Funcia 0CH: Afisare punct AH= 0CH; AL= numrul culorii; CX= coordonata x (x=0 n extrema stnga a ecranului); DX= coordonata y (y=0 n extrema superioar a ecranului). Observaie: Funcia 0CH este lent i nu se recomand pentru imagini cu un numr mare de puncte. Urmtoarea secvena afieaz un punct la coordonatele aflate n CX i DX, cu culoarea dat de AL: Exemplul 10.3: afi: mov ah,0Ch int 10h ;Afieaz un punct la x=CX, y=DX i ;culoare=AL ;funcia 0Ch ;cheam funcia bios

Urmtoarea secven afieaz o linie orizontal , la y = DX din puncte cu culori cresctoare. Exemplul 10.4: linie: mov ah,0Ch int 10h inc bh mov shr inc cmp jne ;funcia 0Ch ;call bios service ;Calculeaz culoarea pentru ;urmtorul punct al,bh ;Copie ntr-un alt registru pt ;prelucrare al,5 ;Se iau numai cei 3 bii mai ;semnificativi din registrul de culoare cx ;Calculeaz x pentru urmtorul punct cx,600 ;Se afieaz o linie de 600 puncte linie

Funcia OBH : Stabilire palet de culori AH=0BH; BH=modul (0 pentru chenar, 1 pentru imagine); BL=Numrul paletei (n general ntre 0 i 65).

- 78 -

Exemplul 10.5: Urmtoarea secven stabileste paleta 8 pentru elementele de imagine: ;Paleta mov mov mov int ah,0bh bh,1 bl,8 10h

10.2 Scrierea direct n memoria de ecran Utilizarea ntreruperii 10h pentru afiarea n ecran este destul de lent, i de aceea se recomand scrierea direct n memoria de ecran. Aceasta ncepe la adresa 0A000H n modul grafic i are dimensiuni dependente de rezoluia modului grafic ales. Urmtoarea secven introduce adresa zonei ecran n registrul extrasegment i scrie un dublu octet coninut n CX la coordonatele date de DI: Exemplul 10.6: MOV AX, 0A000H MOV ES, AX MOV ES:[DI], CX Dac se dorete calculul offset-ului (n exemplul de mai sus DI) n funcie de coordonatele dorite X i Y coninute de exemplu n AX respectiv BX se poate folosi o secven de felul urmtor: Exemplul 10.7: MOV DI, X MOV DX, Y ; DI = X ; Se face o copie a lui Y n alt ;registru ; Instruciunile urmtoare fac nmulirea cu 320 SHL BX, 8 ; Shift Y left 8 SHL DX, 6 ; Shift Y left 6 ADD DX, BX ; DX = Y SHL 8 + Y SHL 6 ; Se aduna acum coordonata X ADD DI, DX ; DI = Y x 320 + X MOV AL, Culoare MOV ES:[DI],CX; Afieaz pixelii lui CX

- 79 -

Pentru afiarea unui segment cu AX=x1, BX=y, CX=x2, DL=culoare se poate face transferul in memoria ecran a continutului registrului AL cu instruciunea STOSB ca in exemplul urmator: Exemplul 10.8: PUSH DX SUB MOV MOV SHL SHL ADD ADD POP MOV REP CX, DI, DX, BX, DX, DX, DI, DX AX AX BX 8 6 BX DX ; DX salvat pentru a putea fi utilizat ;n calcule ; CX = X2 - X1 Lungimea segmentului ; DI = X1 ; DX = Y ; Shift Y left 8 ; Shift Y left 6 ; DX = Y SHL 8 + Y SHL 6 ; DI = Y x 320 + X ; Reface vechiul DX, care conine ;culoarea (n DL) ; Culoarea este pus n AL ; Repet stocarea lui AL n CX locaii ; consecutive de la adresa din DI

AL,DL STOSB

Mod de lucru: Pentru testarea programelor care urmeaz, se poate folosi rularea cu TD, ecranul putnd fi vzut dup rulare cu F9, eventual cu comanda User Screen din submeniul View ( Alt+F5). Se recomand ca programele s se ncheie cu o bucl infinit de tipul : term: jmp term deoarece ieirea normal, cu INT 21h poate afecta informaia afiata pe User Screen, n funcie de caracteristicile sistemului de operare folosit. Dac se folosete bucla infinit, ieirea din ea se poate face cu tasta WINDOWS aflat ntre tastele CTRL i ALT, urmat de un click dreapta pe taskul respectiv de pe TaskBar i comanda Close. Este absolut necesar nchiderea acestei ferestre, deoarece altfel memoria rmne ncrcat i la un moment dat poate s fie depit. Oricum, anumite procese rmn ncrcate i dac apare mesaj de depire a memoriei, se va reporni sistemul. P 10.1 Se va scrie un program care s afieze un punct n ecran, la x=100 i y=50, culoarea =2, folosind INT 10H. Indicaie: Mai nti va trebui s se stabileasca modul video 320x 200 ca n exemplul 10.1

- 80 -

P 10.2 Se va scrie un program care s afieze o linie n ecran la x1=50, y1=50, lungimea=100, culoarea=2, folosind INT 10H. Indicaie: se va folosi un contor, CX, care va fi incrementat i se va relua bucla pn cnd CX ajunge la valoarea x1+lungimea. P 10.3 Se va modifica programul 10.2 pentru a afia 50 de linii cu aceiai parametri iniiali, dar cu y cresctor. Indicaie: Se va include bucla anterioar ntr-o nou bucl care l modific pe DX. P 10.4 Se va modifica programul 10.3 pentru a afia linii formate din puncte cu culori cresctoare (linii verticale cu diverse culori). Indicaie: Se va incrementa AL n interiorul buclei care traseaz o linie. P 10.5 Se va modifica programul 10.3 pentru a afia linii cu culori cresctoare (linii orizontale de diferite culori). Indicaie: Se va incrementa AL n exteriorul buclei care traseaz o linie. P 10.6 Se va scrie un program care s afieze un punct de coordonate x1=160, y1=0 i culoare=3, direct prin scriere n memoria ecran, n modul grafic 320 x 200. Indicaie: Dac se pune x1 n DI i culoarea n AL, se poate folosi instruciunea STOSB. Evident, adresa memoriei ecran, 0A000h va trebui s fie n prealabil scris n ES. P 10.7 Se va completa programul pentru a afia o linie orizontal din 200 de puncte ncepnd din colul din stnga sus al ecranului (X1=0, Y1=0), cu culoarea 5. Indicaie: Se poate folosi programul anterior, punnd n CX lungimea liniei i prefixul REPZ la instruciunea STOSB. P 10.8 Se va modifica programul pentru a afia o linie orizontal de 200 de puncte la poziia X1=100, Y1=0. Indicaii: nainte de afiarea liniei, registrul DI care ine adresa punctului va fi incrcat cu X1. P 10.9 Se va modifica programul pentru a afia o linie orizontal de 200 de puncte la poziia X1=100, Y1=1. Indicaie: nainte de afiarea liniei, registrul care reine coordonata iniial, DI, va trebui adunat cu 320 (numrul de puncte dintr-o linie). P 10.10 Se va modifica programul pentru a afia o linie orizontal de 200 de puncte la poziia X1=100, Y1=50. - 81 -

Indicaie: nainte de afiarea liniei, registrul care reine coordonata iniial, DI, va trebui adunat cu Y1*320 (de Y1 ori numrul de puncte dintr-o linie). nmulirea se va face prin deplasri spre stnga, ca n lucrarea de laborator nr. 6. O parte dintr-o realizare posibil a programului este prezentat in continuare: Linieo: mov mov mov mov mov shl shl add add di,x1 ;DI conine X1 bp,y1 ;BP conine Y1 cx,lung ;CX conine numrul de puncte al,culoarea;n AL este culoarea dx,bp ;Se face nmulirea dx,6 ;lui BP (adic a lui Y1) cu 320 bp,8 ;Prin copiere n DX bp,dx ;deplasri la stnga i adunare di,bp ;Deplasamentul obinut se aduna la ;adresa iniial repz stosb ;Se face transferul irului

P 10.11 Se va modifica programul pentru a afia o linie vertical de 50 de puncte la poziia X1=100, Y1=50. Indicaii: Trebuie ca fiecare nou punct s fie pus la o adresa cu 320 mai mare dect cel precedent. Prin urmare, nu mai poate fi folosit instruciunea STOSB, ci trebuie n locul ei o bucl de tipul: lv1: add di,320 ;Noul punct este cu 320 mai ;departe n memoria de ecran mov es:[di],al ;Pune punctul loop lv1 ;Repet de CX ori P 10.12 Se va modifica programul de mai sus pentru a afia o linie oblic spre dreapta jos, cu x1=100, y1=50 i lungimea 50 de puncte. Indicaie: Adresa unui nou punct se obine prin sumare cu 321 (adic 320+1) fa de adresa celui anterior. P 10.13 Se va modifica programul de mai sus pentru a afia o linie oblic spre stnga jos, cu x1=100, y1=50 i lungimea 50 de puncte. Indicaie: Adresa unui nou punct se obine prin sumare cu 319 (adic 320-1) fa de adresa celui anterior. P 10.14 Se va modifica programul de la punctul P 10.11 pentru a afia 100 de linii verticale identice, cu x1 cresctor. Se va obine un dreptunghi plin. Indicaii: - 82 -

Se va folosi un contor (de exemplu BX) care va fi conine iniial 100 i va fi sczut la fiecare trasare a unei linii. Pentru ca linia s nceap de fiecare dat de la acelasi y1, registrul DI care conine adresa primului punct dintr-o linie va trebui salvat la nceputul buclei de linie (care l va modifica), i readus la sfritul buclei, cnd va fi incrementat cu 1 pentru avansul pe x. Dup aceea se va decrementa contorul i se va face saltul condiionat.

- 83 -

Lucrarea de laborator nr. 11 Utilizarea de subrutine (proceduri)


11.1 Chemarea i revenirea din subrutin Atunci cnd anumite poriuni dintr-un program apar de mai multe ori n cuprinsul acestuia, este avantajos ca ele s fie scrise o singura dat, ca subrutine, i s fie apelate atunci cnd sunt necesare. Subrutinele se mai numesc n limbaj de asamblare i proceduri (ca i n alte limbaje de programare). O subrutin ncepe cu o etichet i se termina cu instruciunea RET. Apelul subrutinei se face cu instruciunea CALL avnd ca operand eticheta respectiv. Utilizarea subrutinelor modularizeaz programele i le face mai compacte, mai uor de ineles i de dezvoltat. Totui utilizarea lor ridic unele probleme, n special cele legate de transmiterea parametrilor i modificarea de ctre subrutine a unora dintre registre. Exemplul 11.1: Vom relua un program din lucrarea precedent, pentru a trasa dou linii orizontale n poziii diferite: x1=100, y1=50 i x1=100 i y1=150. .MODEL SMALL .STACK 200H .DATA x1=100 y1=50 lung1=200 culoarea1 =5 x2=100 y2=150 lung2=200 culoarea2 =3 .CODE Start: ;Mod video 320x200 - 84 ;Aici se declar parametrii liniilor

mov ah,0 mov al,13h int 10h MOV MOV AX, 0A000H; Adresa segmentului ecran mod 13 ES, AX ; n ES

;De aici se cheam scrierea primei linii mov mov mov mov call di,x1 ;Parametrii primei linii bp,y1 cx,lung1 al,culoarea1 linieo ;Cheam subrutina de linie

;De aici se cheam scrierea celei de a dou linii mov di,x2 ;Parametrii celei de a dou linii mov bp,y2 mov cx,lung2 mov al,culoarea2 call linieo ;Cheam subrutina de linie oprire: jmp

oprire

;*********** Subrutine******************** Linieo: ;Subrutina de trasare a unei linii orizontale cu ;parametrii DI=x,BP=y,CX=lungimea i AL= culoarea ;Modifica registrele: DX,BP,DI i CX (n STOSB) mov dx,bp shl dx,8 shl bp,6 add dx,bp add di,dx ;S-a stabilit adresa primului punct repz stosb ;Aici se scriu punctele liniei ret ;Rentoarcere n programul apelant END Start - 85 -

Instruciunile subrutinei i apelurile catre ea au fost scrise cu caractere bold pentru a se evidenia procedeul. La nceputul subrutinei s-au scris n comentarii registrele care conin parametrii necesari, precum i registrele modificate n urma execuiei. Aceste precizri, desi par consumatoare de timp, sunt extrem de utile n dezvoltarea programului. Se observ c nainte de apelul subrutinei, registrele au fost ncrcate corespunztor, cu parametrii specifici punctului de apel. Instruciunile de iniializare au fost deci scoase din blocul de trasare a unei linii folosit n programul din lucrarea precedenta, lund forme diferite pentru cele dou apeluri. Se observ de asemenea c blocul folosit anterior modifica pe AX i implicit pe AL, care n mod normal reine culoarea, de aceea i instruciunile de iniializare a lui ES au fost scoase din subrutina. P 11.1 S se ruleze pas cu pas programul din exemplul 11.1 i s se observe evoluia registrelor i a ecranului (cu ALT+F5). Trecerea peste instruciunile repetitive REPZ STOSB se poate face punnd cursorul pe linia imediat urmtoare i dand comanda "Go to cursor" (F4) . Programul se va salva, fiind necesar la punctul 11.3. P 11.2 S se dezvolte programul anterior pentru a trasa un dreptunghi cu vrful din stnga sus la x1=100 i y1=50, lunginea=100 , nlimea =50 i culoarea 5 pentru liniile orizontale i 1 pentru cele verticale. Indicaii: Se va aduga o subrutina de trasare a unei linii verticale i se va apela corespunztor de 2 ori. Programul se va salva, fiind necesar la punctul 11.6. Pentru ca liniile verticale s nu se suprapun peste cea orizontal de sus (dup cum se poate observa), originea lor trebuie s inceapa cu 320 de puncte mai departe i lungimea s fie cu 1 mai mica. Deci nainte de chemarea subrutinei de trasare a liniilor verticale, DI trebuie adunat cu 320 iar CX decrementat. 11.2 Salvarea i refacerea registrelor afectate de subrutin Corpul principal al subrutinelor modific n general coninutul unor registre. Dac subrutina este apelat n mod repetat, aceste modificri pot afecta modul de execuie. De aceea este necesar ca registrele care sunt folosite de subrutina, i al cror coninut este necesar mai trziu, s fie salvate n stiv cu instruciuni PUSH i s fie refcute nainte de ieirea din subrutin cu instruciuni POP n ordine invers, conform principiului de funcionare al stivei. De exemplu, atunci cnd subrutina este apelat dintr-o bucla n care avem contorul n SI, iar subrutina modific registrele DI i BX, se va proceda n felul urmtor:

- 86 -

Exemplul 11.2: . . . mov di,50 mov bx,30 mov i,20 et1: call subrutina add di,5 sub bx,3 dec i jnz et1 . . . subrutina: push di push bx . . . inc di dec bx . . . pop bx pop di ret

;Valoarea iniial a lui DI ;Valoarea iniial a lui BX ;Contorul de chemri subrutina ;Cheam subrutina ;Vechea valoare a lui DI se adun ;cu 5 ;Vechea valoare a lui BX se scade ;cu 3 ;Decrementeaza contorul ;Reia dac contorul nu a ajuns la 0 ;Alte instruciuni ;Subrutina va modifica pe DI i BX ;de aceea se salveaz DI ;i BX ;Urmeaz corpul subrutinei ;n care se modifica DI ;i alte registre

;La sfrit se reface nti BX ;i apoi DI (deci n ordine ;invers)

Se observ c valorile iniiale din registrele DI i BX sunt necesare i n alte pri din programul apelant, dar ele vor fi modificate de subrutina. De aceea ele se vor salva n stiv i se vor reface apoi din stiv, dup principiul ultimul intrat este primul ieit ("Last In First Out" - LIFO). De multe ori, problema modificrii registrelor este dificil, de aceea se recomand scrierea n faza iniial n preambulul subrutinei a registrelor afectate, ca n exemplul 11.1. Dac unele din ele conin valori care vor mai fi necesare, ele se vor salva i se vor reface. - 87 -

Desigur, salvarea se poate face i imediat nainte de apelul subrutinei, iar refacerea imediat dup revenirea din subrutina, sau n alte puncte convenabil alese. P 11.3 S se dezvolte programul anterior pentru a afia un dreptunghi plin cu x1=100,y1=50,l=120,h=60 i culoarea 5. Indicaii: Se va apela n mod repetat, de h ori, subrutina de trasare a unei linii orizontale. Contor poate fi de exemplu registrul BX, care nu este folosit n alt parte. Deoarece subrutina modific registrele CX, DI i BP, acestea se vor salva n stiv la nceputul subrutinei i se vor reface la sfritul ei, ca mai jos: Exemplul 11.3: linieo: ;Linie orizontal push cx ;Salveaz push di ;registrele push bp ;care se vor modifica mov dx,bp ;ncepe trasarea liniei shl dx,8 shl bp,6 add dx,bp add di,dx repz stosb pop bp pop di pop cx ;Reface ;registrele ;care s-au modificat

ret

P 11.4 S se dezvolte programul anterior pentru a afia 20 de dreptunghiuri pline cu x1=20+8n ,y1=50+5n,l=20,h=60 i culoarea n, unde n este numrul dreptunghiului curent. Indicaii: Se va scrie irul instruciunilor de afiare a unui dreptunghi ca o subrutin, i se va apela n mod repetat, de n ori, schimbnd corespunztor parametrii. O posibilitate de realizare a unui program similar este cea de mai jos: P 11.5 S se modifice programul anterior pentru a afia 2000 de dreptunghiuri pline cu parametri aleatori cititi din memorie ncepnd de la adresa DS:500h n felul - 88 -

urmtor: x1=[500h+n] ,y1=[500h+n+1],l=[500h+n+2],h=60 i culoarea [500h+n+3], unde n este numrul dreptunghiului curent. Indicaii: Bucla de afiare a dreptunghiurilor va citi din memorie parametrii fiecrui dreptunghi, deci ei nu mai trebuiesc salvati n subrutina chemat. O posibilitate de realizare a acestei bucle este cea de mai jos: Exemplul 11.4: mov mov dreptnou: mov sub mov sub mov and mov mov call add dec jnz ;nceputul zonei de memorie ;Numrul total de dreptunghiuri ;Mai nti parametrii primei linii di,[bx] ;DI e aici maxim FFFFh=65535 di,65536-320;x1 e acum maxim 320 bp,[bx+1] ;BP e iniial maxim 65535 bp,65536-200;y1 e acum maxim 200 cx,[bx+2] ;CX e iniial maxim 65535 cx,01fh ;Lungimea e acum maxim 32 al,[bx+3] ;AL (culoarea) e maxim 255 ah,h ;Dreptunghiurile au nlimea h dreptunghi ;Afieaz dreptunghiul bx,4 ;Indexul n memorie e crescut cu 4 i ;Numrul de repetri sczut cu 1 dreptnou ;Dac nu s-a ajuns la 0, repet bx,500h i,2000

P 11.6 Sa se combine programul anterior cu cel de la punctul 11.3 pentru ca dreptunghiurile s fie ncadrate de un chenar negru. Indicaii: Pentru parametrii dai, se va trasa mai nti un dreptunghi din patru linii negre i apoi unul colorat cu parametri : x1c =x1+1 (x stnga sus color), y1c=y1+1, lc=l-2, hc=h-2. Deoarece parametrii primului dreptunghi sunt necesari i pentru al doilea, registrele care i conin se vor salva i apoi reface.

- 89 -

Lucrarea de laborator nr. 12 Utilizarea macroinstruciunilor


12.1 Generalitati La fel ca n cazul utilizrii subrutinelor, atunci cnd ntr-un program se folosete de mai multe ori un bloc de instruciuni, acesta poate fi scris o singur dat sub forma unei macroinstruciuni (numit i macrodefinitie) i reutiliza apoi n punctele n care este necesar. Blocul coninut de o macroinstruciune va fi automat inserat n programul obiect n urma procesului de asamblare, ca i cum ele ar fi fost scrise ca atare n programul surs. Acest proces se numete expandare a macroinstruciunii (macroexpandare). Rezult ca utilizarea de macroinstruciuni nu economiseste spatiu n memoria de program, n schimb uureaz munca programatorului. n plus, spre deosebire de subrutine, macroinstruciunile admit parametri explicii, precum i unele directive specifice care cresc productivitatea dezvoltrii programelor. Si din punct de vedere al vitezei, macroinstruciunile sunt preferabile, deoarece elimin necesitatea salturilor suplimentare introduse de subrutine. Aceste salturi penalizeaz puternic viteza procesoarelor care au coad de asteptare n care instruciunile se extrag anticipat n ordine, coad care trebuie golit integral la apariia unui salt. Totui, utilizarea macroinstruciunilor genereaz anumite dificulti, a caror rezolvare va fi prezentat n cele ce urmeaz. 12.2 Declararea i utilizarea macroinstruciunilor Declararea unei macroinstruciuni se face n forma urmtoare: Nume MACRO [parametri formali] [REPT] [IRP] [IRPC] corpul macroinstruciunii ENDM

Termenii pui n paranteze drepte sunt opionali (pot s apar sau s nu apar la o macroinstruciune). Corpul macroinstruciunii conine date, instruciuni, din care unele care se pot referi la eventualii parametri, i chiar alte apeluri de macroinstruciuni sau subrutine.

- 90 -

Unele asambloare cer ca eventualele comentarii din declararea macroinstruciunii s fie precedate n mod obligatoriu de ";;" deoarece la expandare din cele dou caractere ";" va rmne unul singur. Macroinstruciunile se declar de regul la nceputul zonei de cod, nainte de eticheta de intrare n programul principal (START: ). Utilizarea unei macroinstruciuni n program se face prin scrierea numelui acesteia urmat de lista de parametri actuali (cu valorile necesare in punctul respectiv). Nume [parametri actuali] Exemplul 12.1: Fie programul de trasare a unei drepte orizontale cu parametrii x1,y1, lungimea i culoarea din lucrarea 10, punctul P10.10. Scriind irul de instruciuni care traseaz linia ca o macroinstruciune, programul poate fi pus n urmtoarea forma: .MODEL SMALL .STACK 200H .DATA x1=100 y1=50 lung=200 culoarea=5 .CODE ;Aici se Linieo mov mov mov mov mov shl shl add add declara macroinstruciunea de trasare linie macro di,x1 ;DI conine X1 bp,y1 ;BP conine Y1 cx,lung ;CX conine numrul de puncte al,culoarea;n AL este culoarea dx,bp ;Se face nmulirea dx,6 ;lui BP (adic a lui Y1) cu 320 bp,8 ;Prin copiere n DX bp,dx ;deplasri la stnga i adunare di,bp ;Deplasamentul obinut se adun la ;adresa iniial repz stosb ;Se face transferul irului endm - 91 ;Aici se declar parametrii liniilor

Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h MOV AX, 0A000H; Adresa segment ecran n modul 13 MOV ES, AX ;n ES Linieo ;Aici s-a chemat macroinstruciunea oprire: jmp END Start Avnd ns n vedere posibilitile comode de transmitere a parametrilor catre o macroinstruciune, mai corect ar fi ca s se scrie lista de parametri formali la declarare i de parametri actuali la utilizare. De exemplu, un programu care traseaz dou linii ar lua forma urmtoare: Exemplul 12.2: .MODEL SMALL .STACK 200H .DATA x1=50 y1=50 lung=100 culoarea=0Eh .CODE ;Aici se declara macroinstruciunea de trasare linie Linieo macro x1,y1,lung,culoarea; parametrii ;formali mov di,x1 ;DI conine X1 mov bp,y1 ;BP conine Y1 mov cx,lung ;CX conine numrul de puncte mov al,culoarea;n AL este culoarea mov dx,bp ;Se face nmulirea shl dx,6 ;lui BP (adic a lui Y1) cu 320 shl bp,8 ;Prin copiere n DX - 92 oprire

add bp,dx add di,bp repz stosb endm Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h MOV MOV

;deplasri la stnga i adunare ;Deplasamentul obinut se aduna la ;adresa iniial ;Se face transferul irului

AX, 0A000H; Adresa segment ecran n modul 13 ES, AX ;n ES ;Parametrii actuali ai primei ;linii ;Parametrii actuali ai altei ;linii

linieo 10,100,30,2 linieo 20,120,30,1 oprire: jmp END Start

oprire

Observaii: n programul precedent nu era de fapt necesar declararea iniial a unor valori pentru x1,y1, lung i culoarea. Dac aceasta declarare apare, ea nu are nici un efect asupra macroinstruciunii, chiar dac n declararea acesteia s-au folosit aceleai simboluri. Dac ns la utilizarea macroinstruciunii sunt puse aceste simboluri, ele vor lua ca valori actuale cele declarate explicit (50,50,100 i OEh). Modul de lucru. P 12.1 S se scrie i s se testeze programul din exemplul 12.2. Se va observa mai nti n fiierul de listare modul n care macroinstruciunea este expandat n cele dou puncte unde este apelat i cum apar parametrii actuali. Apoi se vor modifica parametrii actuali ai uneia dintre utilizri, folosind simbolurile declarate n partea de date a programului, i se va observa n fiierul de listare cum sunt nlocuite aceste simboluri.

- 93 -

Se va mai declara n partea de date un alt set de simboluri, x1=150,y1=60,lung=30,culoarea=8, care vor fi folosite pentru trasarea unei a treia linii orizontale. 12.3 Utilizarea etichetelor locale cu directiva LOCAL Dac, la declararea unei macroinstruciuni, n corpul acesteia exist etichete catre care se fac salturi, la expandarea n mai multe locuri se vor genera mesaje de eroare de tip "simbol deja utilizat n alt parte". Nu se va mai putea ti catre care din simbolurile identice aparute n urma expandarii s se faca saltul. Pentru a se evita aceast situaie, dac n declararea unei macroinstruciuni se folosesc simboluri, se va folosi nainte de corpul macroinstruciunii directiva LOCAL urmat de lista de simboluri. Nume MACRO [parametri formali] LOCAL simbol1,simbol2, corpul macroinstruciunii ENDM n urma expandrii, simbolurile vor fi renumite automat de catre asamblor sub forma ??0001, ??0002, pn la ??9999 i nu vor mai fi posibile erori. Exemplul 12.3: .MODEL SMALL .STACK 200H .DATA x1=50 y1=50 lung=100 culoarea=0Eh .CODE Liniev macro x1,y1,lung,culoarea local Lv1 mov di,x1 ;DI conine X1 mov bp,y1 ;BP conine Y1 mov cx,lung ;CX conine numrul de puncte mov al,culoarea;n AL este culoarea mov dx,bp ;Se face nmulirea shl dx,6 ;lui BP (adic a lui Y1) cu 320 shl bp,8 ;Prin copiere n DX - 94 -

;deplasri la stnga i adunare ;Deplasamentul obinut se adun la ;adresa iniial Lv1: add di,320 ;Noul punct este cu 320 mai ;departe n memoria de ecran mov es:[di],al ;Pune punctul loop Lv1 ;Repet de CX ori endm Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h MOV MOV AX, 0A000H; Adresa segmentului ecran mod 13 ES, AX ;n ES

add bp,dx add di,bp

liniev x1,y1,lung,culoarea liniev 20,120,30,1 oprire: jmp END Start Se observ c n macroinstruciunea de trasare a unei linii verticale exist o bucla cu eticheta Lv1. Aceasta este declarat cu directiva LOCAL Lv1, astfel c dac este utilizat n mai multe locuri, la expandrile respective simbolul va cpta automat denumiri diferite. Modul de lucru P 12.2 Se va relua programul de desenare a unui dreptunghi din lucrarea precedent (P 11.2) folosind macroinstruciuni. P 12.3 Se va scrie un program care s traseze un triunghi dreptunghic isoscel cu ipotenuza orizontal i unul cu ipotenuza oblic folosind macroinstruciuni pentru linii oblice , orizontale i verticale. oprire

- 95 -

P 12.4 Se va relua programul de afiare a unor dreptunghiuri aleatoare cu parametri din memorie, prezentat n lucrarea precedenta (P 11.5) folosind macroinstruciuni. 12.4 Alte faciliti de macroasamblare Exist o serie de directive suplimentare de macroasamblare care permit un formalism de nivel crescut al scrierii fiierului surs, lsnd macroasamblorului sarcina expandrii la nivel de limbaj de asamblare obinuit. Dei aceste faciliti sunt foarte puternice, ele sunt destul de rar necesare, datorit posibilitilor de integrare a programelor scrise n limbaj de asamblare n programe scrise n limbaj de nivel nalt sau mediu care pot prelua partea formal. Vom da n continuare, succint, numai cteva exemple de astfel de faciliti. Ele depind totui de implementare i se recomand consultarea documentaiei asamblorului de care se dispune pentru a vedea forma sintactic i toate opiunile prezente. Macrodefiniia REPT este folosit atunci cnd corpul macroinstruciunii respective trebuie transcris de mai multe ori. Forma sintactic obisnuit este urmtoarea: REPT expresie Corpul macro care se va repeta ENDM Ca efect, instruciunile din corp se vor repeta de un numr de ori egal cu valoarea expresiei. Expresia poate fi un numr, un simbol care a fost asignat numeric anterior, sau poate fi o structur mai complexa aritmetica sau logica. n macroinstruciuni i expresii se admit diversi operatori cum ar fi & (substituire), <> (ir de caractere pentru texte), ! (ir de caractere), % (expresie), precum i structuri de tip IFELSEENDIF. Alte definiii utile n macroinstruciuni sunt IRP (repetare cu parametri) i IRPC (repetare cu parametru ir). Macroinstruciunile pot fi imbricate (se poate chema o macroinstruciune din corpul alteia) i admit recursivitate - o macroinstruciune se poate chema pe ea insi de atatea ori cte argumente se afl n lista de apel. Ele pot fi de asemenea anulate pe parcursul unui program pentru eliberarea memoriei "heap" (cu directiva PURGE) sau redefinite. Este admis de ctre unele asambloare chiar i folosirea unui nume rezervat pentru numirea unei macroinstruciuni, aprnd ns un mesaj de avertizare. Se recomand ca alte elemente ale limbajului de asamblare s fie consultate n documentaia asamblorului cu care se lucreaz, ele fiind utile atunci cnd se scriu programe deosebit de lungi i complexe exclusiv n limbaj de asamblare. - 96 -

ANEXA 1 SETUL DE INSTRUCIUNI ALE MICROPROCESOARELOR INTEL 80x86 N MODUL REAL SAU VIRTUAL 8086.
A 1.1 Notaii, convenii Notaiile folosite n continuare sunt urmtoarele: Operanzi: - dst: operandul destinaie (al crui loc va fi ocupat de rezultatul instruciunii) - src: operandul surs (care va rmne neschimbat n urma instruciunii) Date numerice (imediate): - de 8 bii - n: 0..0FFh.Notaie echivalent: imm8; - de 16 bii - nn: 0..0FFFFh.Notatie echivalent: imm16; - de 32 bii - nnnn:0..0FFFFFFFFh. Notaie echivalent: imm32; -pentru salturi relative se folosesc notaiile: rel8,rel16,rel32 Registre: - de 8 bii - r8: AL, AH, BL, BH, CL, CH, DL, DH; - de 16 bii - r16: AX, BX, CX, DX, SI, DI, SP, BP,F; - de 32 bii -r32: EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP,EF; - registre de segment - rs: DS, ES, SS, CS. Memoria: - m8: Coninutul unei locaii de memorie adresabil prin adresa efectiv ; - m16: Coninutul a dou locaii consecutive de memorie, formnd un operand de 16 bii (2 octei).Adresa efectiv indic octetul mai puin semnificativ al operandului, iar adresa efectiv +1 indic octetul mai semnificativ; - m32: Coninutul a patru locaii consecutive de memorie, formnd un operand de 32 bii (4 octei) Adresa efectiv indic octetul mai puin semnificativ al operandului, iar adresa efectiv +3 indic octetul mai semnificativ. Observaie: Operanzii de 32 de bii exist numai pentru procesoare ncepnd cu Intel 80386. Dac sunt folosii n programul surs astfel de operanzi, este obligatorie directiva .386 n preambulul programului.

- 97 -

A1.2. Instruciuni de transfer A1.2.1. Transferuri cu memoria i registrele: MOV - copierea datelor Mnemonic: MOV dst, src Aciune: "dst" ia valoarea "src". dst src. Operanzi: dst: r8, r 16, rs, m8, m 16; src: r8, r16, rs, m8, m16, n, nn; Restricii: nu sunt posibile transferuri de tip: - MOV rs, rs - MOV rs, nn - MOV cs,* - MOV m, m. MOVSX - transfer cu extensia de semn ntr-un format mai mare Mnemonic: MOVSX dst,src. Aciune: dst src. Operandul surs este transferat ntr-un registru cu dimensiune mai mare, pstrnd semnul prin transferul bitului de semn n poziia cea mai semnificativ a operandului destinaie. Operanzi: src: m8,r8 => dst:r16,r32; src: m16,r16 => dst:r32. MOVSZ - transfer cu completare cu zerouri ntr-un format mai mare Mnemonic: MOVSZ dst,src. Aciune: dst src. Operandul surs este transferat ntr-un registru cu dimensiune mai mare, completnd cu zerouri biii suplimentari din operandului destinaie. Operanzi: src: m8,r8 => dst:r16,r32; src: m16,r16 => dst:r32. XCHG - interschimbare ntre registre sau ntre un registru i memorie Mnemonic: XCHG dst, src. Aciune: Se interschimb coninuturile dst i src. dst src; src dst. Operanzi: dst: r8, r16,r32; src: r8, r16, m8, m16,m32. Restricii: Nu exist instruciuni de tip: - 98 -

- XCHG rs, rs - XCHG cs, *. Variant: XCHG dst - interschimb cu acumulatorul implicit AL,AX sau EAX (n funcie de mrimea dst). XLAT - translatare n AL cu baza BX Aciune: AL [BX +AL]. n registrul AL se ncarc coninutul locaiei de memorie a crei adres efectiv este dat de suma dintre BX i chiar AL. Adresa de segment este data de DS. LEA - calculul i ncrcarea adresei efective a unei variabile ntr-un registru general Aciune: r AE(mem). Mnemonic: LEA r, mem. Operanzi: r: r16, r32; mem: m16,m32. Dac mrimile operanzilor sunt diferite, se fac automat trunchieri la mrimea operandului cel mai mic. LGS/LSS/LDS/LES/LFS - ncarc un pointer (ca o adresa logic de 32 de bii) din memorie, de la adresa nn, ntr-o pereche format dintr-un registru de segment i un registru de 16 bii. Mnemonic: 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. Observaie: 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 initial a programului trebuie introdus directiva .386.

- 99 -

LAHF - citirea indicatorilor de condiii (octetul inferior al registrului F) n AH Aciune: AH F 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 intreruperi, 1 dac dac ntreruperile sunt activate, 0 dac

nu);

AH0=CF (flagul de transport 1 dac exista transport de la rezultat); Structura octetului inferior al registrului indicatorilor de condiii F este: S Z x A x P x C

SAHF - Salvare AH n registrul de flaguri. Aciune: F AH

SF=AH7 (flagul de semn, 1 dac este minus, 0 dac este plus); ZF=AH6 (flagul de zero, 1 dac este 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 intreruperi, 1 dac dac ntreruperile sunt activate, 0 dac nu); CF=AH0 (flagul de transport 1 dac exista transport de la rezultat); Bitii AH5 i AH3 trebuie s fie 0. A1.2.2. Transferuri cu stiva PUSH - salvarea datelor n stiv Mnemonic: PUSH src. Operand r16, r32, m16, m32. Aciune: Pentru operand de 16 bii: SP SP-2; [SP] src1 (octetul inferior al sursei); [SP+ 1] src2 (octetul superior al sursei); - 100 -

Pentru operand de 32 bii: SP SP-4; [SP] src1 (octetul inferior al sursei); [SP+ 1] src2; [SP+2] src3; [SP+ 3] src4 (octetul superior al sursei). Descriere: Indicatorul de stiv este decrementat cu un numr egal cu numrul de octei ai operandului, dup care operandul este salvat n stiv ncepnd de la adresa coninut acum n indicatorul de stiv. Observaie: Este permis i salvarea din memorie (2 sau 4 locaii consecutive, adresate cu unul din modurile de adresare ). POP - aducerea datelor din stiv Mnemonic: POP dst. Aciune: Pentru operand de 16 bii: dst [SP]; dsth [SP+ 1]; SP SP+2. Pentru operand de 32 bii: SP SP-4; dst1 [SP] (octetul inferior al sursei); dst2 [SP+ 1]; dst3 [SP+2]; dst4 [SP+3] (octetul superior al sursei). Operand: r16 (cu excepia lui CS),r32, m16,m32 Descriere: Registrul sau locaiile de memorie specificate de operand se ncarc cu coninutul locaiilor de stiv a cror adresa de start se afl n indicatorul de stiv. Apoi indicatorul de stiv este incrementat cu un numr egal cu numrul de octei ai operandului. Observaie: Este permis i aducerea din stiv n locaii de memorie (2 sau 4 locaii consecutive, adresate cu unul din modurile de adresare). PUSHF,PUSHFD - salvarea registrului indicatorilor de condiii n stiv, respectiv a registrului extins al indicatorilor de conditii Mnemonic : PUSHF Aciune: SP SP-2 [SP] F1 (octetul inferior al registrului F); [SP+1] F2 (octetul superior al registrului F). - 101 -

Mnemonic: PUSHFD Aciune: SP SP-4; [SP] EF1 (octetul inferior al registrului EF); [SP+1] EF2; [SP+2] EF3; [SP+3] EF4 (octetul superior al registrului EF). POPF, POPFD - aducerea indicatorilor de condiii din stiv , respectiv a registrului extins al indicatorilor de conditii. Mnemonic : POPF Aciune: F1 [SP] (octetul inferior al registrului F); Fh [SP+1] (octetul superior al registrului F); SP SP+2. Mnemonic : POPFD Aciune: F1 [SP] (octetul inferior al registrului EF); F2 [SP+1] ; F3 [SP+2] ; F4 [SP+3] (octetul superior al registrului EF); SP SP+4. PUSHA,PUSHAD- salvarea tuturor registrelor n stiv Mnemonic : PUSHA Aciune: SP SP-16; [SP] AX,CX,DX,BX,SP(valoarea initiala),BP,SI,DI. Mnemonic : PUSHAD Aciune: SP SP-32; [SP] EAX,ECX,EDX,EBX,ESP(valoarea initiala),EBP,ESI,EDI. POPA,POPAD- readucerea tuturor registrelor din stiv Mnemonic : POPA Aciune: [SP] AX,CX,DX,BX,SP(nu se modific),BP,SI,DI; SP SP+16. Mnemonic : POPAD Aciune: [SP] EAX,ECX,EDX,EBX,ESP(nu se modific), EBP,ESI,EDI; SP SP+32.

- 102 -

A1.2.3. Transferuri cu porturile IN - citire din portul n sau a crui adresa este n DX Mnemonic: IN dst, src. Aciune: AL [port]8 sau AX [port]16 sau EAX [port]32 . AL port[DX]8 sau AX port[DX]16 sau EAX port[DX]32 . Operanzi: port: n,[DX]. Observaii: Se poate face citire pe 8 bii (n AL, dintr-un port de 8 bii), pe 16 bii (n AX, dintr-un port de 16 bii) sau pe 32 bii (n EAX, dintr-un port de 32 bii). n cazul n care adresa portului este coninutul lui DX, aceasta are 16 bii, deci sunt posibile 65536 porturi. Dac adresa este un numr n, aceasta are numai 8 bii, deci sunt posibile 256 de porturi. OUT - scriere n portul n sau a crui adresa este n DX Mnemonic: OUT dst, src Aciune: [port]8 AL sau [port]16 AX sau [port]32 EAX port[DX]8 AL sau port[DX]16 AX sau port[DX]32 EAX Operanzi: port: n,[DX] Observaii: Se poate face citire pe 8 bii (n AL, dintr-un port de 8 bii), pe 16 bii (n AX, dintr-un port de 16 bii) sau pe 32 bii (n EAX, dintr-un port de 32 bii). n cazul n care adresa portului este coninutul lui DX, aceasta are 16 bii, deci sunt posibile 65536 porturi. Dac adresa este un numr n, aceasta are numai 8 bii, deci sunt posibile 256 de porturi. A1.2.4. Instruciuni de transfer de iruri LODSB, LODSW, LODSD,STOSB, STOSW,STOSD Mnemonic: Aciune: LODSB - ncarc un octet de la DS:SI n AL AL [SI]; SI SI +1 dac DF=0, SI SI-1 dac DF=1. - 103 -

Mnemonic: Aciune:

LODSW - ncarc un cuvnt de la DS:SI n AX AL [SI]; AH [SI+1]; SI SI +2 dac DF=0, SI SI-2 dac DF=1. LODSD - ncarc un dublucuvant de la DS:SI n EAX EAX0 [SI] (octetul inferior al EAX); EAX1 [SI+1]; EAX1 [SI+2]; EAX1 [SI+3] (octetul superior al EAX); SI SI +4 dac DF=0, SI SI-4 dac DF=1. STOSB - ncarc AL la ES:DI [DI] AL DI DI +1 dac DF=0, DI DI-1 dac DF=1 STOSW - ncarc AL la ES:DI [DI] AL; [DI+1] AH; DI DI +2 dac DF=0, DI DI-2 dac DF=1. STOSD - ncarc un dublucuvant din EAX la ES:DI [DI] EAX0 (octetul inferior al EAX); [DI+1] EAX1 ; [DI+2] EAX2 ; [DI+3] EAX3 (octetul superior al EAX); DI DI +4 dac DF=0, DI DI-4 dac DF=1.

Mnemonic: Aciune:

Mnemonic: Aciune: Mnemonic: Aciune:

Mnemonic: Aciune:

Mnemonic: LODS dst,src - Mut un octet, doi octei sau 4 octei de la adresa la adresa DS:SI n AL, AX sau EAX. Aceasta instruciune este echivalenta cu LODSB,LODSW i LODSD care nu au ns operanzi explicii. Mnemonic: STOS dst,src - Mut coninutul lui AL, AX sau EAX n memorie la adresa ES:DI. Aceasta instruciune este echivalent cu STOSB,STOSW i STOSD care nu au ns operanzi explicii.

- 104 -

Pentru instruciunile de transfer LODSB, LODSW i LODSW, sursa este locaia de memorie cu adresa efectiva data de registrul index sursa SI i adresa de segment dat de DS. Pentru instruciunile de transfer STOSB, STOSW i STOSD destinaia este locaia de memorie cu adresa efectiva data de registrul index destinaie DI i adresa de segment dat de ES. In urma efecturii unei astfel de instruciuni, registrul index SI respectiv DI se modific n funcie de starea flagului DF (de direcie). Daca DF este 0, registrul index va fi incrementat cu 1 la LODSB i STOSB, cu 2 la LODSW i STOSW i cu 4 la LODSD i STOSD . Daca DF este 1, registrul index va fi decrementat cu 1, 2, respectiv cu 4. Registrul general implicit este AL la transferul de un octet, AX la transferul de doi octei i EAX la transferul pe 4 octei. MOVS,MOVSB, MOVSW,MOVSD Aceste instruciuni combin instruciunile LODSB i STOSB, respectiv LODSW i STOSW, fr a afecta AL sau AX. Segmentul destinaie este ntotdeauna ES. Segmentul surs implicit este DS, dar poate fi i altul specificat n adresa surs. Mnemonic: MOVSB - Mut un octet de la adresa DS:SI la adresa ES:DI Aciune: [DS] [SI]; SI SI +1 dac DF=0, SI SI-1 dac DF=1; DI DI +1 dac DF=0, DI DI-1 dac DF=1. Mnemonic: MOVSW - Mut un cuvnt de la adresa DS:SI la adresa ES:DI Aciune: [DI] [SI]; [DI+1] [SI+1]; SI SI +2 dac DF=0, SI SI-2 dac DF=1; DI DI +2 dac DF=0, DI DI-2 dac DF=1. Mnemonic: MOVSD - Mut un dublu-cuvant (32 de bii) de la adresa DS:SI la adresa ES:DI Aciune: [DI] [SI]; [DI+1] [SI+1]; [DI+2] [SI+2]; [DI+3] [SI+3]; SI SI +4 dac DF=0, SI SI-4 dac DF=1; DI DI +4 dac DF=0, DI DI-4 dac DF=1. - 105 -

Mnemonic: MOVS dst,src - Mut un octet, doi octei sau 4 octei de la adresa SI la adresa ES:DI. Operanzii sunt simboluri de o anumit lungime, declarai anterior n program. Aceast instruciune este echivalent cu MOVSB, MOVSW i MOVSD care nu au ns operanzi explicii. INS, INSB, INSW, INSD Mnemonic: INSB - ncarc n memorie la ES:DI coninutul portului de 8 bii a crui adres este n DX Aciune: [DI]port[DX]; DI DI +1 dac DF=0, DI DI-1 dac DF=1. Mnemonic: INSW - ncarc n memorie la ES:DI coninutul portului de 16 bii a crui adres este n DX Aciune:[DI] port[DX]0 (octetul inferior al portului a crui adresa e n DX); [DI+1] port[DX]1(octetul superior al portului a crui adresa e n DX); DI DI +2 dac DF=0, DI DI-2 dac DF=1. Mnemonic: INSD - ncarc n memorie la ES:DI coninutul portului de 32 bii a crui adres este n DX Aciune: [DI] port[DX]0 (octetul inferior al portului a crui adresa e n DX); [DI+1]port[DX]1; [DI+2]port[DX]2; [DI+3] port[DX]3 (octetul superior al portului a crui adresa e n DX); DI DI +4 dac DF=0, DI DI-4 dac DF=1. Mnemonic: INS dst,src - Mut un octet, doi octei sau 4 octei din portul a crui adresa este coninut n DX, ntr-un registru sau n memorie la adresa ES:DI.Aceasta instruciune este echivalenta cu instruciunile INSB, INSW i INSD care nu au ns operanzi explicii. OUTS, OUTSB, OUTSW, OUTSD Mnemonic: OUTSB - ncarc din memorie de la DS:SI n portul de 8 bii a crui adresa este n DX Aciune: port[DX] [SI]; SI SI +1 dac DF=0, SI SI-1 dac DF=1. - 106 -

Mnemonic: OUTSW - ncarc din memorie de la DS:SI n portul de 16 bii a crui adres este n DX. Aciune: port[DX]0 [SI] (octetul inferior al portului a crui adresa e n DX); port[DX]1 [SI+1] (octetul superior al portului a crui adresa e n DX); SI SI +2 dac DF=0, SI SI-2 dac DF=1. Mnemonic: INSD - ncarc din memorie de la DS:SI n portul de 32 bii a crui adres este n DX Aciune: port[DX]0 [SI] (octetul inferior al portului a crui adresa e n DX); port[DX]1 [SI+1] ; port[DX]2 [SI+2] ; port[DX]3 [SI+3] (octetul superior al portului a crui adresa e n DX); SI SI +4 dac DF=0, SI SI-4 dac DF=1. Mnemonic: OUTS dst,src - Mut un octet, doi octei sau 4 octei n portul a crui adresa este coninut n DX, dintr-un registru sau din memorie de la adresa DS:SI. Aceasta instruciune este echivalent cu instruciunile OUTSB, OUTSW i OUTSD care nu au ns operanzi explicii. Prefixul REP Instruciunile de transfer de iruri LODS, LODSx, STOS, STOSx, MOVS, MOVSx, INS, INSx, OUTS, OUTSx (unde x este B,W sau D) pot fi precedate de prefixul REP, care cere procesorului s repete instruciunea pe care o precede pn cnd CX devine 0 (prin decrementare automat). In cazul instruciunilor LODSx se foloseste ns de regula prefixul LOOP, deoarece cu REP s-ar rescrie n mod inutil registrul AL, AX sau EAX de CX ori.

- 107 -

A1.3. Instruciuni de calcul Exist urmtoarele tipuri de operaii efectuate de ALU: - aritmetice; - aritmetice speciale; - logice; - deplasri; - 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, semnificnd 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 semioctetului rezultatului (de la bitul 3 la bitul 4). Acest indicator se folosete n programele de calcule n aritmetica zecimal. - ZF (Zero Flag) - indicatorul de zero - este poziionat n 1 dac rezultatul operaiei a fost zero. - SF (Sign Flag) indicatorul de semn - este poziionat n 1 dac cel mai semnificativ bit al rezultatului (MSB) este 1, adic n reprezentarea numerelor n C2 (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). A1.3.1. Instruciuni aritmetice i logice Observaii genera1e: - Operanzi: dst: r8, r16, r32, m8, m16, m32 src: r8, r16, r32, m8, m16, m32, n, nn, nnnn - Operaiile sunt posibile pe 8, 16 sau 32 bii (sursa i destinaia avnd mrimi compatibile) - Sursa i destinaia nu pot fi concomitent locaii de memorie - Adresarea imediat (specificarea valorii numerice a operandului) este - 108 -

posibil numai pentru surs. - Sunt posibile adunri, scderi i nmuliri cu semn avnd operandul destinaie registru sau memorie pe 16 sau 32 de bii, i operandul sursa o valoare imediat de 8 bii. In acest caz, operandul de 8 bii este extins la 16 sau 32 de bii cu pstrarea semnului (bitul cel mai semnificativ, cel de semn, este copiat din pozitia a 8-a n toi biii pn la poziia 16, respectiv 32). Aceasta posibilitate exist i pentru operaiile logice, cu excepia instruciunii TEST. ADC dst,src - Adunare cu carry (transport) Aciune: dst dst + src + CF; ADD dst,src - Adunare Aciune: dst dst + src; SUB dst,src - Scdere Aciune: dst dst - src; SBB dst,src - Scdere cu "borrow" (mprumut) dst dst - src - CF; Aciune: INC dst - Incrementare Aciune: dst dst + 1; Nu este afectat CF. DEC dst - Decrementare Aciune: dst dst - 1; Nu este afectat CF. NEG dst - Negare aritmetic Aciune: dst - dst (complementare fa de doi) Descriere: Se obine operandul cu semn schimbat n complement fa de 2. CF este setat automat, cu excepia cazului cnd operandul este 0. 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 Descriere: Instruciunea NOT inverseaz operandul; orice 1 devine 0 i viceversa. Nu sunt afectai indicatorii de condiii.

- 109 -

MUL src - nmulirea fr semn lui AL, AX sau EAX cu un numar. Aciunea depinde de mrimea operandului src, lund urmatoarele forme: - src de 8 bii: AX AL * src8; src: r8,m8; Dac AH = 0 atunci CF 0; n celelalte cazuri CF 1 i OF CF. -src de 16 bii: DX: AX AX * src16; src: r16,m16; Dac DX = 0 atunci CF 0; n celelalte cazuri CF 1 i OF CF. - src de 32 bii: EDX: EAX EAX * src32; src: r32,m32; Dac EDX = 0 atunci CF 0; n celelalte cazuri CF 1 i OF CF. 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 marimea operandului src. In cazul n care destinaia 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 s fie o valoare numeric imediat. In acest caz ns, dac rezultatul are mai multi bii dect registrul care conine denmulitul, se pierd bitii care depesc lrgimea acestuia.

- 110 -

Aciunea este urmtoarea: - cu dst de 16 bii: 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. - cu dst de 32 bii: 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 (ctul) nu ncape n registrul destinaie AL, AX respectiv EAX, sau mpritorul este 0, se genereaz ntrerupere 0 (DE - Divide Error) i se sare automat din program. De aceea trebuie fcuta 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. Indicatorii de condiii sunt nedefinii.

- 111 -

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); 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. Observaie: Dac rezultatul (ctul) nu ncape n registrul destinaie AL, AX respectiv EAX, sau mpritorul este 0, se genereaz ntrerupere 0 (DE - Divide Error) i se sare automat din program. De aceea trebuie fcut o evaluare prealabil a domeniului de valori ale rezultatului i trebuie folosit un registru destinaie corespunztor. Dac ctul este subunitar, el este ajustat la 0. Semnul restului este acelai cu al mpritorului. Indicatorii de condiii sunt nedefinii. CBW - Conversie de la Byte (8 bii) din AL la Word (16 bii) n AX, cu pstrare semn. Aciune: AL7 = 0 => AH 0; AL7 = 1 => AH 0FFh. Bitul cel mai semnificativ al lui AL este copiat n toi biii registrului AH. Indicatorii de condiii nu sunt afectai. CWD - Conversie de la Word (16 bii) din AX la Dword (32 bii) n DX:AX, cu pstrare semn. Aciune: AX15 = 0 => DX 0; AL15 = 1 => DX 0FFFFh. Bitul cel mai semnificativ al lui AX este copiat n toi biii registrului DX. Indicatorii de condiii nu sunt afectai. CWDE - Conversie de la Word (16 bii) la Dword (32 bii) n EAX, cu pstrare semn. - 112 -

Aciune: EAX15 = 0 => EAX16 ..EAX31= 1 ; EAX15 = 1 => EAX16 ..EAX31= 1 . Bitul cel mai semnificativ al lui AX este copiat n toi bitii jumtii superioare a lui EAX. Indicatorii de condiii nu sunt afectai. CDQ - Conversie de la Dword (32 bii) n EAX la Qword (64 bii) n EDX:EAX, cu pstrare semn. Aciune: EAX31 = 0 => EDX 0; AL31 = 1 => EDX 0FFFFFFFFh. Bitul cel mai semnificativ al lui EAX este copiat n toi bitii registrului EDX. Indicatorii de condiii nu sunt afectai. AND dst,src - SI logic pe bit Aciune: bn(dst) bn(dst) AND bn(src) ; dst: r8,r16,r32,m8,m16,m32; src: r8,r16,r32,m8,m16,m32,imm8,imm16,imm32. Descriere: Fiecare bit al rezultatului instruciunii AND este un 1 dac ambii bii corespunztori ai operanzilor sunt 1; altminteri, devine un 0. Sursa i destinaia trebuie s fie de dimensiuni egale. Este posibil ca sursa s fie o valoare imediat de 1 octet iar destinaia s fie de 2 sau 4 octei, caz n care numarul sursa va fi extins cu semn pn la valoarea destinaiei. Nu se admite ca ambii operanzi s fie locatii de memorie. OR dst,src - SAU logic pe bit Aciune: bn(dst) bn(dst) OR bn(src) ; dst: r8,r16,r32,m8,m16,m32; src: r8,r16,r32,m8,m16,m32,imm8,imm16,imm32; Descriere: Instruciunea OR calculeaz SAU al celor doi operanzi i rezultatul este plasat n primul operand. Fiecare bit al rezultatului este 0 dac ambii bii corespunztori ai operanzilor sunt 0; altminteri, fiecare bit este 1. Sursa i destinaia trebuie s fie de dimensiuni egale. Este posibil ca sursa s fie o valoare imediat de 1 octet iar destinaia s fie de 2 sau 4 octei, caz n care numarul sursa va fi extins cu semn pn la valoarea destinaiei. Nu se admite ca ambii operanzi s fie locatii de memorie.

- 113 -

XOR dst,src - SAU EXCLUSIV logic pe bit Aciune: bn(dst) bn(dst) XOR bn(src) ; dst: r8,r16,r32,m8,m16,m32; src: r8,r16,r32,m8,m16,m32,imm8,imm16,imm32. Descriere: Instruciunea XOR calculeaz SAU EXCLUSIV al celor doi operanzi. Fiecare bit al rezultatului este 1 dac biii corespunztori ai operanzilor sunt diferii; fiecare bit este 0 dac biii corespunztori sunt identici. Rezultatul nlocuiete primul operand. Sursa i destinaia trebuie s fie de dimensiuni egale. Este posibil ca sursa sa fie o valoare imediat de 1 octet iar destinaia s fie de 2 sau 4 octei, caz n care numarul sursa va fi extins cu semn pn la valoarea destinaiei. Nu se admite ca ambii operanzi s fie locatii de memorie. CMP dst,src - Comparaie aritmetic (prin scdere) Aciune: dst-src; dst: r8,r16,r32,m8,m16,m32; src: r8,r16,r32,m8,m16,m32,imm8,imm16,imm32. Decriere: Se face diferena ntre dst i src, fr generare rezultat - se modific doar indicatorii de condiii. Sursa i destinaia trebuie s fie de dimensiuni egale. Este posibil ca sursa sa fie o valoare imediata de 1 octet iar destinaia s fie de 2 sau 4 octei, caz n care numarul surs va fi extins cu semn pn la valoarea destinaiei. Nu se admite ca ambii operanzi s fie locatii de memorie. TEST dst,src - testare (SI fr generare de rezultat) dst: r8,r16,r32,m8,m16,m32; src: r8,r16,r32,m8,m16,m32,imm8,imm16,imm32. Descriere: Instruciunea TEST calculeaz "SI logic pe bit" de cei doi operanzi. Fiecare bit al rezultatului este 1, dac ambii bii corespunztori ai operanzilor sunt l; altminteri, fiecare bit este 0. Rezultatul operaiei este ters i doar f1agurile sunt modificate. Sursa i destinaia trebuie s fie de dimensiuni egale. Nu se admite ca ambii operanzi s fie locaii de memorie.

- 114 -

SCAS,SCASB,SCASW,SCASD - Compar acumulatorul cu un sir Mnemonic: SCAS dst Descriere - Compar coninutul registrului (E)AX cu coninutul locaiilor de memorie (una, doua sau patru) care ncep la adresa ES:[DI] i poziioneaz corespunzator flagurile dst: m8,m16,m32 Aciune: AL - ES:[DI]; DI DI+n dac DF=0, DI DI-n dac DF=1 unde n=1/2/4 n funcie de dimensiunea operandului. Mnemonic: SCASB - Compar coninutul registrului AL cu coninutul locaiei ES:DI i poziioneaz corespunzator flagurile Aciune: AL - ES:[DI]; DI DI+1 dac DF=0, DI DI-1 dac DF=1. Mnemonic: SCASW - Compar coninutul registrului AX cu coninutul locaiilor ES:[DI] i ES:[DI+1] i poziioneaz corespunzator flagurile Aciune: AL - ES:[DI]; AH - ES:[DI+1]; DI DI+2 dac DF=0, DI DI-2 dac DF=1. Mnemonic: SCASD - Compar coninutul registrului EAX cu coninutul locaiilor ES:[DI], ES:[DI+1], ES:[DI+2] i ES:[DI+3] i poziioneaz corespunzator flagurile. Aciune: EAX1 - ES:[DI] - octetul cel mai puin semnificativ al lui EAX; EAX2 - ES:[DI+1] ; EAX3 - ES:[DI+2] ; EAX4 - ES:[DI+3] - octetul cel mai semnificativ al lui EAX; DI DI+4 dac DF=0, DI DI-4 dac DF=1. La aceste instruciuni operandul este ntotdeauna n segmentul ES, i nu este posibil schimbarea acestui segment. Instruciunea SCASB compar octetul din locaia de memorie cu adresa ES:DI cu coninutul lui AL i poziioneaz indicatorii de conditii n functie de rezultatul comparrii. Registrul DI va fi incrementat cu 1 dac DF=0 i decrementat cu 1 dac DF=1. Instruciunea SCASW compar cuvntul punctat de locatia de memorie cu adresa ES:DI (octetul inferior fiind la aceasta adresa, iar cel superior la cea urmtoare), cu coninutul lui AX i poziioneaz indicatorii de conditii n functie de - 115 -

rezultatul comparrii. Registrul DI va fi incrementat cu 2 dac DF=0 i decrementat cu 2 dac DF=1. Instruciunea SCASD compar cuvntul punctat de locatia de memorie cu adresa ES:DI (octetul inferior fiind la aceasta adresa, iar cel superior la cea de a treia din cele care urmeaz), cu coninutul lui EAX i pozitioneaza indicatorii de conditii n functie de rezultatul compararii. Registrul DI va fi incrementat cu 4 dac DF=0 i decrementat cu 4 dac DF=1. In conformitate cu regulile aritmeticii n complement fata de 2 (numerele negative au bitul cel mai semnificativ 1 iar scderea cu rezultat negativ d un mprumut) , dac numarul din memorie este mai mic dect cel din registru, indicatorii C (transport la adunare i mprumut la scadere) i S (semn) se pozitioneaza n 1 . Daca numarul din memorie este mai mare dect cel din cu cel din registru, indicatorii C i S se pozitioneaza n 0. Daca numarul din memorie este egal cu cel din registru, se pozitioneaza n 1 indicatorul Z. CMPS, CMPSB, CMPSW, CMPSD -compar dou seturi de locaii de memorie Mnemonic: CMPS dst,src - Compara coninutul locatiilor (una, doua sau patru) care incep la adresa DS:[SI] cu coninutul aceluiai numar de locatii care ncep la adresa ES:[DI] i poziioneaz corespunztor flagurile. dst,src: m8,m16,m32. Aciune: DS:[SI] - ES:[DI]; SISI +n dac DF=0, SISI-n dac DF=1; DIDI +n dac DF=0, DIDI-n dac DF=1 unde n=1/2/4 n funcie de dimensiunea operanzilor.

Mnemonic: CMPSB - Compar coninutul locaiei DS:[SI] cu coninutul locaiei ES:[DI] i pozitioneaz corespunztor flagurile Aciune: DS:[SI] - ES:[DI]; SISI +1 dac DF=0, SISI-1 dac DF=1; DIDI +1 dac DF=0, DIDI-1 dac DF=1. Mnemonic: CMPSW - Compar coninutul locatiilor DS:[SI] i DS:[SI+1] cu coninutul locaiilor ES:[DI] i ES:[DI+1] i poziioneaz corespunztor flagurile

- 116 -

Aciune:

DS:[SI] - ES:[DI]; DS:[SI+1] - ES:[DI+1]; SISI +2 dac DF=0, SISI-2 dac DF=1; DIDI +2 dac DF=0, DIDI-2 dac DF=1.

Mnemonic: CMPSD - Compar coninutul a patru locaii care ncep la adresa DS:[SI] cu coninutul a patru locatii care ncep la adresa ES:[DI] i pozitioneaz corespunztor flagurile Aciune: DS:[SI] - ES:[DI]; DS:[SI+1] - ES:[DI+1]; DS:[SI+2] - ES:[DI+2]; DS:[SI+3] - ES:[DI+3]; SISI +2 dac DF=0, SISI-2 dac DF=1; DIDI +2 dac DF=0, DIDI-2 dac DF=1. La aceste instruciuni operandul al doilea este ntotdeauna n segmentul ES, i nu este posibila schimbarea acestui segment. Primul operand este implicit n segmentul DS, dar se acest segment poate fi schimbat ( prin "segment override byte"). Pentru instruciunea de comparaie CMPSB primul operand este locaia de memorie cu adresa efectiv dat de registrul index surs SI i adresa de segment dat de DS iar al doilea operand este locaia de memorie cu adresa efectiv data de registrul index destinaie DI i adresa de segment data de ES. Pentru instruciunea de comparatie CMPSW primul operand este dat de locatiile de memorie cu adresele DS:[SI] (octetul inferior) i DS:[SI+1] (octetul superior) iar al doilea operand este dat de locatiile de memorie cu adresele ES:[DI] (octetul inferior) i ES:[DI+1] (octetul superior). Pentru instruciunea de comparatie CMPSD primul operand este dat de patru locatii de memorie care ncep la adresa DS:[SI] (octetul inferior) i se termin la DS:[SI+1] (octetul superior), iar al doilea operand este dat de patru locatii de memorie care ncep la adresa ES:[DI] (octetul inferior) i se termin la ES:[DI+1] (octetul superior). Pentru instruciunea de comparatie CMPS primul operand este dat de una doua sau patru locatii de memorie care ncep la adresa DS:[SI] (octetul inferior) i se termin iar al doilea operand este dat de patru locatii de memorie care ncep la adresa ES:[DI] (octetul inferior) i se termin la ES:[DI+1] (octetul superior). In urma efectuarii unei astfel de instruciuni, registrele index SI respectiv DI se modific n funcie de starea flagului DF (de directie). Daca DF este 0, registrele index vor fi incrementate cu 1 la CMPSB i cu 2 la CMPSW. Daca DF este 1, registrele index vor fi decrementate cu 1, respectiv cu 2.

- 117 -

A1.3.2. Ajustri zecimale pentru operaii cu numere BCD AAA - Ajustare n cod BCD despachetat a lui AL dup adunare Aciune: IF (AL AND OFH) > 9) OR (AF=1) THEN AL (AL + 6) AND OFH; AH AH + 1; AF 1; CF 1; ELSE CF 0; AF 0. FI. Descriere: Execuia instruciunii AAA se face numai dup instruciunea ADD (sau ADC), care las rezultatul n registrul AL. Semiocteii inferiori ai operanzilor instruciunii de adunare trebuie s fie n intervalul 0...9. n acest caz, instruciunea AAA ajusteaz registrul AX pentru a conine rezultatul zecimal corect n format BCD despachetat. Dac adunarea a dus la un transport zecimal, registrul AH este incrementat iar flagurile CF i AF sunt setate. Dac nu a fost transport zecimal, flagurile CF i AF sunt terse iar AH rmne neschimbat. n ambele cazuri, registrul AL rmne cu jumtatea superioar n 0 (BCD despachetat). De exemplu, dac AH=0 i dac AL=0Ah atunci AX devine 0100, dac AL=0Bh atunci AX devine 0101, dac AL=0Ch atunci AX devine 0102, s.a.m.d.). Dupa instruciunea AAA se poate obtine n AL rezultatul n cod ASCII executnd o instruciune OR AL,30h AAS - Ajustare n cod BCD despachetat a lui AL dup scdere Aciune: IF (AL AND OFH) > 9) OR (AF=1) THEN AL AL - 6) AND OFH; AH AH - 1; AF 1; CY 1; ELSE CF 0; AF 0 FI. Descriere: Execuia instruciunii AAS se face numai dup instruciunea SUB (sau SBB), care las rezultatul n registrul AL. Semiocteii inferiori ai operanzilor - 118 -

instruciunii de scdere trebuie s fie n intervalul 0...9. n acest caz, instruciunea AAS ajusteaz registrul AX pentru a conine rezultatul zecimal corect n format BCD despachetat Dac scaderea a dus la un transport zecimal, registrul AH este decrementat iar flagurile CF i AF sunt setate. Dac nu a fost transport zecimal, flagurile CF i AF sunt terse iar AH rmne neschimbat. n ambele cazuri, registrul AL rmne cu jumtatea superioar n 0 (BCD despachetat). Dupa instruciunea AAA se poate obtine n AL rezultatul n cod ASCII executnd o instruciune OR AL,30h DAA - Ajustare AL dup adunare (BCD mpachetat) Aciune: IF (AL AND OFH) > 9) OR (AF=1) THEN AL AL + 6; AF 1; ELSE AF 0; FI IF (AL> 9FH) OR (CF=1) THEN AL AL +60H; CF 1; ELSE CF 0; FI. Descriere: Execuia instruciunii DAA se face numai dup instruciunea ADD (sau ADC), care las un rezultat de doi digii BCD mpachetat n registrul AL. Cei doi operanzi ai instruciunii de adunare trebuiau s fi fost de asemenea n format BCD mpachetat pe cte doi digii. n acest caz, instruciunea DAA ajusteaz registrul AL pentru a conine cele dou cifre BCD mpachetat corecte ale rezultatului. DAS - Ajustare AL dup scadere (BCD mpachetat) Aciune: IF (AL AND OFH) > 9) OR (AF=1) THEN AL AL - 6; AF 1; ELSE AF 0; FI - 119 -

IF (AL> 9FH) OR (CF=1) THEN AL AL -60H; CF 1; ELSE CF 0; FI. Descriere: Execuia instruciunii DAA se face numai dup instruciunea SUB (sau SBB), care las un rezultat de doi digii BCD mpachetat n registrul AL. Cei doi operanzi ai instruciunii de scadere trebuiau s fi fost de asemenea n format BCD mpachetat pe cte doi digii. n acest caz, instruciunea DAS ajusteaz registrul AL pentru a conine cele dou cifre BCD mpachetat corecte ale rezultatului. AAM - Ajustare AL dup nmulire Aciune: AH AL/10; AL AL modulo 10. Descriere: Execuia instruciunii AAM se face numai dup instruciunea MUL ntre dou cifre BCD despachetate (fiecare ocup cte un octet), care las rezultatul n registrul AX. Deoarece rezultatul este mai mic de 100, el este coninut integral n registrul AL. Instruciunea AAM despacheteaz rezultatul din AL prin mprire cu 10, lsnd ctul (cifra cea mai semnificativ) n AH, i restul (cifra mai puin semnificativ) n registrul AL. AAD - Ajustare AL nainte de mprire; Aciune: AL AH * 10 + AL; AH 0. Instruciunea AAD este folosit pentru a pregti doua cifre n format BCD despachetat (cifra mai putin semnificativa n AL i cea mai semnificativa n AH) pentru o mprire care va genera un rezultat n format BCD despachetat. Aceasta se realizeaz dnd lui AL valoarea AL+(10*AH) i lui AH valoarea 0. AX va deveni egal deci cu echivalentul binar al numrului initial de doua cifre BCD despachetat.

- 120 -

A1.3.3. Deplasri i rotaii SHL src,[nr] -Deplasare logic spre stnga cu nr poziii (numere fr semn) Aciune: C Operanzi: MSB LSB 0 -src:r8,r16,r32,m8,m16,m32; -[nr]: 1, CL,imm8. Descriere: Operandul src este nmulit cu 2 de [nr] ori. SHR src,[nr] -Deplasare logica spre dreapta cu nr poziii (numere fr semn) Aciune: MSB LSB C 0 Operanzi: -src:r8,r16,r32,m8,m16,m32; -[nr]: 1, CL,imm8. Descriere: Operandul src este mprit cu 2 de [nr] ori. SAL semn) Aciune: C Operanzi: MSB LSB 0 -src:r8,r16,r32,m8,m16,m32; -[nr]: 1, CL,imm8. Descriere: Operandul src cu semn este nmulit cu 2 de [nr] ori. Instruciunea este echivalent cu instruciunea SHL SAR semn) Aciune: MSB LSB C src,[nr] -Deplasare aritmetic spre dreapta cu nr poziii (numere cu src,[nr] -Deplasare aritmetica spre stnga cu nr poziii (numere cu

- 121 -

Operanzi:

-src:r8,r16,r32,m8,m16,m32; -[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:

-src:r8,r16,r32,m8,m16,m32; -[nr]: 1, CL,imm8.

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

Operanzi:

-src:r8,r16,r32,m8,m16,m32; -[nr]: 1, CL,imm8.

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

Operanzi:

-src:r8,r16,r32,m8,m16,m32; -[nr]: 1, CL,imm8.

RCR src,[nr]-Rotaie cu carry spre dreapta cu [nr] poziii Aciune: MSB LSB C

Operanzi:

-src:r8,r16,r32,m8,m16,m32; -[nr]: 1, CL,imm8. - 122 -

Descriere: Fiecare instruciune de rotaie ROL i ROR deplaseaz biii operandului src (registru sau locaie de memorie). Instruciunile de rotaie spre stnga deplaseaz toi biii ctre poziia cea mai semnificativ (ctre MSB), exceptnd bitul din poziia cea mai semnificativ, care este mutat n poziia cea mai puin semnificativ (LSB). Instruciunile de rotaie spre dreapta acioneaz invers: biii sunt deplasai ctre poziia cea mai puin semnificativ iar bitul din poziia cea mai puin semnificativ ajunge n poziia cea mai semnificativ. Pentru instruciunile RCL i RCR, flagul CF este o parte a cantitii rotite. Instruciunea RCL deplaseaz flagul CF n bitul cel mai puin semnificativ i cel mai semnificativ bit n flagul CF; instruciune a RCR deplaseaz flagul CF n bitul cel mai semnificativ i bitul cel mai 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. Rotaia este repetat de un numr de ori indicat de al doilea operand, care este 1, o valoare imediata de 8 bii, sau coninutul registrului CL. Numarul de deplasari maxim admis este de 31; dac se specific [n] mai mare, se trunchiaz automat la cei mai putin semnificativi 5 bii. Flagul OF este definit numai pentru forme cu o singur 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, spre a rezulta flagul OF. Pentru deplasri/rotiri spre dreapta, cei doi bii cu cel mai nalt ordin ai rezultatului sunt "sau-exclusivai" spre a rezulta flagul OF. SHLD dst,src,[n] - deplasare stnga cu dubl precizie C Operanzi: MSB dst LSB MSB src LSB

-src:r16,r32,m16,m32; -[nr]: 1, CL,imm8.

Descriere: Coninutul dst (registru sau locaie de memorie) este deplasat spre stnga de [n] ori mpreun cu registrul src, ai crui bii ptrund n dst. Registrul src rmne neschimbat. Bitul CF ia valoarea ultimului bit care a fost deplasat din MSB al dst. Deoarece bitii care vor intra prin deplasare n dst sunt provenii de la un alt registru, aceasta instruciune este util pentru deplasari cu dubla precizie (pe 64 de bii)

- 123 -

SHRD dst,src,[n]- deplasare dreapta cu dubla precizie MSB src Operanzi: LSB MSB dst LSB C

-src:r16,r32,m16,m32; -[nr]: 1, CL,imm8.

Descriere: Coninutul dst (registru sau locaie de memorie) este deplasat spre dreapta de [n] ori mpreun cu registrul src, ai crui bii ptrund n dst. Registrul src rmne neschimbat. Bitul CF ia valoarea ultimului bit care a fost deplasat din MSB al dst. Deoarece bitii care vor intra prin deplasare n dst sunt provenii de la un alt registru, aceasta instruciune este util pentru deplasri cu dubl precizie (pe 64 de bii). A1.4 Instruciuni de lucru pe bit CLC - tergere flag transport (CF = 0) STC - setare flag transport (CF = 1) CMC - complementarea transport (CF = NOT CF) CLD - stabilire direcie cresctoare (DF = 0) Dupa aceasta instruciune, la operatiile cu siruri registrele index vor fi incrementate. STD - stabilire direie descresctoare (DF 1) Dupa aceasta instruciune, la operatiile cu siruri registrele index vor fi decrementate. STI - activare ntreruperi (IF = 1) CLI - dezactivare ntreruperi (IF = 0) BT - Testare bit (Copiere bit n CF) Mnemonic: BT dst,src dst: r16,r32,m16,m32; src: r16,r32,imm8. Aciune: CF Bit( Baza, index). Descriere: Primul operand specific baza iar al doilea indexul. Bitul cu indexul dat de ala doilea operand din registrul sau locatia de memorie specificat de - 124 -

primul operand este copiat n CF. Daca baza este un registru, indexul este ajustat automat modulo 16 sau modulo 32 n functie de marimea registrului. Daca baza este o locaie de memorie, ea reprezint adresa locaiei de memorie care conine bitul cu index 0. Sunt posibile valori ale indexului ntre -231 i 231-1 dac al doilea operand este un registru sau ntre 0 i 31 dac al doilea operand este o valoare imediata. BTR - Testare bit i resetare (Copiere bit n CF i resetare) Mnemonic: BT dst,src dst: r16,r32,m16,m32; src: r16,r32,imm8. Aciune: CF Bit( Baza, index) Bit( Baza, index) 0. Descriere: Primul operand specific baza iar al doilea indexul. Bitul cu indexul dat de al doilea operand din registrul sau locaia de memorie specificat de primul operand este copiat n CF, dupa care este resetat (adus la 0). Daca baza este un registru, indexul este ajustat automat modulo 16 sau modulo 32 n functie de marimea registrului. Daca baza este o locaie de memorie, ea reprezint adresa locaiei de memorie care conine bitul cu index 0. Sunt posibile valori ale indexului ntre -231 i 231-1 dac al doilea operand este un registru sau ntre 0 i 31 dac al doilea operand este o valoare imediat. BTS - Testare bit i setare (Copiere bit n CF i setare) Mnemonic: BT dst,src dst: r16,r32,m16,m32; src: r16,r32,imm8. Aciune: CF Bit( Baza, index) Bit( Baza, index) 1. Descriere: Primul operand specific baza iar al doilea indexul. Bitul cu indexul dat de ala doilea operand din registrul sau locatia de memorie specificat de primul operand este copiat n CF, dupa care este setat (adus la 1). Daca baza este un registru, indexul este ajustat automat modulo 16 sau modulo 32 n functie de marimea registrului. Daca baza este o locaie de memorie, ea reprezint adresa locaiei de memorie care conine bitul cu index 0. Sunt posibile valori ale indexului ntre -231 i 231-1 dac al doilea operand este un registru sau ntre 0 i 31 dac al doilea operand este o valoare imediata.

- 125 -

BTC - Testare bit i complementare (Copiere bit n CF i complementare) Mnemonic: BT dst,src dst: r16,r32,m16,m32; src: r16,r32,imm8. Aciune: CF Bit( Baza, index); Bit( Baza, index) NOT Bit( Baza, index). Descriere: Primul operand specific baza iar al doilea indexul. Bitul cu indexul dat de ala doilea operand din registrul sau locatia de memorie specificat de primul operand este copiat n CF, dupa care este complementat (ia valoarea opus). Daca baza este un registru, indexul este ajustat automat modulo 16 sau modulo 32 n functie de marimea registrului. Daca baza este o locaie de memorie, ea reprezint adresa locaiei de memorie care conine bitul cu index 0. Sunt posibile valori ale indexului ntre -231 i 231-1 dac al doilea operand este un registru sau ntre 0 i 31 dac al doilea operand este o valoare imediat. BSF - Scanare nainte a biilor Mnemonic: BSF dst,src dst: r16,r32; src: r16,r32,m16,m32. Aciune: dstindex(src,0). Descriere: Bitii din src sunt testai pe rand incepnd cu cel mai putin semnificativ, i dac toti sunt 0 este sters flagul ZF. Daca vreunul este gsit n 1, indexul sau incepnd de la 0 este scris n dst. BSF - Scanare napoi a bitilor Mnemonic: BSR dst,src dst: r16,r32; src: r16,r32,m16,m32. Aciune: dstindex(src,0). Descriere: Bitii din src sunt testai pe rand ncepand cu cel mai semnificativ, i dac toti sunt 0 este sters flagul ZF. Daca vreunul este gsit n 1, indexul sau ncepand de la 0 este scris n dst. SETcc - Seteaz octet dac condiia cc este indeplinit Instruciunea are una din urmatoarele forme: SETA r/m8 Seteaz octetul dac este peste (CF=0 and ZF=0) SETAE r/m8 Seteaz octetul dac este peste sau egal (CF=0) SETB r/m8 Seteaz octetul dac este sub (CF=1) SETBE r/m8 Seteaz octetul dac este sub sau egal (CF=1 or (ZF=1) - 126 -

SETC r/m8 Seteaz octetul dac este transport (CF=1) SETE r/m8 Seteaz octetul dac este egal (ZF=1) SETG r/m8 Seteaz octetul dac este mai mare (ZF=0 or SF=OF) SETGE r/m8 Seteaz octetul dac este mai mare sau egal (SF=OF) SETL r/m8 Seteaz octetul dac este mai mic (SF>OF) SETLE r/m8 Seteaz octetul dac este mai mic sau egal (ZF=1 i SF>OF) SETNA r/m8 Seteaz octetul dac nu este peste (CF=1) SETNAE r/m8 Seteaz octetul dac nu este peste sau egal (CF=1) SETNB r/m8 Seteaz octetul dac nu este sub (CF=0) SETNBE r/m8 Seteaz octetul dac nu este sub sau egal (CF=0 i ZF=0) SETNC r/m8 Seteaz octetul dac nu este transport (CF=0) SETNE r/m8 Seteaz octetul dac nu este (ZF=0) SETNG r/m8 Seteaz octetul dac nu este mai mare (ZF=1 or SF>OF) SETNGE r/m8 Seteaz octetul dac nu este mai mare sau egal (SF>OF) SETNL r/m8 Seteaz octetul dac nu este mai mic (SF=OF) SETNLE r/m8 Seteaz octetul dac nu este mai mic sau egal (ZF=1 i SF>OF) SETNO r/m8 Seteaz octetul dac nu este overflow (OF=0) SETNP r/m8 Seteaz octetul dac nu este paritate (PF=0) SETNS r/m8 Seteaz octetul dac semnul este 0 (SF=0) SETNZ r/m8 Seteaz octetul dac nu este zero (ZF=0) SETO r/m8 Seteaz octetul dac este overflow (OF=1) SETP r/m8 Seteaz octetul dac este paritate (PF=1) SETPE r/m8 Seteaz octetul dac este paritate par (PF=1) SETPO r/m8 Seteaz octetul dac este paritate impar (PF=0) SETS r/m8 Seteaz octetul dac semnul este 1 (SF=1) SETZ r/m8 Seteaz octetul dac este zero (ZF=1) Descriere: Daca condiia este ndeplinit, atunci operandul (registru de 8 bii sau locaie de memorie) devine 1. Daca nu, acesta devine 0.

A1.5. Instruciuni de ramificare n program JMP adr - salt necondiionat adr: r16,r32,m16,m32,rel8,rel16,rel32,ptr16:16,ptr16:32,m16:16,m16:32. Descriere: Instruciunea JMP transfera controlul catre un alt punct n lanul de instruciuni fr a se memora adresa de revenire. Operandul adr (inta) specific adresa instruciunii la care se sare. Acest operand poate fi o valoare imediat, un registru de uz general sau o locaie de memorie. - 127 -

Aceasta instruciune poate executa patru tipuri diferite de salturi: Salt apropiat (near) - Un salt catre o instruciune din segmentul de cod curent, segment indicat de coninutul curent al registrului CS), numit i salt intrasegment. Salt scurt (short) - Un salt apropiat la care deplasamntul este limitat intre -128 i +127 fata de valoarea curenta a EIP Salt indeprtat (far) - UN salt catre o instruciune aflata intr-un segment diferit de segmentul curent de cod, dar cu acelasi nivel de privilegii, numit i salt intersegment Task switch - Un salt catre o instruciune aflata intr-un alt task (posibil numai n modul virtual protejat - v. [2] )

Salturile apropiate i scurte. Cnd se execut un salt apropiat, procesorul sare la adresa (din segmentul de cod curent) care este specificat de operandul int. Acesta specific fie un deplasament absolut (fa de baza segmentului de cod) fie un deplasament relativ (o valoare cu semn fa de valoarea curent a numratorului de program).Registrul CS nu se modific la astfel de salturi. Un deplasamet absolut este specificat indirect printr-un registru general sau o locaie de memorie (operandul este r16/m16 sau r32/m32).Un deplasament absolut se ncarc direct n EIP. Marimea operandului determin i coninutul EIP; dac acesta este de 16 bii, cei 16 bii superiori din EIP sunt pui n 0, rezultand un deplasament care nu depaete 16 bii. Un deplasament relativ este n general specificat n limbaj de asamblare printr-o etichet, dar la nivel de cod masin acesta este decodificat ca o valoare imediat cu semn, de 8, 16 sau 32 de bii. Aceasta valoare este adunat la valoarea din EIP, adic la adresa instruciunii imediat urmatoare celei de salt. Salturi ndeprtate n modul Real sau Virtual 8086. Cnd se execut un salt ndeprtat n modul Real sau Virtual 8086, procesorul sare la un segment de cod i un deplasament specificat de operandul instruciunii. Acesta specific o adresa absolut departat, fie direct printr-un pointer (ptr16:16 sau ptr16:32) fie indirect printr-o locaie de memorie (m16:16 sau m16:32). In varianta cu pointer, segmentul i deplasamentul adresei la care se sare sunt specificate de instruciune printr-o valoare imediata de 4 octei (operand de 16 bii) sau de 6 octei (operand de 32 de bii). In varianta indirect, operandul specific o locaie de memorie care conine 4 octei (operand de 16 bii) sau 6 octei (operand de 32 de bii). Adresa ndeprtat este ncrcat direct n registrele CS (primii doi octei) i EIP (uramtorii 2 sau 4 octei). Daca operandul este de 16 bii, cei 16 bii superiori din EIP sunt pusi n 0, rezultand un deplasament care nu depaseste 16 bii.

- 128 -

Jcc adr - Salt condiionat adr: rel8,rel16,rel32. Descriere: Instruciunea Jcc transfer controlul catre un alt punct n lanul de instruciuni fr a se memora adresa de revenire, numai dac este indeplinit condiia cc. Dac aceasta condiie nu este indeplinit, se coninu cu instruciunea imediat urmatoare. Operandul adr (int) specific adresa instruciunii la care se sare. Acest operand este un deplasament relativ. In general, n limbaj de asamblare, deplasamentul relativ este specificat printr-o etichet, dar la nivel de cod masin acesta este decodificat ca o valoare imediata cu semn, de 8, 16 sau 32 de bii. Aceasta valoare este adunat la valoarea din EIP, adica la adresa instruciunii imediat urmatoare celei de salt. Aceasta instruciune poate executa dou tipuri diferite de salturi: Salt apropiat (near) - Un salt catre o instruciune din segmentul de cod curent, segment indicat de coninutul curent al registrului CS), numit i salt intrasegment. Salt scurt (short) - Un salt apropiat la care deplasamntul este limitat ntre -128 i +127 fata de valoarea curent a EIP n funcie de rezultatul operaiei aritmetice sau logice precedente (care modific anumii indicatori de conditii) pot exista urmtoarele forme de instruciuni de salt conditionat: JP adr (JPE adr) - salt condiionat de paritate par. (PF=1) JNP adr (JPO adr) - salt condiionat de paritate impar (PF=0) JO adr - salt condiionat de OF = 1 - a fost depire. JNO adr - salt condiionat de OF = 0 - nu a fost depire. JS adr - salt condiionat de SF = 1 - rezultatul a fost negativ. JNS adr - salt condiionat de SF = 0 - rezultatul a fost pozitiv. JE adr (JZ adr) - salt condiionat de ZF = 1 - egalitate la comparaia anterioar. JNE adr (JNZ adr) - salt condiionat de ZF = 0 - inegalitate la comparaia anterioar. Salturi condiionate de comparaii ale unor numere cu semn: JL adr (JNGE adr) - salt condiionat de SF OF (SF xor OF = 1) - mai mic la comparaia anterioar a unor valori cu semn. JLE adr (JNG adr) - salt condiionat de ZF = 1 sau SF OF - mai mic sau egal la comparai a anterioar a unor valori cu semn. JG adr (JNLE adr) - sat condiionat de ZF = 0 i SF = OF - mai mare la comparaia anterioar a unor valori cu semn. - 129 -

JGE adr (JNL adr) - salt condiionat de SF = OF - mai mare sau egal la comparaia anterioar a unor valori cu semn. Salturi condiionate de comparaii ale unor numere fara semn: JB adr (JNAE adr, JC adr) - salt condiionat de CF = 1 - mai mic la comparaia anterioar a unor valori cu fara semn sau transport la operaia anterioar. JBE adr (JNA adr) - salt condiionat de CF = 1 sau ZF = 1 - mai mic sau egal la comparaia anterioar a unor valori fr semn. JA adr (JNBE adr) salt condiionat de CF = ZF = 0 mai mare la comparaia anterioara a unor valori fr semn. JAE adr (JNB adr, JNC adr) 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 salt condiionat de coninutul lui CX = 0.Deplasament numai pe 8 bii. JECXZ salt condiionat de coninutul lui ECX = 0.Deplasament numai pe 8 bii.

LOOP, LOOPE,(LOOPZ),LOOPNE(LOOPNZ) Mnemonic: LOOP, LOOPE,(LOOPZ),LOOPNE(LOOPNZ) Descriere: Instruciunea LOOP decrementeaz contorul CX sau ECX fr s schimbe flagurile. Apoi sunt testate condiiile specificate de forma LOOP folosit. Dac condiia este ndeplinit, se face un salt scurt (domeniul 128 pn la +127) la eticheta dat de operandul instruciunii LOOP. Acest lucru se repet pn cnd contorul ajunge la 0 sau pn cnd condiia nu mai este ndeplinit. Daca atributul de lungime al operandului este 16 bii contorul va fi CX, iar dac este de 32 de bii contorul va fi ECX . Instruciunea LOOP permite controlul iteratiilor prin combinarea decrementarii automate a indexului cu saltul conditionat. Se foloseste introducnd n registrul contor (CX sau ECX) numarul fr semn al iteratiilor i punnd instruciunea LOOP la sfrsitul seriei de instruciuni care vor fi repetate. Operandul instruciunii LOOP este eticheta de la inceputul secventei care se va repeta. LOOP Repetare de CX ori a secvenei Mnemonic : LOOP rel8. Operand: n: numr cu semn pe 8 bii. Aciune: CX CX - 1; dac CX 0 atunci IP IP + n. - 130 -

Se repet secvena de instruciuni de lungime n octei, marcat cu un capt de instruciunea LOOP pn cnd CX = 0. Lungimea fiind dat de un numr cu semn, poate fi cuprins ntre -128 i +128 octei. LOOPZ (sau LOOPE) Repetare de CX ori a secvenei, condiionat de ZF = 1 Mnemonic: LOOPZ rel8. Operand: n: numr cu semn pe 8 bii. Aciune: CX CX 1; dac ZF =1 i CX 0 atunci IP IP + n. Se repet secvena de instruciuni de lungime n octei, marcat cu un capt de instruciunea LOOP pn cnd CX = 0, dar numai ct timp ZF =1. Orice resetare a fanionului ZF duce la ieirea forat din ciclu. Lungimea fiind dat de un numr cu semn, poate fi cuprins ntre -128 i +128 octei. LOOPNZ (sau LOOPNE)Repetare de CX ori a secvenei, condiionat de ZF = 0. Mnemonic: LOOPNZ rel8 Operand: n: numr cu semn pe 8 bii. Aciune: CX CX -1; dac ZF = 0 i CX 0 atunci IP IP + n. Se repet secvena de instruciuni de lungime n octei, marcat cu un capt de instruciunea LOOP pn cnd CX = 0, dar numai ct timp ZF = 0. Orice resetare a fanionului ZF duce la ieirea forat din ciclu. Lungimea fiind dat de un numr cu semn, poate fi cuprins ntre -128 i +128 octei. CALL adr - apel de subrutin Descriere: Instruciunea CALL conduce la execuia subrutinei (procedurii) al carei nume este specificat de operand. Cnd aceasta procedur s-a terminat (apare o instruciune RET de rentoarcere), execuia programului continu cu instruciunea imediat urmtoare instruciunii CALL. Aciune: Exist doua variante ale acestei instruciuni, a caror Aciune este urmatoarea: CALL apropiat (near). Sunt acele apeluri de proceduri care au operandul de tip r16, m16, r232, m32, rel16 i rel32, care se execut n interiorul aceluiasi segment. Prin urmare, schimbarea i salvarea registrului de segment de cod nu este necesara. Formele CALL rel16 i CALL rel32 aduna un deplasament cu semn la coninutul lui EIP (adresa instruciunii care urmeaza lui CALL), pentru a determina - 131 -

destinaia. Marimea operandului determina i coninutul EIP; dac acesta este de numai 16 bii, cei 16 bii superiori din EIP sunt pusi n 0, rezultand un deplasament care nu depaseste 16 bii. Formele CALL r16/m16 i CALL r32/m32 specific un registru sau o adresa de memorie de unde se extrage deplasamentul absolut fata de baza segmentului (adresa efectiva). Marimea operandului determina i marimea deplasamentului extras. Valoarea curenta a lui EIP (adresa instruciunii imediat urmatoare lui CALL) este salvat n stiv nainte de incrcarea EIP cu noua adres efectiv (deplasament fa de baza segmentului). Aceasta va fi readus n EIP de instruciunea RET cu care se termina subrutina. CALL indeprtat (far). Formele CALL ptr16:16 i CALL ptr 16:32 folosesc un pointer de 4 sau 6 octei catre subrutina chemat. Formele CALL m16:16 i CALL m16:32 extrag pointerul respectiv din locatia de memorie specificata. In modul Real sau Virtual 8086, pointerul da 16 bii pentru registrul CS i restul de 16 sau 32 de bii pentru registrul EIP. Instruciunile CALL indeprtat salveaz n stiva i registrul CS i registrul IP (sau EIP). RET rentoarcere din subrutin Mnemonic: RET RET n Descriere: Instruciunea RET produce rentoarcerea dintr-o subrutin prin transferarea controlului la instruciunea a crei adresa se afl n stiv. Acest adresa este n mod normal plasat n stiv de o instruciune CALL, iar rentoarcerea se face la instruciunea imediat urmtoare acesteia. Parametrul numeric opional al instruciunii RET da numarul de octei din stiv (dac operandul e pe 16 bii) sau de cuvinte (dac operandul e pe 32 de bii) care s fie eliberai dup ce este extras adresa de rentoarcere. Pentru o rentoarcere intrasegment (apropiat), adresa extras din stiv este un deplasament fa de baza segmentului (adresa efectiv) care va fi ncarca n IP. Registrul CS ramne neschimbat. Pentru o rentoarcere intersegment (ndeprtat), adresa extras din stiv este un pointer. Mai nti este extras deplasamentul i ncarcat n IP iar apoi adresa de segment i ncarcata n CS. INT apelare ntrerupere software Mnemonic: INT n INTO Descriere: Instruciunea INT genereaza o chemare prin software a unei subrutine de tratare a unei intreruperi. Operandul imediat, cuprins ntre 0 i 255 da - 132 -

indexul n tabela de intreruperi al subrutinei care este chemat. n modul Real, aceasta tabel cuprinde pointeri de cte 4 octei ntreruperea condiionat INTO este identic cu INT, dar operandul implicit este 4, i poate apare numai dac flagul Overflow este setat. Primele 32 de ntreruperi sunt rezervate de Intel pentru utilizri speciale. Unele dintre ele sunt folosite de excepiile generate intern de procesor. INT se comport n principiu ca un CALL (far) dar nainte de a se salva n stiv adresa de reintoarcere, se salveaz i registrul de flaguri. Subrutinele de tratare a ntreruperilor se ncheie cu instruciunea IRET care aduce din stiv i adresa de reintoarcere i coninutul registrului de flaguri Instruciunea INT este folosit frecvent pentru apelarea unor subrutine standard din BIOS sau din sistemul de operare (vezi anexele 2 i 3), care pot realiza foarte eficient o serie de aciuni de larg rspndire. IRET rentoarcere din ntrerupere Descriere: In modul Real, instruciunea IRET extrage din stiv adresa de rentoarcere din subrutina de tratare a unei intreruperi, precum i registrul de flaguri. Aceasta are ca efect revenirea n program la instruciunea imediat urmatoare celei care a precedat ntreruperea, cu reactivarea ntreruperilor (acceptarea unei cerei de ntrerupere sterge flagul de ntreruperi). Ca alternativ, dac s-ar folosi la sfritul rutinei de ntrerupere o instruciune de tip RET, aceasta ar trebui precedat de o instruciune STI pentru reactivarea intreruperilor. A1.6. Instruciuni speciale HLT - oprirea oricrei activiti a procesorului. Se poate iei numai cu RESET sau ntrerupere hard. Daca se iese din aceasta stare cu o intrerupere (inclusiv NMI), programul coninu cu instruciunea imediat urmtoare instruciunii HLT. NOP - Instruciune fr operaie.

- 133 -

- 134 -

ANEXA 2 Lista serviciilor de ecran INT 10h


ntreruperea 10h pune la dispoziia programatorului urmtoarele servicii pentru lucrul cu ecranul : 00h - Stabilire mod video; 01h - Stabilire dimensiune cursor; 02h - Stabilire poziie cursor; 03h - Citete cursor; 04h - Citete poziia creionului grafic; 05h - Selecteaz pagina video; 06h - Scroll n sus; 07h - Scroll n jos; 08h - Citete carcter i atributul; 09h - Scrie carcter i atributul; 0Ah -Scrie caracter numai la cursor; 0Bh - Stabilire chenar i palet; 0Ch - Scrie pixel; 0Dh - Citete pixel; 0Eh - Scrierea caracterului n modul Teletype (TTY); 0Fh - Citete modul video curent; 10h - Setarea regitrilor paletei la EGA /VGA; 11h - Generatorul de caractere EGA; 12h - Funcii speciale EGA; 13h - Scrierea unui ir de caractere; 14h - Utilizarea LCD; 15h - Citete caracteristicile fizice ale adaptorului grafic.

Aceste servicii sunt prezentate detailat n continuare. Dei ofer i posibiliti de scriere pe ecran, nu este recomandat utilizarea acestora datorit vitezei reduse. Variante mai performante sunt cele care folosesc INT 21h i mai ales cele cu scriere direct n memoria de ecran.

- 135 -

INT 10h, 00h (0) Stabilire mod video


Intrri: AH AL 00h; Modul video. AX, SP, BP, SI, DI.

Rezultate: Nici unul. Registre modificate:

-----------------------------------------------------------------Tabelul modurilor video Adresa de Mod Tip Rezoluia Adaptor Culori memorie 00h Text 40 x 25 All but MDA 16 gray B8000 01h Text 40 x 25 All but MDA 16 fore/8 back B8000 02h Text 80 x 25 All but MDA 16 gray B8000 03h Text 80 x 25 All but MDA 16 fore/8 back B8000 04h Graphics 320 x 200 All but MDA 4 B8000 05h Graphics 320 x 200 All but MDA 4 gray B8000 06h Graphics 640 x 200 All but MDA 2 B8000 07h Text 80 x 25 MDA,EGA b/w B0000 08h Graphics 160 x 200 PCjr 16 B0000 09h Graphics 320 x 200 PCjr 16 B0000 0Ah Graphics 640 x 200 PCjr 4 B0000 0Bh Reserved (internal to EGA) 0Ch Reserved (internal to EGA) 0Dh Graphics 320 x 200 EGA 16 A0000 0Eh Graphics 640 x 200 EGA 16 A0000 0Fh Graphics 640 x 350 EGA b/w A0000 10h Graphics 640 x 350 EGA 16 A0000 -----------------------------------------------------------------Observaii Atunci cand modul video se schimb, ecranul se terge automat. Totui, nu se recomand folosirea acestui serviciu pentru tergerea ecranului deoarece este mai lent dect serviciile normale de stergere a ecranului (serviciile 06h sau 07h). Pentru a evita tergerea ecranului se va chema ntreruperea cu bitul cel mai semnificativ din AL n 1. n modul grafic, cursorul nu este afiat (el poate fi totui citit). Schimbarea modului video schimb i dimensiunea cursorului. Se poate folosi serviciul 0Fh al ntreruperii 10h pentru a citi modul video curent.

Vezi i : INT 10h, 06h INT 10h, 07h INT 10h, 0Fh.

- 136 -

INT 10h, 01h (1) - Stabilire dimensiune cursor


Ajusteaz dimensiunea nceput i de sfrit. Intrri: AH CH CL cursorului prin stabilirea liniei de

01h; Linia de nceput a cursorului (0 - 31); Linia de sfrit a cursorului (0 - 31).

Rezultate:

Nici unul. AX, SP, BP, SI, DI.

Registre modificate:

Valorile liniilor de nceput i sfrit ale cursorului (CH si CL) Adaptor CGA MDA EGA, VGA Permise nceput 0 0 0 Sfrit 7 13 13 Implicite nceput 6 11 6(11) Sfrit 7 12 7(12) Depinde de mod

Observaii: Numerotarea liniilor ncepe din partea superioar a blocului unui caracter (0) i crete n jos. Dac se specific o linie de sfrit cu un numr mai mic dect al celei de nceput, cursorul va apare format din dou linii conform principiului: dup ultima linie a blocului de caracter urmeaz prima linie. Punerea n 1 a biilor 4 sau 5 din CL sau CH produce rezultate dependente de plac grafic, i de regul se evit. Exist o singur dimensiune a cursorului la un moment dat pentru toate paginile video Clipirea cursorului nu poate fi dezactivat (este produsa de hardware), dar se poate face cursorul invizibil. n acest scop se poziioneaz cursorul cu serviciul 02h n afara zonei vizibile a ecranului (de exemplu pe linia 25). Acest serviciu afecteaz doar modurile text; n modurile grafice cursorul nu este afiat. Pentru citirea dimensiunii cursorului se poate folosi serviciul 03h.

Vezi i: INT 10h, 03h INT 10h, 02h .

- 137 -

INT 10h, 02h (2) - Stabilire poziie cursor


Seteaz poziia cursorului (linie i coloan) pentru o pagin afiat specificat. Intrri: AH BH DH DL 02h; Numarul paginii afiate; Linie; Coloan.

Rezultate:

Nici unul. AX, SP, BP, SI, DI.

Registre modificate:

-----------------------------------------------------------------Observaii: Acest serviciu poate poziiona cursorul pe pagina activ afiat sau pe o pagin inactiv. n modurile grafice, acest serviciu seteaz poziia logic a cursorului, chiar i dac cursorul n sine nu este afiat (cursorul nu este afiat n nici unul din modurile grafice). Pentru a face cursorul invizibil, acesta se poate poziiona la linia 25. Colul stnga sus al imaginii este DH = 0h, DL = 0h, iar colul dreapta este DH = 18h (24), DL = 27h (39) pentru ecran cu 40 de coloane, sau 4Fh (79) pentru ecran cu 80 de coloane. A se vedea serviciul 05h pentru o list de numere de pagin valide pentru diferitele moduri de afiare. Deoarece servi ciul nu verifica valoarea, pot aprea rezultate eronate dac de pagin invalid. Numrul paginii se specific un numr pentru modurile grafice este 0.

Vezi i : INT 10h, 03h INT 10h, 05h.

- 138 -

INT 10h, 03h (3)

Citete poziia i mrimea cursorului


cursorului

Raporteaz poziia (linia i coloana) i mrimea pentru pagina afiat specificat. Intrri: Rezultate: AH BH CH CL DH DL 03h; Numrul paginii afiate. Linia de start a cursorului; Linia de sfrit a cursorului; Linie; Coloan. AX, SP, BP, SI, DI.

Registre modificate:

Valorile liniilor de nceput i sfrit ale cursorului (CH si CL) Adaptor CGA MDA EGA, VGA Permise nceput Sfrit 0 7 0 13 0 13 nceput 6 11 6(11) Implicite Sfrit 7 12 7(12) Depinde de mod

Observaii: Acest serviciu poate raporta poziia cursorului n pagina activ, afiat, sau ntr-o pagin inactiv. Deoarece exist numai un cursor hardware, linia de start a cursorului (CH) i cea de sfrit (CL) (i deci mrimea cursorului) vor avea aceeai valoare indiferent ce numar de pagin a fost specificat. n modurile grafice, acest serviciu raporteaz poziia logic a cursorului, chiar dac cursorul nu este afiat. Colul din stnga sus al imaginii este DH = 0h, L = 0h, pe cnd cel din dreapta jos este DH = 18h(24), DL = 27h (39) pentru modul de 40 de coloane sau 4Fh (79) pentru modul de 80 de coloane. A se vedea Serviciul 05h pentru o list de numere de pagin valide pentru diferite moduri de afiare. Deoarece serviciul nu verific valorile, pot s apar rezultate eronate dac se specific un numr invalid. Numrul paginii pentru modul grafic este 0. Se folosete Serviciul 02h pentru a seta poziia curent a cursorului. Se folosete Serviciul 01h pentru a seta mrimea curent a cursorului.

Vezi i: INT 10h, 01h INT 10h, 02h INT 10h, 05h.

- 139 -

INT 10h, 04h (4)


Intrare: Rezultate: AH AH BX CH CX DH DL

Citete poziia creionului optic


04h. Stare (0=neactivat, 1=activat); Numrul coloanei unui pixel (0-639); Numrul liniei unui pixel (0-199); Numrul liniei pentru modurile 0Fh-10h(0-nnn); Numrul liniei caracterului (0-24); Numrul coloanei caracterului (0-39 sau 0-79). AX, SP, BP, SI, DI.

Raporteaz poziia i starea creionului optic.

Registre modificate:

Observaii: Poziia este raportat sub dou forme: poziia caracterului (linie n DH, coloana in DL), sau locaia pixelului (linia raster n CH, coloana/punct n BX). Dac rezult AH este 0, creionul optic nu este suportat. Coordonatele pixelului pentru poziia creionului optic nu sunt exacte. Coordonatele y sunt ntotdeauna un multiplu de 2, pe cnd coordonatele x sunt un multiplu de 4 pentru rezoluia 320x200 i multiplu de 8 pentru rezoluia de 640x200.

- 140 -

INT 10h, 05h (5)


Intrare: Rezultate: AH AL

Seteaz pagina activ afiat


05h; Numrul paginii afiate.

Seteaz pagina activ afiat.

Nici unul. AX, SP, BP, SI, DI.

Registre modificate:

-----------------------------------------------------------------Valorile valide de pagin (AL) Mod video Pagini valide 00h 0-7 01h 0-7 02h 0-3 03h 0-3 04h 0 05h 0 06h 0 07h 0 08h 0 09h 0 0Ah 0 0Dh 0-7 0Eh 0-3 0Fh 0-1 10h 0-1 -----------------------------------------------------------------Observaii: Coninutul paginii afiate nu este distrus cnd pagina curent este modificat. De fapt, se poate scrie pe o pagina inactiv, apoi s se schimbe obinnd astfel modificri rapide ale ecranului. Folosii serviciul 0Fh pentru a determina pagina activ curent.

Vezi i: INT 10h, 0Fh.

- 141 -

INT 10h, 06h (6)

Deruleaz fereastra n sus

Deruleaz fereastra specificat, n sus, cu numrul de linii specificat. Intrare: AH AL 06h; Numrul de linii de derulat (daca este 0, terge ntreaga fereastr);

BH Atributele display-ului pentru liniile goale;


CH CL DH DL Rezultate: Numrul Numrul Numrul Numrul liniei din colul stnga sus; coloanei din colul stnga sus; liniei din colul dreapta jos; coloanei din colul dreapta jos.

Nici unul. AX, SP, BP, SI, DI.

Registre modificate:

-----------------------------------------------------------------Liniile sunt inserate n partea de jos a ecranului, mutnd toate liniile n sus. Noile linii sunt scrise cu atributuele stabilite de valoarea din BH. Liniile care dispar din partea de sus a ferestrei se pierd. Observaii: Dac numarul de linii de derulat este specificat ca find 0, ntreaga fereastr este umplut cu spaii. Folosii serviciul 07h pentru a derula fereastra n jos. Acest serviciu afecteaz numai pagina activ curent afiat.

Vezi i: INT 10h, 07h.

- 142 -

INT 10h, 07h (7)

Deruleaz fereastra n jos

Deruleaz fereastra specificat n jos cu un numr specificat de linii. Intrri: AH AL BH CH CL DH DL Rezultate: 07h; Numrul de linii de derulat (dac este 0, terge ntreaga fereastr); Afieaz atributele pentru liniile libere; Numrul liniei din colul stnga sus; Numrul coloanei din colul stnga sus; Numrul liniei din colul dreapta jos; Numrul coloanei colul dreapta jos.

Nici unul. AX, SP, BP, SI, DI

Registre modificate:

Liniile sunt introduse n partea de sus, iar toate celelalte linii se deplaseaz n jos. Noile linii sunt scrise cu caractere blanc avnd atributele date de valoarea din BH. Liniile care dispar n partea de jos a ferestrei se pierd. Observaii: Dac numrul de linii de derulat este dat ca fiind 0, ntreaga fereastr este umplut cu spaii. Folosii serviciul 06h pentru a derula fereastra n sus. Acest serviciu afecteaz numai pagina activ curent.

Vezi i: INT 10h, 06h

- 143 -

INT 10h, 08h (8)

Citete caracterul (i atributele) de la cursor


atributele n pagina

Raporteaz valoarea ASCII i (n modul text) caracterului de la locaia curent a cursorului specificat. Intrare: Rezultate: AH BH AH AL

08h; Afieaz numrul paginii (numai n modurile text). Atributele caracterului (mod text); Valoarea ASCII a caracterului. AX, SP, BP, SI, DI.

Registre modificate:

Observaii: n modul grafic, pagina afiat nu mai trebuie specificat. Atributele i caracterul curent pot fi obinute pentru orice pagin, chiar i dac pagina nu este cea activ, curent. Folosii Serviciul 09h pentru a scrie un caracter cu atribute specifice.

Vezi i: INT 10h, 09h

- 144 -

INT 10h, 09h (9)

Scrie un caracter (i atributele) la cursor

Afieaz caracterul dat, cu atributul specificat, de un numr de ori dat. Intrare: AX AL BH BL CX 09h; Valoarea ASCII a caracterului; Afieaz pagina (numai n modul text); Atribute/Culoare; De cte ori se scrie caracterul.

Rezultate:

Nici unul. AX, SP, BP, SI, DI.

Registre modificate:

Observaii: Afiarea ncepe la locaia curent a cursorului pe pagina afiat, specificat, dar cursorul nu este micat. n modul text, caracterele care se extind peste marginea din dreapta ecranului sunt ataate liniiei urmtoare; n modul grafic, acest lucru nu se ntampl. Acest serviciu afieaz caracterele control ca pe nite caractere printabile, n loc de echivalentul acestora pentru controlul cursorului. De exemplu, dac AL este 13, atunci se va afia nota muzical, n loc de Carriage Return. n modurile grafice, dac atributul (BL) este dat cu bitul cel mai semnificativ n 1, se face un XOR ntre biii de culoare ai caracterului specificat i biii de culoare ai caracterului curent. Se poate utiliza aceast opiune pentru scrierea de caractere iar apoi tergerea acestora.

Vezi i: INT 10h, 0Ah INT 10h, 0Eh INT 10h, 13h INT 10h, 08h.

- 145 -

INT 10h, 0Ah (10)


Intrare: AH AL BH CX

Scrierea caracterului la cursor


0Ah; Valoarea ASCII a caracterului; Afieaz numarul paginii (numai mod text); Numrul de ori de scriere al caracterului.

Afieaz caracterul specificat de un numr de ori dat.

Rezult:

Nici unul. AX, SP, BP, SI, DI. pe pagina

Registre modificate:

Afiarea ncepe la locaia curent a cursorului afiat, specificat, dar cursorul nu este miscat.

Observaii: Folosii Srviciul 09h pentru modul grafic, deoarece permite s se schimbe culorile. n modul text, caracterele care se ntind peste marginea dreapt a ecranului sunt lipite liniiei urmatoare; n modul grafic acest lucru nu se ntampl. Acest serviciu afieaz caracterele control ca pe nite caractere printabile, n loc de echivalentul acestora pentru controlul cursorului. De exemplu, dac AL este 13, atunci se va afia nota muzical, n loc de Carriage Return. Diferena dintre acest serviciu i Serviciul 09h este ca, acest serviciu nu acord dreptul de a specifica octetul de atribute Acest serviciu folosete atributul de la pozitia curenta a cursorului pentru noul caracter.

Vezi i: INT 10h, 09h INT 10h, 0Eh INT 10h, 13h.

- 146 -

INT 10h, 0Bh (11)


Selecteaz afiare. Intrare:

Seteaz paleta de culori


de culori pentru diferitele moduri de

paleta AX BH BL

0Bh; Id-ul Paletei de culori (0 sau 1, vezi mai jos); Valoarea culorii sau paletei, pentru a fi utilizat cu ID-ul Culorii (0 -31).

Rezultate:

Nici unul. AX, SP, BP, SI, DI.

Registre midificate: Daca BH (ID-ul . Seteaz . Seteaz . Seteaz

Paletei de Culori) este 0, atunci: culoarea de fond pentru rezoluia 320 x 200 culoarea chenarului pentru modurile text culoarea frontal pentru rezoluia de 640 x 200

BL conine culoarea de utilizat. EGA-ul va seta culoarea de fond pentru rezoluia de 640 x 200. Cnd se seteaz culorile chenarelor pentru modurile text, culorile 16 -31 vor selecta setul de fond de intensitate mare. Daca BH (ID-ul paletei de culori) este 1, atunci: . Selecteaz paleta de culori pentru rezoluia de 320 x 200 Valoarea n BL determin care combinaie de palet s fie utilizat, dup cum este definit mai jos: -----------------------------------------------------------------Paleta 0 (BL = 0) Valoare Pixel Culoare 0 Culoarea curent de fond 1 Verde 2 Rou 3 Maro -----------------------------------------------------------------Paleta 1 (BL = 1) Valoare Pixel Culoare 0 Culoarea curent de fond 1 Cyan 2 Magenta 3 Alb

Vezi i: INT 10h, 10h.

- 147 -

INT 10h, 0Ch (12)

Scriere pixel

Scrie un punct pixel de culoare dat la coordonatele de ecran specificate. Intrare: AH AL CX DX BH Nici unul. 0Ch; Culoare pixel; Poziia pe orizontal a pixelului; Poziia pe vertical a pixelului; Afieaz numarul paginii (modurile grafice cu mai mult de o pagin). AX, SP, BP, SI, DI.

Rezultate:

Registre modificate:

-----------------------------------------------------------------Valori valide Mode CX(Horizontal) DX(Vertical) AL(Pixel Color) BH(Page Number) 04h 0-319 0-199 0-3 05h 0-319 0-199 0-3 06h 0-639 0-199 0-1 0Dh 0-319 0-199 0-15 0-7 0Eh 0-639 0-199 0-15 0-3 0Fh 0-639 0-349 0-1 0-1 10h 0-639 0-349 0-15 0-1 -----------------------------------------------------------------Observaii: Dac culoarea pixelului (AL) este dat cu bitul cel mai semnificativ n 1, se face un XOR ntre biii de culoare ai caracterului specificat i biii de culoare ai caracterului curent. Se poate utiliza aceast opiune pentru scrierea de caractere iar apoi tergerea acestora.

Vezi i: INT 10h, 0Dh.

- 148 -

INT 10h, 0Dh (13)


Raporteaz precizate. Intrare:

Citire pixel
pixelului la coordonatele de ecran

culoarea AH CX DX BH

0Dh Poziia pe orizontal a pixelului Poziia pe vertical a pixelului Afieaz numrul paginii (modurile grafice cu mai mult de o pagin) Culoarea pixelului AX, SP, BP, SI, DI

Rezultate:

AL

Registre modificate:

-----------------------------------------------------------------Valori valide Mode CX(Horizontal) DX(Vertical) AL(Pixel Color) BH(Page Number) 04h 0-319 0-199 0-3 05h 0-319 0-199 0-3 06h 0-639 0-199 0-1 0Dh 0-319 0-199 0-15 0-7 0Eh 0-639 0-199 0-15 0-3 0Fh 0-639 0-349 0-1 0-1 10h 0-639 0-349 0-15 0-1 -----------------------------------------------------------------Observaii: Pentru modurile 0Dh pn la 10h, numarul paginii este necesar s fie precizat n BH.

Vezi i: INT 10h, 0Ch.

- 149 -

INT 10h, 0Eh (14)


Scrie un avanseaz. Intrare:

Scrierea caracterului n modul Teletype (TTY)


la locaia curent a cursorului i l

caracter AH AL BL BH

0Eh; Caracterul de scris; Culoarea (numai modurile grafice); Numarul paginii afiate (numai modurile text).

Rezultat:

Nici unul.

Observaii: n modurile text, caracterul afiat are atributele de afiare ale caracterului anterior, care ocup acea locaie de ecran. n modurile grafice, este necesar s se precizeze culoarea de front (n BL) de fiecare dat, cnd se utilizeaz acest serviciu. n modurile text, caracterele pot fi scrise s afieze alte pagini dect cea activ. Acest serviciu rspunde la valorile ASCII ale caracterelor 07h (bell), 08h (backspace), 0Ah (linefeed), i 0Dh (carriage return). Toate celelalte valori ASCIIau ca efect afiarea unui caracter, mutnd cursorul cu o poziie. Dac cursorul se afl la sfritul unei linii, este ataat urmatoarei linii. Dac cursorul este la sfritul ultimei linii a ecranului, ecranul este derulat n sus iar atributul de afiare pentru ntreaga nou linie este luat de la ultimul caracter al liniei anterioare.

Vezi i: INT 10h, 09h INT 10h, 0Ah INT 10h, 13h.

- 150 -

INT 10h, 0Fh (15)

Citete modul video curent

Raporteaz modul video curent, numrul poziiilor caracterelor per linie n acel mod video, i pagina curent afiat. Intrare: Rezultte: AH AL AH BH 0Fh; Mod video; Numr de coloane de caractere per linie; Numrul paginii active afiate. AX, SP, BP, SI, DI.

Registre modificate:

Observaii: Vezi serviciul 00h pentru un tabel de moduri video i cum se seteaz modul video curent.

Vezi i: INT 10h, 00h

- 151 -

INT 10h, 10h (16)


Intrare:

Setarea regitrelor paletei la EGA /VGA


AH AL 10h; Subserviciu: 0Seteaz registrul paletei: BL Registru palet; BH Valoarea de setat; 1Seteaz registrul culorii de contur: BH Valoarea de setat; 2Seteaz regitrii paletei i conturului: ES:DX Pointerul listei de culori. 3Activeaz bitul intensificare/clipire: BL 0 Activeaz intensificare; 1 Activeaz clipire.

Seteaz regitrii de paleta i contur la EGA/VGA.

Subservicii numai VGA: 7BL = registrul culoare de luat n BH; 8Rezult valoarea conturului n BH; 9Rezult lista registrilor paletei i valoarea conturului: ES:DX pointer ctre lista; 10hSeteaz registrul culorii: BX Registrul de setat; CH,CL,DL verde/albastru/Rosu; 1AhInformaie despre culoarea paginii: BL Mod; BH Pagin. Regitrii modificati: AX, SP, BP, SI, DI.

Sunt 16 regitri de palete n modurile de afiare EGA/VGA i un registru de contur. Acest serviciu ofer utilizatorului control asupra acestor regitri. Subserviciul 0 (Setarea Registrului Paletei)

Fiecare din cei 16 regitrii de palete poate lua o valoare de la 1 la 64. Valoarea n BH are forma urmtoare: Bit Bit Bit Bit Bit Bit Bit Bit 7 6 5 4 3 2 1 0 Rezervat Rezervat Rou Secundar Verde Secundar Albastru Secundar Rou Verde Albastru

- 152 -

Culorile secundare au intensitai de 1/3, pe cnd culorile normale au o intensitate de 2/3. De exemplu, BH = 02h va produce verde, BH = 10h va produce un verde pal, iar BH = 02h va produce un verde intens. Valorile implicite pentru regitrii paletelor, care sunt aceeai ca cei ai adaptorului grafic color (CGA), sunt definii mai jos: -----------------------------------------------------------------Registru de Valoare culoare Culoare paleta 00h 00h Negru 01h 01h Albastru 02h 02h Verde 03h 03h Cian 04h 04h Rou 05h 05h Mov 06h 14h Maro 07h 07h Alb 08h 38 Gri inchis 09h 39h Albastru deschis 0Ah 3Ah Verde deschis 0Bh 3Bh Cian deschis 0Ch 3Ch Rou deschis 0Dh 3Dh Mov deschis 0Eh 3Eh Galben 0Fh 3Fh Alb intens -----------------------------------------------------------------Subserviciul 1 (Seteaz registrul de contur) Acest subserviciu seteaz culoarea conturului. este suportat numai n moduri de 200 de linii. Subserviciul

Subserviciul 2 (Seteaz toti regitrii paletelor i de contur) ES:DX indic o list de 17 octei de culoare, n care primii 16 octei conin in valori noi pentru cei 16 regitri ai paletelor i ultimul octet conine este noua valoare a registrului de contur. n mod normal, bitul 7 al octetului de atribut este folosit pentru a indica clipirea. Cu acest subserviciu, bitul 7 poate indica clipirea (BL=1) sau intensitatea de fond (BL=0). Subserviciul 3 (Comut bitul intensitate/clipire )

- 153 -

Numai VGA: Subserviciul 7 (Citete valoarea registrilor de culoare) Subserviciul 8 (Citete valoarea conturului) Subserviciul 9 (Citete regitrii de culoare) Subserviciul 10h (Seteaz Regitrii de culoare) Subserviciul 12h (Modific regitrii de culoare) Subserviciul 13h (Seteaz pagina) Subserviciul 15h (Citete Registrul de culoare) Subserviciul 17h (ncarc Regitrii de culoare n memorie) Subserviciul 1Ah (Citete informaia de culoare a paginii)

Vezi i: INT 10h, 0Bh.

- 154 -

INT 10h, 11h (17)

Generatorul de caractere EGA

Modific fonturile din adaptorul grafic n fonturi predefinite sau definite de utilizator n ambele moduri, text sau grafic. Intrare: AH AL 11h; Subserviciu: 00h ncarc fontul definit de utilizator (moduri text): ES:BP Indicator ctre tabelul de fonturi; CX Numarare caractere; DX Offset-ul tabelei de caractere; BL Blocul de fonturi de ncarcat (0-3); BH Octei per caracter; 01h ncarc fontul de 8 x14 puncte (setul monocrom): BL Blocul de fonturi de ncarcat (0-3); 02h ncarc fontul dublu-punct, 8 x 8 de caractere (modurile text): BL Blocul de fonturi de ncarcat (0-3); 03h Seteaz specificatorul de bloc (modurile text): BL Biii 3, 2: Selecteaz blocul (0-3) de utilizat cnd bitul 3 al atributului este 1; Biii 1, 0: Selecteaza blocul (0-3) de utilizat cnd bitul 3 al atributului este 0 ; 04h ncarca fontul de 8 x 16 puncte (VGA): BL Blocul de fonturi de ncarcat; 10h ncarc fontul definit de utilizator (modurile text): ES:BP Indicator ctre tabelul de fonturi; CX Numrul de caractere; DX Offset-ul tabelei de caractere; BL Blocul de fonturi de ncarcat (0-3); BH Octei per caracter.

11h ncarc fontul de 8 x 14 puncte (setul monocrom) BL Blocul de fonturi de ncarcat (0-3): 12h ncarc fontul 8 x 8 dublu-punct (modurile text) BL Blocul de fonturi de ncarcat (0-3); 20h ncarc fontul de 8 x 8 puncte definit de utilizator (modurile grafice):

- 155 -

ES:BP Indicator ctre tabelul grafic al utilizatorului pentru caracterele grafice 128-255. INT 1Fh este setat ctre acest indicator. 21h ncarca fontul de caractere definit de utilizator (modurile grafice); ES:BP Indicator ctre tabelul grafic pentru caracterele grafice 0-255.INT 43h d indicatorul. CX Octei per caracter; BL Numrul de linii: 00h DL conine numrul de linii; 01h 14 (0Eh) linii; 02h 25 (19h) linii; 03h 43 (2Bh) linii. 22h ncarc fontul ROM de 8 x 14 puncte (modurile grafice): BL Numrul de linii (Acelai format ca subserviciul 21h); 23h ncarc fontul ROM 8 x 8 dublu-punct (modurile grafice): BL Numrul de linii (Acelai format ca subserviciul 21h); 24h ncarc fontul 8 x 16 de caractere: BL Numrul de linii (Acelai format ca Subserviciul 21h); 30h Rezult informaii despre font: BH Tipul de pointer care rezult: 00h Pointerul curent INT 1Fh; 01h Pointerul curent INT 44h; 02h Pointerul ROM 8 x 14 puncte ; 03h Pointerul ROM 8 x 8 dublu-punct; 04h Pointerul ROM 8 x 8 dublu-punct (sus); 05h Pointerul ROM text alternativ 9 x 14; 06h - 8 x 16 (VGA); 07h - 9 x 16 (VGA). Rezultate: (Numai Subserviciul 30h D informaii despre font); ES:BP Indicator ctre tabelul specificat n BH; CX Linii per caracter; DL Linii.

Vezi i: INT 10h, 12h.

- 156 -

INT 10h, 12h (18)

Funcii speciale EGA


i permite selectarea unei

Rezult informaii asupra EGA rutine alternative EGA Print Screen. Intrare: AH BL

12h; Subserviciu: 10h Rezult informaia EGA; 20h - Selecteaz rutina EGA Print Screen alternativ. Numai VGA: 30h - Seteaz numrul de linii 0-200, 0-350, 2-400. Se activeaz dup schimbarea modului; 31h - AX = 0/1 -> permite/interzice ncarcarea paletei odat cu noul mod; 32h - AL = 0/1 -> Video Pornit/Oprit; 33h - AL = 0/1 -> nsumarea scale de gri Pornit/Oprit; 34h - AL=0/1 ->Scalarea cursorului cu fontul pornit/oprit; 35h Schimb ntre placa video i video de pe placa de baz: AL = 0 adaptor pornit, es:dx salveaz starea; = 1 video de pe placa de baz pornit; = 2 video activ oprit, es:dx salveaz starea; = 3 video inactiv pornit, es:dx salveaz starea; 36h Pornete/oprete ecranul : AL = 0/1 -> Ecran pornit/oprit.

Rezultate:

(numai pentru Subserviciul 10h): BH Modul rezultat: 00h Mod color (domeniu de adresare 3Dxh); 01h Mod monocrom (domeniu de adresare 3Bxh); BL Memorie EGA 00h 64K; 01h 128K; 02h 192K; 03h 256K; CH Biii adaptorului; CL Setrile comutarii.

Vezi i: INT 10h, 11h.

- 157 -

INT 10h, 13h (19)

Scrierea unui ir de caractere

Scrie un ir de caractere cu atributele precizate pe orice pagina afiat. Intrare: AH AL BH BL CX DH DL ES:BP 13h; Subserviciul (0-3); Afieaz numrul paginii; Atribute (Subseviciile 0 si 1); Lungimea irului; Poziia liniei unde urmeaz s fie scris irul; Poziia coloanei unde urmeaz s fie scris irul; Indicatorul ctre irul de scris.

Rezultate:

Nici unul. AX, SP, BP, SI, DI.

Registre modificate:

-----------------------------------------------------------------Observaii: Acest serviciu are 4 subservicii dup cum urmeaz: AL=00h: Aplic tuturor caracterelor atributele din BL; nu modific cursorul; AL=01h: Aplic tuturor caracterelor atributele din BL; modific cursor; AL=02h: Folosete atributele din sir; nu modific cursorul; AL=03h: Folosete atributele din ir; modific cursorul.

Vezi i: INT 10h, 09h INT 10h, 0Ah INT 10h, 0Eh.

- 158 -

INT 10h, 14h (20) Utilizarea LCD


Permite utilizarea de fonturi definite de utilizator i schimbarea atributului de intensitate mare ntr-un alt atribut pe un ecran LCD. Intrare: AH 14h; AL Subserviciu: 00h - ncarc fontul precizat de utilizator: ES:DI Indicator ctre primul tabel de fonturi; CX Numrul de caractere de stocat (1 - 256); DX Offset-ul caracterului n buffer-ul de fonturi din RAM; BL Blocul de fonturi de ncarcat: 0 Font principal (bloc 0); 1 Font alternativ (bloc 1); BH Octei per character (1 - 255); 01h - ncarc blocul de fonturi implicit din ROM: BL Blocul de fonturi de ncrcat: 0 Font principal (bloc 0); 1 Font alternativ (bloc 1); 02h Transformarea atributului de intensitate mare: BL Schema de transformare: 0 - Ignor atributul de intensitate mare; 1 Transform n video invers; 2 - Transform n subliniat;

3 Selecteaz font alternativ.


Rezultate: Nici unul.

Vezi i: INT 10h, 15h.

- 159 -

INT 10h, 15h (21) Citete caracteristicile fizice ale adaptorului grafic
Rezult tipul de adaptor video alternativ descrie caracteristicile ecranului curent. Intrare: Rezult: AH AX 15h. Tipul de adaptor video alternativ: 00h Nici un adaptor alternativ; 5140h LCD; 5153h Tipul CGA de afiare; 5151h Tipul monocrom de afiare; Indicator ctre tabelul de 7 cuvinte al adaptorului video curent (vezi mai jos). Forma Cuvnt Cuvnt Cuvnt Cuvnt Cuvnt Cuvnt 1 2 3 4 5 6 tabelului adaptorului video este i un tabel care

ES:DI

Observaii: urmtoarea:

Numrul modelului video; Pixeli pe metru pe vartical; Pixeli pe metru pe orizontal; Total pixeli pe vertical; Total pixeli pe orizontal; nalimea pixel n micrometrii (direcie vertical); Cuvnt 7 Laimea pixel n micrometrii (direcie orizontal);

-----------------------------------------------------------------Tabelul adaptoarelor video compatibile PC Cuvant Monocrom CGA LCD (CGA) LCD (Monocrom) 1 2 3 4 5 6 7 5151h 0 0 0 0 0 0 5153h 0498h 0A15h 00C8h 0280h 0352h 0184h 5140h 08E1h 0987h 00C8h 0280h 0172h 0172h 5140h 0 0 0 0 0 0

Vezi i: INT 10h, 14h.

- 160 -

ANEXA 3 Lista funciilor sistemului de operare INT 21h


Funciile sistem reprezint o colecie de subrutine standard foarte performante, care pot fi chemate de un program n limbaj de asamblare prin intermediul ntreruperii 21h. Diferenierea ntre ele se face prin valoarea care se ncarc n prealabil n registrul AH, conform tabelului de mai jos. AH Descriere 01 Citete un caracter de la STDIN 05 Scrie un caracter la imprimant 07 Citete direct un caracter de la STDIN far ecou AH Descriere 02 Scrie un caracter la STDOUT 06 Intrare/Ieire Consol 08 Citete un caracter de la STDIN fr ecou

09 Scrie un ir la STDOUT 0B Afl starea STDIN 0D Reset disk 19 Afl unitatea curent implicit 2A Afl data sistemului 2C Afl ora sistemului 2E Seteaza fanionul de verificare 35 Afl vectorul de nterupere 36 Afl spaiul liber de pe disc 3A terge un subdirector 3C Creaz un fiier 3E nchide un fiier 40 Scrie un fiier 42 Caut un fiier 47 Afl directorul curent 4D Afl return code 56 Redenumete fiierul

0A Intrare bufferat 0C Golete bufferul de la STDIN 0E Selecteaz unitatea implicit 25 Seteaz vectorul de ntrerupere 2B Seteaz data sistemului 2D Seteaz ora sistemului 30 Afl versiunea DOS 39 Creaz un subdirector 3B Seteaz directorul de lucru 3D Deschide un fiier 3F Citete un fiier 41 terge un fiier 43 Afl/Seteaz atributele fiierelor 4C Iese din program 54 Afl fanionul de verificare 57 Afl/Seteaz data fiierului

- 161 -

INT 21h, 01h CITETE UN CARACTER DE LA INTRAREA STANDARD, CU ECOU


Intrare: AH=01h. Efect: AL = caracter citit. Observaii:

^C/^Break sunt testate; ^P comut starea fanionului intern DOS al ecoului la imprimant; ^Z nu este interpretat, aadar nu cauzeaz un EOF. Dac intrarea este redirecionat, caracterul este trimis n ecou la ieirea standard.

Vezi i: AH=06h,AH=07h,AH=08h,AH=0Ah.

INT 21h, 02h SCRIE UN CARACTER LA IEIREA STANDARD


Intrare:AH=02h; DL = caracter de scris. Efect: AL = ultimul caracter ieit. Observaii:

^C/^Break sunt testate; ultimul caracter ieit va fi caracterul din DL excepie fcnd DL=09h la intrare, caz n care AL=20h deoarece tab-urile sunt nlocuite cu blank-uri; dac intrarea standard este redirecionat ntr-un fiier, nu se ine cont de nici o eroare (protecie la scriere, mediu de stocare plin, etc.).

Vezi i: AH=06h,AH=09h.

INT 21h, 05h SCRIE UN CARACTER LA IMPRIMANT


Intrare:AH=05h DL = caracter de printat.

- 162 -

Observaii:

se testeaz imprimanta pentru ^C/^Break; STDPRN este de obicei primul port paralel, dar poate fi redirectat sub DOS 2+ ; Dac imprimanta e ocupat, aceast funcie va atepta.

Vezi i: INT 17/AH=00h.

INT 21h, 06h IEIRE DIRECT LA CONSOL


Intrare: AH=06h; DL = caracter (excepie FFh). Efect: AL = caracter ieit. Observaii: nu testeaz ^C/^Break. Vezi i: AH=02h,AH=09h.

INT 21h, 06h INTRARE DIRECT DE LA CONSOL


Intrare: AH = 06h; DL = FFh. Efect:

ZF setat dac nu exist caracter disponibil i AL = 00h; ZF ters dac exist caracter disponibil AL = caracter citit.

Observaii:

^C/^Break nu sunt testate; dac rezultatul returnat este 00h, utilizatorul a apsat o tast cu un cod de tast extins, care se va returna la urmtoarea apelare a acestei funcii. Dei returnarea lui AL=00h atunci cnd nici un caracter nu e disponibil nu este documentat, unele programe se bazeaz pe acest comportament. - 163 -

Vezi i: AH=0Bh.

INT 21h, 07h INTRAREA DIRECT A UNUI CARACTER, FR ECOU


Intrare: AH=07h; Efect: AL = caracter citit de la intrarea standard. Observaii: nu testeaz ^C/^Break. Vezi i: AH=01h,AH=06h,AH=08h,AH=0Ah.

INT 21h, 08h INTRARE CARACTER FR ECOU


Intrare: AH=08h; Efect: AL = caracter citit de la intrarea standard. Observaii: ^C/^Break sunt testate. Vezi i: AH=01h,AH=06h,AH=07h,AH=0Ah,AH=64h.

INT 21h, 09h SCRIE UN IR LA IEIREA STANDARD


Intrare: AH=09h; DS:DX -> ir terminat cu '$'. Efect: AL = 24h. Observaii: ^C/^Break sunt testate. Vezi i: AH=02h,AH=06h"OUTPUT".

- 164 -

INT 21h, 0Ah INTRARE BUFFERAT


Intrare: AH=0Ah; DS:DX -> buffer (vezi mai jos). Efect: buffer umplut cu informaia introdus de utilizator. Observaii:

^C/^Break sunt testate ; citete de la intrarea standard.

Vezi i: AH=0Ch. Formatul buffer-ului de intrare DOS: Index Mrime Descriere 00 01 02 1 1 N Numrul maxim de caractere ce pot intra n buffer Numrul maxim de caractere de de la ultima intrare care pot fi rechemate sau numrul de caractere din citirea actual, fr CR Caracterul actual citit, incluznd CR-ul final

INT 21h, 0Bh AFL STAREA STDIN (Intrare standard)


Intrare: AH=0Bh; Efect:

AL = 00h dac nu exist caracter disponibil; AL = FFh dac caracterul este disponibil.

Observaii: ^C/^Break sunt testate. Vezi i: AH=06h"INTRARE".

- 165 -

INT 21h, 0Ch - GOLETE BUFFERUL I CITETE DE LA INTRAREA STANDARD


Intrare: AH=0Ch; AL = funciea de executat dup golirea bufferului; celelalte registre corespunztoare funciei de intrare. Efect: corespunztor funciei de intrare specificate. Observaie: dac AL nu are una dintre valorile 01h,06h,07h,08h, sau 0Ah, bufferul e golit dar nu este ateptat nici o intrare. Vezi i: AH=01h,AH=06h"INTRARE",AH=07h,AH=08h,AH=0Ah.

INT 21h, 0Dh - RESETAREA DISCULUI


Intrare: AH=0Dh; Observaii: Aceast funcie scrie pe disc toate bufferele modificate, dar nu actualizeaz informaia directoarelor. Vezi i: AX=5D01h.

INT 21h, 0Eh SELECTEAZ UNITATEA IMPLICIT


Intrare: AH=0Eh; DL = noua unitate implicit (0=A:, 1=B:, etc). Efect: AL = numrul unitilor potenial valide. Observaii: valoarea ntoars reprezint valoarea corespunztoare ultimei uniti prezente. Vezi i: AH=19h,AH=3Bh,AH=DBh.

- 166 -

INT 21h, 19h - AFL UNITATEA CURENT IMPLICIT


Intrare: AH=19h; Efect: AL = unitate (0=A:, 1=B:, etc). Vezi i: AH=0Eh,AH=47h,AH=BBh.

INT 21h, 25h - SETEAZ VECTORUL DE NTRERUPERE


Intrare: AH=25h; AL = numrul ntreruperii; DS:DX -> noua tratare a ntreruperii. Observaii: aceast funcie este de preferat modificrii directe a tabelei vectorilor de ntrerupere. Vezi i: AX=2501h,AH=35h.

INT 21h, 2Ah AFL DATA SISTEMULUI


Intrare: AH=2Ah; Efect: CX = an (1980-2099) DH = lun DL = zi AL = zi a sptmnii (00h=Duminic). Vezi i: AH=2Bh"DOS",AH=2Ch,AH=E7h.

- 167 -

INT 21h, 2Bh SETEAZ DATA SISTEMULUI


Intrare: AH=2Bh; CX = an (1980-2099) DH = lun DL = zi. Efect: AL = 00 operaie reuit; FFh dat invalid, data sistemului neschimbat. Observaie: DOS 3.3+ seteaz deasemenea ceasul din CMOS; Vezi i: AH=2Ah,AH=2Dh.

INT 21h, 2Ch AFL ORA SISTEMULUI


Intrare: AH=2Ch; Efect: CH = ora CL = minute DH = secunde DL = 1/100 secund. Observaie: pe majoritatea sistemelor, rezoluia ceasului sistem este de 5/100sec, aa c valoarea lui DL nu se incrementeaz cu 1 pe unele sisteme, acesta returnnd ntotdeauna 00h. Vezi i: AH=2Ah,AH=2Dh,AH=E7h.

INT 21h, 2Dh SETAREA OREI SISTEMULUI


Intrare: AH=2Dh; CH = ora CL = minute DH = secunde DL = 1/100 secund. Efect: AL = 00h operaiune reuit; FFh dac valoarea este invalid, ora sistemului rmne neschimbat. Observaie: De la DOS 3.3 in sus , funcia seteaz si ceasul din CMOS. Vezi i: AH=2Bh"DOS",AH=2Ch. - 168 -

INT 21h, 30h AFL VERSIUNEA DE DOS


Intrare: AH=30h; AL = ce s ntoarc n BH (00h OEM numr, 01h localizarea sistemului de operare). Efect:

AL = numrul superior al versiunii (00h dac DOS 1.x); AH = numrul inferior al versiunii; BL:CX = seria utilizatorului pe 24-biti (majoritatea versiunilor nu folosesc aceasta) dac DOS <5 or AL=00h; BH =Numr furnizorului sistemului dac DOS 5+ i AL=01h; BH = Localizarea sistemului: 08h in ROM, 10h in XMA.

Observaii:

DOS 4.01 i 4.02 se identific ca versiune 4.00; MS-DOS 6.21 raporteaza versiunea ca 6.20; versiunea 6.22 returneaz valoarea corect; Windows95+ returneaz versiunea 7.00 ( MS-DOS-ul asociat).

Vezi i: AX=3000h/BX=3000h,AX=3306h,AX=4452h.

INT 21h, 35h AFL VECTORUL DE NTRERUPERE


Intrare: AH=35h; AL = numrul ntreruperii. Efect: ES:BX -> tratarea ntreruperii curente. Vezi i: AH=25h,AX=2503h.

INT 21h, 36h AFL SPAIUL LIBER DE PE DISC


Intrare: AH=36h; DL = numrul unitii (0=implicit, 1=A:, 2=B:,3=C:,etc). - 169 -

Efect:

AX = FFFFh dac unitatea este invalid; AX = sectoare per cluster BX = numrul de clustere libere CX = bytes per sector DX = numr total de clusteri per unitate.

Observaii:

spaiul liber pe unitate n bytes este AX * BX * CX ; spaiul total pe unitate n bytes este AX * CX * DX; clusterii indisponibili sunt considerai a fi utilizai ; aceasta funcie nu d rezultate corecte pe unitile CD-ROM; folosii n schimb AX=4402h pentru CD-ROM.

Vezi i: AH=1Bh,AH=1Ch,AX=4402h"CD-ROM".

INT 21h, 39h - CREEAZ UN DIRECTOR


Intrare: AH=39h; DS:DX -> ASCIIZ numele cii. Efect:

CF ters dac AX a fost ters; CF setat n caz de eroare AX = cod eroare (03h,05h).

Observaii:

Tooate directoarele din calea dat trebuie s existe, mai puin ultimul; eueaz dac directorul printe este rdcina i este plin; DOS 2.x-3.3 permite crearea unui director suficient de ndeprtat n structura arborescent de directoare, dar nu din directorul curent dac calea depete 64 de caractere.

Vezi i: AH=3Ah,AH=3Bh,AH=6Dh.

- 170 -

INT 21h, 3Ah - TERGE DIRECTORUL


Intrare: AH=3Ah; DS:DX -> ASCIIZ calea directorului de ters. Efect:

CF ters dac AX a fost ters; CF setat n caz de eroare AX = cod eroare (03h,05h,06h,10h).

Observaii: directorul trebuie s fie gol (s conin numai intrri '.' i '..' ). Vezi i: AH=39h,AH=3Bh.

INT 21h, 3Bh - SCHIMBA DIRECTORUL CURENT


Intrare: AH=39h; DS:DX -> ASCIIZ calea directorului ce va deveni curent (maxim 64 bytes) Efect:

CF ters dac AX a fost ters CF setat n caz de eroare AX = cod eroare (03h)

Observaii: dac numele directorului include litera unei uniti, unitatea curent nu este schimbat ci numai directorul curent pe unitatea respectiv. Vezi i: AH=47h,AH=71h,INT 2F/AX=1105h.

INT 21h, 3Ch CREAZ SAU TRUNCHEAZ FIIERUL


Intrare: AX=3Ch CX = atribute fiier; DS:DX -> ASCIIZ nume fiier.

- 171 -

Efect:

CF ters dac a reuit, AX = tratare fiier; CF setat n caz de eroare, AX = cod eroare (03h,04h,05h).

Observaii: dac un fiier cu numele dat exist este trunchiat la dimensiunea zero. Vezi i: AH=16h,AH=3Dh,AH=5Ah,AH=5Bh.

INT 21h, 3Dh DESCHIDE FIIERUL EXISTENT


Intrare: AX=3Dh; AL = modurile de acces i partajare: Bit 0..2: Modul de acces: 000 = numai citire; 001= numai scriere; 010 = citire/scriere. Bit 3: rezervat; Bit 4..6: Modul de partajare: 000 = modul compatibil; 001 = numai programul curent are acces; 010 = interzice scrierea (alte programe pot doar citi fiierul); 011 = interzice citirea (alte programe pot doar s scrie in fiier); 100 = permite totul (alte programe pot scrie i citi fiierul). Bit 7: Se motenesc proprietile. DS:DX -> ASCIIZ nume fiier. Efect:

CF ters dac a reuit, AX = tratare fiier; CF setat n caz de eroare AX = cod eroare (01h,02h,03h,04h,05h,0Ch,56h); 01h = nu exista software pentru partajare; 02h = fiierul nu este gsit; 03h = calea nu este gasita sau fiierul nu exist; 04h = nu exista program de tratare a fisierului; 05h = accesul interzis; 0Ch = modul de acces specificat nu este permis. - 172 -

Observaii:

Indicatorul fiierului este setat la nceputul fiierului; Fiierele trunchiate motenesc de la fiierul printe din care au fost trunchiate; restriciile de acces i partajare; fiierele pot fi deschise chiar dac li se dau atribute hidden sau system.

Vezi i: AH=0Fh,AH=3Ch,AX=4301h,AX=5D00h.

INT 21h, 3Eh NCHIDE FIIERUL


Intrare: AH=3Eh; BX = tratare fiier Efect:

CF ters dac a reuit, AX ters; CF setat n caz de eroare, AX = cod eroare (06h).

Observaie: odat ce fiierul a fost scris, etichetele cu timpul i data creerii fiierului sunt actualizate la valorile curente, iar intrarea n director este reactualizat. Vezi i: AH=10h,AH=3Ch,AH=3Dh.

INT 21h, 3Fh - CITETE DIN FIIER SAU DISPOZITIV


Intrare: AH=3Fh; BX = nume fiier; CX = numr bytes de citit; DS:DX -> buffer de date. Efect:

CF ters dac operaiunea a reuit - AX = numr de bytes citii (0 dac EOF apare naintea chemrii funciei); CF setat n caz de eroare AX = cod eroare (05h,06h). - 173 -

Observaii:

datele sunt citite ncepnd de la locaia curent din fiier, iar poziia locaiei curente este reactualizat dup o citire reuit; rezultatul returnat n AX poate fi mai mic dect cel solicitat n CX dac survine o citire paral; dac se citete de la CON, citirea se oprete la primul CR.

Vezi i: AH=27h,AH=40h,AH=93h.

INT 21h, 40h - SCRIE NTR-UN FIIER SAU DISPOZITIV


Intrare: AH=40h; BX = nume fiier; CX = numr bytes de scris; DS:DX -> date de scris. Efect:

CF ters dac operaiunea a reuit -AX = numr de bytes scris la actuala scriere; CF setat n caz de eroare - AX = cod eroare (05h,06h).

Observaii:

Dac CX este zero, datele nu sunt scrise, iar fiierul este trunchiat sau extins pn la poziia curent; datele sunt scrise ncepnd de la poziia curent, iar poziia n fiier este reactualizat dup fiecare scriere reuit; cauza uzual pentru care se returneaz AX < CX este lipsa de spaiu liber pe disc.

Vezi i: AH=28h,AH=3Fh.

- 174 -

INT 21h, 41H - TERGE FIIERUL


Intrare: AH=41h; DS:DX -> ASCIIZ nume fiier; CL = masca atributului fierului de ters. Efect:

CF ters dac operaiunea a reuit, AX ters; CF setat n caz de eroare, AX = cod eroare (02h,03h,05h).

Observaii:

(DOS 3.1+) caracterele de nlocuire sunt permise dac sunt apelate via AX=5D00h, caz n care specificaiile fiierului trebuie s fie valide (cum sunt citite cu funcia AH=60h), i numai fiierele a cror atribute se potrivesc cu masca atributelor din CL sunt terse; DOS nu terge datele din fiier; pur i simplu fiierul devine inaccesibil deoarece lanul de locaii asociate fiierului este ters din FAT; tergerea unui fiier deschis poate conduce la erori n sistemul de fiiere.

Vezi i: AH=13h,AX=4301h,AX=4380h,AX=5D00h,AH=60h,AH=71h.

INT 21h, 42h - SETEAZ POZIIA CURENT N FIIER


Intrare: AH=42h; AL =originea deplasrii: 00h nceputul fiierului 01h poziia curent n fiier 02h sfritul fiierului; BX = nume fiier; CX:DX = deplasarea (CX octetul mai semnificativ, DX octetul mai puin semnificativ). Efect:

CF ters dac operaiunea a reuit, DX:AX = noua poziie n fiier n bytes de la nceputul fiierului ; CF setat n caz de eroare, AX = cod eroare (01h,06h). - 175 -

Observaii:

Pentru originile 01h i 02h, deplasarea este un numar cu semn, deci indicatorul ar putea fi poziionat naintea nceputului fiierului; nici o eroare nu este semnalat n acest caz, dar ncercrile ulterioare de intrare/ieire vor produce erori; dac noua poziie este dincolo de sfritul fiierului, fiierul va fi extins la urmtoarea scriere (vezi AH=40h).

Vezi i: AH=24h.

INT 21h, 43 - AFL ATRIBUTELE FIIERULUI


Intrare: AH=43h; AL = 00h; DS:DX -> Nume fiier (ASCIIZ). Efect:

CF ters dac operaiunea a reuit, CX = atributele fiierului; CF setat n caz de eroare, AX = cod eroare (01h,02h,03h,05h).

Observaie: Windows for Workgroups returneaz cod eroare 05h (acces nepermis) n locul codului de eroare 02h (fiierul nu a fost gsit) atunci cnd se ncearc aflarea atributelor unui fiier inexistent. Vezi i: AX=4301h,AX=4310h,AX=7143h,AH=B6h.

INT 21h, 43 SETEAZ ATRIBUTELE FIIERULUI


Intrare: AH=43h; AL = 01h; CX = noile atribute fiier; DS:DX -> Nume fiier (ASCIIZ). - 176 -

Efect:

CF ters dac operaiunea a reuit, AX ters; CF setat n caz de eroare, AX = cod eroare (01h,02h,03h,05h).

Observaii:

nu va schimba eticheta de volum a directorului sau biii atributelor; directorului, dar va schimba ali bii ai atributelor din director; MS-DOS 4.01 raporteaz fiierul nchis dac acesta era deschis.

Vezi i: AX=4300h,AX=4311h,AX=7143h,INT 2F/AX=110Eh. Cmpul biilor pentru atributele fiierelor: Bii 7 6 5 4 3 2 1 0

Descriere Partajabil - arhiv director eticheta volum sistem ascuns numai citire

INT 21h, 47h AFL DIRECTORUL CURENT


Intrare: AH=47h; DL = numr unitate (00h = implicit, 01h = A:, etc); DS:SI -> buffer de 64 bytes pentru numele cii (ASCIIZ ). Efect:

CF ters dac operaiunea a reuit; CF setat n caz de eroare, AX = cod eroare (0Fh).

Observaii:

Calea returnat nu include unitatea sau primul backslash; Multe din produsele Microsoft Windows se bazeaz pe faptul c AX devine 0100h cnd operaiunea a reuit.

Vezi i: AH=19h,AH=3Bh,AH=71h. - 177 -

INT 21h, 4Ch IEIRE CU COD DE FINALIZARE


Intrare: AH=4Ch; AL = cod finalizare. Efect: nu se mai ntoarce. Observaii: n afara cazului n care procesul este propriul su printe, toate fiierele sunt nchise i toat memoria aparinnd procesului este eliberat. Vezi i: AH=00h,AH=26h,AH=4Bh,AH=4Dh.

INT 21h, 4Dh AFL CODUL RETURNAT (NIVELUL ERORII)


Intrare: AH=4Dh; Efect:

AH = tip terminare (00=normal, 01h control-C abandon, 02h=abandon eroare critic, 03h termin i rmne resident); AL = codul returnat.

Observaii:

Locaia n care sistemul DOS stocheaz codul returnat este tears dup ce a fost citit de aceast funcie, aadar codul returnat poate fi aflat o singur dat; COMMAND.COM stocheaz codul returnat la ultima comand extern, ca nivel al erorii

Vezi i: AH=4Bh,AH=4Ch,AH=8Ah.

- 178 -

INT 21h, 54h AFL STAREA FANIONULUI DE VERIFICARE


Intrare: AH=54h; Efect: AL = fanion de verificare (00h=off, 01h=on, deci toate scrierile pe disc sunt verificate dup scriere).

Vezi i: AH=2Eh.

INT 21h, 56h - REDENUMETE FIIERUL


Intrare: AH=56h; DS:DX -> Numele existent al fiierului (ASCIIZ fr caractere speciale); ES:DI -> Noul nume al fiierului (ASCIIZ fr caractere speciale); CL = masca atributelor. Efect: CF ters dac operaiunea a reuit; CF setat n caz de eroare, AX= cod eroare (02h,03h,05h,11h). Observaii: Permite mutarea ntre directoare cu acelai volum logic; aceast funcie nu seteaz atributul arhiv; fiierele deschise nu vor fi redenumite; (DOS 3.0+) permite redenumirea directoarelor.

INT 21h, 57h AFL DATA ULTIMEI SCRIERI N FIIER


Intrare: AH=57h; AL = 00h (Afl attributele); BX = nume fiier.

- 179 -

Efect:

CF ters dac operaiunea a reuit, CX = file's time DX = file's date; CF setat n caz de eroare, AX = cod eroare (01h,06h).

Vezi i: AX=5701h. Cmpul biilor pentru ora crerii fiierului: Bii 15-11 10-5 4-0

Descriere ora

minutul secunda

Cmpul biilor pentru data crerii fiierului: Bii 15-9 8-5 4-0

Descriere anul (1980-) luna ziua

INT 21h, 57h SETAREA DATEI ULTIMEI SCRIERI N FIIER


Intrare: AH=57h; AL =01h (Seteaz atributele); BX = nume fiier; CX = noua or; DX = noua dat. Efect:

CF ters dac operaiunea a reuit; CF setat n caz de eroareAX = cod eroare (01h,06h).

Vezi i: AX=5700h.

- 180 -

ANEXA 4 Rezolvrile programelor


Programul 2.1 .model small .stack 100h .code start: mov mov mov mov al,99h bl,0AAh cl,0BBh dl,0CCh

; terminate program term: jmp term end start

Programul 2.2 .model small .stack 100h .code start: mov mov mov mov mov al,22h bl,al bh,al cl,al dh,al

; terminate program term: jmp term end start

- 181 -

Programul 2.3 .model small .stack 100h .code mov ax,1122h mov bx,3344h mov cx,5566h mov dx,7788h jmp term end start

start:

term:

Programul 2.4 .model small .stack 100h .code mov bx,1122h mov cx,3344h mov dx,bx mov ax,cx jmp term end start

start:

term:

Programul 2.5 .model small .stack 100h .code mov ax,1234h mov ds,ax mov dx,5678 jmp term end start

start: term:

- 182 -

Programul 2.6 .model small .stack 100h .code mov al,99h mov bh,0AAh mov ah,al mov al,bh mov bh,ah term: jmp term end start

start:

Programul 2.7 .model small .stack 100h .code mov al,11h mov bl,22h mov cx,3344h mov dx,5566h xchg al,bl xchg cx,dx jmp term end start

start:

term:

- 183 -

Programul 2.8 .model small .stack 100h .code mov al,0AAh mov ah,0BBh mov bl,0CCh mov bh,0DDh xchg al,ah xchg ah,bl xchg bl,bh jmp term end start

start:

term:

Programul 2.9 .model small .stack 100h .code

start:

mov ax,1122h mov bx,3344h mov cx,5566h mov dx,7788h add al,66h add al,bl sub al,cl sub al,22h add al,bl ;Rezultatul este in AL add al,cl ;si se aduna cu termenul al treilea add al,dl ;si apoi cu al patrulea ; Se va observa ca la ultima adunare (EEh+88h) apare carry term: jmp term end start

- 184 -

Programul 2.10 .model small .stack 100h .code start: mov ax,1122h mov bx,3344h mov cx,5566h mov dx,7788h add ax,6666h add ax,bx sub ax,cx sub ax,22h add ax,bx ;Rezultatul este in AL add ax,cx ;si se aduna cu termenul al treilea add ax,dx ;si apoi cu al patrulea ; Se va observa ca la ultima adunare (DDEEh+7788h) apare carry term: jmp term end start

Programul 2.11 .model small .stack 100h .code start: mov ax,1122h mov bx,3344h mov cx,5566h mov dx,7788h add bx,dx ;NU apare transport adc ax,cx ;deci urmatoarea adunare NU necesita ;sa-l includa si pe acesta ;Corect este totusi sa se tina seama de aceasta ;eventualitate term: jmp term end start

- 185 -

Programul 2.12 .model small .stack 100h .code start: mov mov mov mov add adc ax,5566h bx,7788h cx,99AAh dx,0BBCCh bx,dx ;Apare transport ax,cx ;deci urmatoarea adunare va trebui ;sa-l includa si pe acesta

term:

jmp term end start

Programul 2.13 .model small .stack 100h .code mov mov mov mov sub sbb acesta term: jmp term end start ax,5566h bx,7788h cx,1122h dx,3344h bx,dx ;Nu apare imprumut ax,cx ;totusi corect este ca urmatoarea ;scadere sa-l includa si pe

start:

- 186 -

Programul 2.14 .model small .stack 100h .code mov mov mov mov sub sbb ax,2233h bx,4455h cx,6677h dx,8899h bx,dx ;Apare imprumut ax,cx ;deci urmatoarea scadere va trebui ;sa-l includa si pe acesta

start:

term:

jmp term end start

Programul 3.1 .model small .stack 100 start: .code mov al,22 MOV BX,0 MOV bx[20],al MOV DS:[30],al jmp term end start

term:

Programul 3.2 .model small .stack 100h .code - 187 -

start:

face term:

mov MOV MOV mov MOV mov

al,22h BX, 10h [bx],al bx,30h [bx],al bp,120h

;Pentru segmentul de stiva se ;adresarea prin intermediul BP

mov [bp],al jmp term end start

Programul 3.3 .model small .stack 100h .code start: mov ax,3344h MOV BX, 20h MOV [bx],al term: jmp term end start

Programul 3.4 .model small .stack 100 start: .code MOV BX,0 MOV [bx+20h],1122h MOV [BX+30h],byte ptr 44h jmp term end start

term:

- 188 -

Programul 3.5 .radix 16 .model small .stack 100 start: .code mov ax,33EEh MOV BX,0 MOV [bx+30h],ax mov al,22h mov ah,0 add [bx+30h],ax jmp term end start

term:

Programul 3.6 .radix 16 .model small .stack 100 start: .code mov bx,0 mov word ptr [bx+10], 44; Specifica 2 octeti add [bx+10],122 ;pentru a aduna pe 2 octeti jmp term end start

term:

Programul 3.7 .radix 16 .model small - 189 -

.stack 100 start: .code mov al,44 mov word ptr ds:[30], al ; Nu s-a folosit nici add ds:[30],122;un registru pt adresare

indirecta ;S-au folosit adresari imediate term: jmp term end start

Programul 3.8 .radix 16 .MODEL SMALL .STACK 100H .CODE Start: mov ch,ds:[10] mov dx,ds:[11] mov ds:[20],byte ptr 22 mov ds:[21],word ptr 8877 mov ds:[30],ch mov ds:[31],dx ; S-au folosit adresari imediate (nerecomandat) term: jmp term END Start SAU: .radix 16 .MODEL SMALL .STACK 100H adr equ 0 .CODE Start: - 190 -

mov ch,ds:[adr+10] mov dx,ds:[adr+11] mov ds:[adr+20],byte ptr 22 mov ds:[adr+21],word ptr 8877 mov ds:[adr+30],ch mov ds:[adr+31],dx ;Avantajul este ca modificand valoarea adr se ;translateaza intreaga structura unde se doreste term: jmp term END Start

Programul 3.9 .radix 16 .MODEL SMALL .STACK 100H .data dateo db 11,22 ;se declara 2 locatii de 1 octet datec dw 4455,6677 ;se declara 2 locatii de 2 octeti .code Start: mov ax,@data mov ds,ax mov al,dateo ; Desi nu apar paranteze drepte,dateo add al,date0+1;simbolizeaza continutul unei locatii mov bx,datec ;de memorie, iar datec continutul a add bx,datec+2;doua locatii de memorie mov ah,0 sub bx,ax term: jmp term END Start

- 191 -

Programul 3.10 .radix 16 .MODEL SMALL .STACK 100H .data adr1 dw ? .CODE Start: mov ax,@data; Aceste 2 instructiuni nu sunt ;obligatorii pentru ca nu se declara mov ds,ax ;date numerice initiale mov ax,8899 mov cx,2211 mov dl,10 mov bx,20 mov add mov add mov mov sub mov term: adr1,ax ;Salveaza continutul initial al lui AX ax,cx dh,0 ;Pentru adunarea cu BX a lui DX=0010 bx,dx [bx],ax ax,adr1 ax,cx [bx+2],ax; Primul rezultat a fost de 2 octeti

jmp term END Start

Programul 3.11 .radix 16 .MODEL SMALL .STACK 100H .data adr1 dw ? - 192 -

.CODE Start: mov ax,@data; Aceste 2 instructiuni nu sunt ;obligatorii pentru ca nu se declara mov ds,ax ;date numerice initiale mov ax,1122 mov bx,3344 mov cx,5566 mov dx,7788 mov adr1,ax ;sau mov DS[0],ax ;sau mov [bx],ax ;se scrie in locatia [3344] mov ax,bx mov bx,cx mov cx,dx mov dx,adr1 term: jmp term END Start

Programul 3.12 .radix 16 .MODEL SMALL .STACK 100H .CODE Start: mov bx,10 mov al,1 mov [bx],al inc al inc bx mov [bx],al inc al inc bx mov [bx],al - 193 -

inc inc mov term:

al bx [bx],al jmp term

END Start

Programul 3.13 .radix 16 .MODEL SMALL .STACK 100H .CODE Start: mov bx,10 mov ax,1000 mov [bx],ax inc ax inc bx ;AX ocupa 2 locatii consecutive inc bx ;deci BX trebuie marit cu 2 mov [bx],ax inc ax inc bx inc bx mov [bx],ax inc ax inc bx inc bx mov [bx],ax term: jmp term END Start

- 194 -

Programul 3.14 .radix 16 .MODEL SMALL .STACK 100H .CODE Start: mov bx,10 mov al,5 mov [bx],al add al,5 inc bx mov [bx],al add al,5 inc bx mov [bx],al add al,5 inc bx mov [bx],al term: jmp term END Start

Programul 3.15 .radix 16 .MODEL SMALL .STACK 100H .CODE Start: mov bx,10 mov ax,201 mov [bx],ax add ax,201 inc bx inc bx - 195 -

mov add inc inc mov add inc inc mov term:

[bx],ax ax,201 bx bx [bx],ax ax,201 bx bx [bx],ax jmp term

END Start

Programul 4.1 .MODEL SMALL .STACK 100H .CODE Start: mov mov mov mov ax,1122 bx,3344 cx,5566 dx,7788

push ax push bx push cx push dx pop cx pop bx pop ax pop dx term: jmp term END Start

;La POP, stiva furnizeaza informatia ;in ordine inversa fata de PUSH ;dupa principiul "Last In-First Out"

- 196 -

Programul 4.3 .radix 16 .MODEL SMALL .STACK 100H .data sursa dw 1122,3344,5566 dest dw 3 DUP(?) .CODE Start: mov ax,@data mov ds,ax mov ax,sursa mov dest,ax mov ax,sursa+2 ; Fusesera ocupate 2 locatii mov dest+2,ax ;deci s-a avansat cu 2 in memorie mov ax,sursa+4 mov dest+4,ax term: jmp term END Start

Programul 4.4 .Radix .Model .Stack .Data sir DB .Code start: mov mov mov mov mov mov ax,seg sir; Se putea folosi si MOV AS,@data ds,ax al,sir ah,sir+9 sir+9,al sir,ah - 197 16 small 100h 1,2,3,4,5,6,7,8,9,0a

mov mov mov mov

al,sir+1 ah,sir+8 sir+8,al sir+1,ah

term: jmp term end start

Programul 4.5 .radix 16 .model small .stack 100h .data tabela1 db 13,14,15,16,1,2,3,4,5 .code start: mov ax,@data ;Adresa segmentului de date mov ds,ax ;se incarca in DS mov bx,0 mov al,5 xlat mov dl,al ;Indexarea incepe de la 0 deci elementul 5 are valoarea 2 mov al,8 xlat mov dh,al ;Indexarea incepe de la 0 deci elementul 8 are valoarea 5 term: jmp term end start

Programul 4.6 .radix 16 .model small .stack 100h .code start: les ax,ds:10 - 198 -

; Se va observa efectul asupra lui ES si AX in functie ;de datele existente initial in memorie incepand de la ;adresa 10h. term: jmp term end start

Programul 4.7 .radix 16 .model small .stack 100h .data adresa1 db 13,14,15,1,2,3 adresa2 db 16,17,18,19 .code start: mov ax,@data ;Adresa segmentului de date mov ds,ax ;se incarca in DS lea bx,adresa1 ;In DI se va afla offset-ul in ;memoria de date al sirului ;notat "adresa1" (in acest caz 06) mov al,[bx+2] ;Transfera din a treia locatie a ;sirului in AL lea bx,adresa2 ;Noua adresa efectiva mov ah,[bx+3] ;de la care este luat 19h mov [bx+3],al ;si la care este trimis 15h lea bx,adresa1 ;Adresa efectiva unde trebuie mov [bx+2],ah ;trimis 19h term: end start jmp term

Programul 5.1 .radix 16 .model small .stack 100h - 199 -

.code start: mov mov mov mov mov add adc sub mov mov al,11 bx,10 cl,33 dl,44 [bx],byte ptr 99; Transfer pe 1 octet al,cl al,dl;In cazul general, putea sa apara CY [bx],al ;Rezultatul in memorie la [bx] al,[bx] [bx+1],al ;Se trimite la [bx+1]

term:

jmp term end start

Programul 5.2 .radix 16 .model small .stack 100h .code ax,1122 bx,10 cx,3344 dx,5566 [bx],0AABBh ax,cx ax,dx; In cazul general, putea sa apara CY [bx],ax ax,[bx] [bx+2],ax ;Rezultatul era pe 2 octeti jmp term end start

start: mov mov mov mov mov add adc sub mov mov term:

- 200 -

Programul 5.3 .radix 16 .model small .stack 100h .code al,9 bl,19 cl,29 al bl cl bl ch,0 ;Pregatim CX pentru inmultire cu rezultat cx ;de 16 biti jmp term end start

start: mov mov mov inc inc inc mul mov mul term:

Programul 5.4 .radix 16 .model small .stack 100h .data 2 dup(?); 4 locatii pentru rezultat c251ec98 2 dup(?); salvari temporare de registre .code ax,@data ds,ax bx,1122 cx,5566 dx,22 temp,dx ;temp =22 ax,bx cx ;Rezultat in DX:AX=05b71d8c temp+2,dx;Stocheaza dx la temp+2=05b7 - 201 -

rez dw temp dw start: mov mov mov mov mov mov mov mul mov

mov mul mov mov mov mul add term:

bx,temp ;Reface bx=22 bx ;Inmulteste ax=1D8C cu 22 rez+2,ax ;Stocheaza in ultimii 2 octeti ax rez,dx ;si in primii 2 octeti dx ax,temp+2;Pregateste 05B7 bx ;si inmulteste cu 22 rez,ax ;aduna rezultatul la primii 2 octeti

jmp term end start

Programul 5.5 .radix 16 .model small .stack 100h .data tempw dw ?; locatie temporara pentru 1 word tempb db ?; locatie temporara pentru 1 byte .code start: mov ax,@data mov ds,ax mov cx,6655 mov bl,44 mov dl,22 mov tempb,dl; Impartirea se face cu 16 biti mov dx,0 ;deci trebuie adus DX la 0 mov ax,cx ;formand cu AX deimpartitul mov bh,0 ;pregateste cei 16 biti div bx ;ai impartitorului mov tempw,dx;tempw=restul mov dl,tempb;reface DL mul dl ;Si inmulteste cu catul adc ax,tempw;iar rezultatul cu CY aduna la rest term: jmp term end start

- 202 -

Programul 6.1 .radix 16 .model small .stack 100h .code mov ax,0EEEEh and ax,0F jmp term end start

start:

term:

Programul 6.2 .radix 16 .model small .stack 100h .code mov ax,0EEEEh or ax,1111111100001111b jmp term end start

start:

term:

Programul 6.3 .radix 16 .model small .stack 100h .code start: mov bl,10100110b; Valoare initiala BL mov cl,00011111b; Valoare initiala CL and bl,00001100b; Separa bitii 2 si 3 din BL - 203 -

and cl,11110011b; Bitii omologi din CL anulati or cl,bl ; Combina rezultatele term: jmp term end start

Programul 6.4 .radix 16 .model small .stack 100h .code mov dl,05 ;Valoarea initiala a lui DL mov al,0 ;Pregateste AL pentru a prelua CARRY mov ror adc mov xor bx,0 ;Pregateste pointerul in memorie dl,1 ;Rotire dreapta. Bitul 0 in CARRY al,0 ;Aduna cu CARRY. Rezulta AL=CARRY [bx],al;Trimite in prima locatie al,al ;Sterge AL pentru urmatorul CARRY

start:

;procesul se repata pentru celelalte 3 locatii ror dl,1 adc al,0 mov [bx+1],al xor al,al ror adc mov xor dl,1 al,0 [bx+2],al al,al

ror dl,1 adc al,0 mov [bx+3],al term: jmp term end start

- 204 -

Programul 6.5 .radix 16 .model small .stack 100h .code mov mov mov mov and and bl,12 ;Valoarea initiala a lui BL ch,56 ;Valoarea initiala a lui CH al,bl ;Copii de lucru in dh,ch ;AL si DH al,0Fh ;Ia semioctetul inferior din BL bl,0F0h;Ramine in BL doar octetul superior

start:

and dh,0F0h;Ia semioctetul superior din CH and ch,0Fh ;Ramine in CH doar octetul inferior shr bx,4 shl cx,4 or ch,al or bl,dh xchg bl,ch term: jmp term end start ;Deplaseaza cu un semioctet dreapta ;Deplaseaza cu un semioctet stanga ;Combina semioctetii ;Inverseaza registrele

Programul 6.6 .radix 16 .model small .stack 100h .code start: mov mov mov xor cl,25 dh,55 al,cl al,dh ;Valoarea initiala a lui CL ;Valoarea initiala a lui DH ;Copie de lucru a lui CL ;Daca 2 biti omologi sunt identici, ;XOR i anuleaza, restul devin 1 - 205 -

term:

and cl,al ;Sunt pusi in 0 in CL numai bitii ;care fusesera identici cu ai lui DH jmp term end start

Programul 6.7 .radix 16 .model small .stack 100h .code start: mov mov mov xor cl,25 dh,55 al,cl al,dh ;Valoarea initiala a lui CL ;Valoarea initiala a lui DH ;Copie de lucru a lui CL ;Daca 2 biti omologi sunt identici, ;ii anuleaza, restul devin 1 ;Inverseaza bitii ;Sunt pusi in 1 in CL numai bitii ;care fusesera identici cu ai lui DH

XOR

not al or cl,al jmp term end start

term:

Programul 6.8 .radix 16 .model small .stack 100h .code start: mov mov shl shl add bp,77 dx,bp dx,8 bp,6 bp,dx ; Valoarea initiala in BP ;Copie de lucru in DX ;Inmulteste copia cu 256 ;Inmulteste valoarea initiala cu 64 ;Aduna 256+64=320 ori valoarea initiala - 206 -

term:

jmp term end start

Programul 6.9 .radix 16 .model small .stack 100h .code start: mov mov shl shl add term: bp,33 dx,bp dx,9 bp,7 bp,dx ; Valoarea initiala in BP ;Copie de lucru in dx ;Inmulteste copia cu 512 ;Inmulteste valoarea initiala cu 128 ;Aduna 512+128=640 ori valoarea initiala

jmp term end start

Programul 7.1 .radix 16 .model small .stack 100h .data adr1 dw 7777 adr2 dw 3333 adr3 dw 2222 .code start: mov ax,@data mov ds,ax mov ax,adr1 mov bx,adr2 cmp ax,bx ;Compara numerele 1 si 2 jb comp2 ;Daca 1 e mai mic, treci la comparatia 2 mov adr1,bx;Daca 1 e mai mare se trimit in memorie - 207 -

mov adr2,ax;In ordine inversa comp2: mov ax,adr2 mov bx,adr3 cmp ax,bx ;Compara numerele 2 si 3 jb comp3 ;Daca 2 e mai mic, treci la comparatia 3 mov adr2,bx;Daca 2 e mai mare se trimit in memorie mov adr3,ax;In ordine inversa comp3: mov ax,adr1;Posibil ca in urma inversarii 2 cu 3 mov bx,adr2;in pozitia 2 sa fie acum un numar cmp ax,bx ;mai mic si decat cel din pozitia 1 jb term ;Daca sunt in ordine, termina mov adr1,bx;Daca nu, se face din nou mov adr2,ax;inversarea in memorie term: jmp term end start

Programul 7.2 .radix 16 .model small .stack 100h .code mov mov mov inc dec jnz bx,0 cx,20 [bx],byte ptr 33 bx cx reia

start: reia:

term:

jmp term end start

- 208 -

Programul 7.3 .radix 16 .model small .stack 100h .code mov mov mov mov inc inc dec jnz bx,0 cx,20 al,5 [bx],al al bx cx reia

start:

reia:

term:

jmp term end start

Programul 7.4 .radix 16 .model small .stack 100h .code bx,0 cx,20 al,5 [bx],al al bx cx reia ;S-a terminat incarcarea in memorie vor suma numerele din memorie cx,20 ax,0 ;In AX va apare suma bx,0 dh,0 ;Suma va fi pe doi octeti, dl,[bx];deci se pregateste adunarea cu DX - 209 -

start:

mov mov mov reia: mov inc inc dec jnz ;Acum se mov mov mov mov reia1: mov

add inc dec jnz mov mov term:

ax,dx bx cx reia1 [bx],ah;Bx este acum 20 [bx+1],al

jmp term end start

Programul 7.5 .radix 16 .model small .stack 100h .code mov bx,0 mov cx,20 mov ax,10 ;Progresia da si numere pe 2 octeti mov [bx],ax;deci se va folosi AX add ax,10 inc bx ;Fiecare numar ocupa 2 octeti inc bx ;deci bx se incrementeaza de 2 ori dec cx jnz reia ;S-a terminat incarcarea in memorie jmp term end start

start: reia:

term:

Programul 7.6 .radix 16 .model small .stack 100h .code mov bx,0 mov cx,20 - 210 -

start:

reia:

mov mov sub inc inc dec jnz

ax,200 [bx],ax ax,10 bx bx cx reia

;Numere pe 2 octeti ;deci se va folosi AX ;Fiecare numar ocupa 2 octeti ;deci bx se incrementeaza de 2 ori ;S-a terminat incarcarea in memorie

term:

jmp term end start

Programul 7.7 .radix 16 .model small .stack 100h .code mov bx,0 mov cx,10 mov ah,[bx] inc bx dec cx mov al,[bx] cmp ah,al ja conti mov ah,al inc dec jnz mov

start:

;Consideram primul numar ca maxim

reia:

conti:

;Ia urmatorul numar ;compara cu cel maxim ;Daca primul e mai mare continua ;Daca cel nou e mai mare, acesta ;devine noul maxim bx ;Incrementeaza adresa cx ;decrementeaza contorul reia ;reia cautarea [bx],ah ;Dupa ultima locatie citita scrie ;numarul maxim gasit

term:

jmp term end start

- 211 -

Programul 8.1 .radix 16 .model small .stack 100h LungimeBloc equ 20 .DATA BlocSursa dw LungimeBloc dup(1122) BlocDest dw LungimeBloc dup(?) .code start: mov ax,seg BlocSursa ; Se putea folosi si ; mov ax,@data mov ds,ax ;Segmentul sursa n DS mov ax,seg BlocDest ;Necesar numai daca ;blocurile sunt n ;segmente diferite mov es,ax ;Segmentul destinatie ES cld ;directia n sensul ;cresterii adreselor mov si, offset BlocSursa ;AE a sursei n SI mov di, offset BlocSursa+60;AE a destinatiei n DI mov cx, LungimeBloc ;Numarul de transferuri n CX bucla: lodsw ;ncarca n AX un octet stosw ;si l trimite la destinatie loop bucla ;Decrementeaza CX si reia ;bucla pna cnd CX devine 0 term: jmp term end start

Programul 8.4 .radix 16 .model small .stack 100h .DATA - 212 -

BlocSursa db LB equ .code start: mov ax,@data mov ds,ax mov es,ax

'jgasjagsasasgauahdjushd' $-BlocSursa ;Asamblorul ;calculeaza lungimea blocului

;ncarca n ES segmentul de ;date (pentru SCASB) mov di, offset BlocSursa ;ncarca n DI adresa ;sirului(Pentru SCASB) mov cx, LB ;n CX lungimea sirului mov al,'a' ;Constanta de comparat mov bh,0 ;Valoare initiala contor bucla: scasb ;Compara AL cu un octetul de ;la [ES:DI] din sir jnz conti ;Daca nu e egalitate sare inc bh ;Daca e 'a', incrementeaza BH conti: loop bucla ;Reluare daca nu s-a terminat term: jmp term end start

Programul 8.5 .radix 16 .radix 16 .model small .stack 100h .data BlocSursa db LB equ .code start: mov ax,@data mov ds,ax

'ghfafasfasfahsyfhhhsaad' $-BlocSursa

- 213 -

mov es,ax

;Incarca in ES segmentul de date ;(pentru SCASB) mov di, offset BlocSursa;Incarca in DI adresa ;sirului(Pentru SCASB) mov cx,LB mov ax,'af' bucla: scasw jnz b1 inc bh b1: dec di loop bucla term: jmp term end start ;Contorul de comparatii in CX ;Constanta de comparat cu octetii ;inversati (cum se compara ;cu cuvintele din memorie) ;Compara AX cu cuvantul respectiv ;Daca nu este secventa 'fa', se sare ;Daca s-a gasit 'fa' incrementeaza BH ;Reluare daca nu s-a terminat sirul

Programul 8.7 .radix 16 .model small .stack 100h .DATA Sir1 LB equ Sir2 db '6512631827961792' $-Sir1 ;Lungimea este data de sirul 1 db '7531790734264725'

.code start: mov ax,@data mov ds,ax mov es,ax mov si, offset mov di, offset mov cx,LB

;ncarca n DS segmentul de date ;ncarca n ES segmentul de date Sir1;ncarca n SI adresa sirului 1 Sir2;ncarca n DI adresa sirului 2 ;Contorul de comparatii n CX - 214 -

bucla: cmpsb jnz b1 inc bh b1: b2: b3: term: jmp b3 jb b2 inc dh jmp b3 inc dl loop bucla jmp term end start

;Compara AL cu octetul respectiv ;Daca nu este egalitate, se sare ;Daca s-a gasit egalitate, se ;incrementeaza BH ;si se trece la urmatoarea pereche ;Daca este mai mic sare ;Daca e mai mare incrementeaza DH ;si se trece la urmatoarea pereche ;Daca era mai mic incrementeaza DL ;Reluare daca nu s-a terminat

Programul 8.8 .radix 16 .model small .stack 100h .DATA Sir1 db 'ABCDEFGHIJKL' LB equ $-Sir1 ;Lungimea este data de sirul 1 .code start: mov ax,@data mov ds,ax ;ncarca n DS segmentul de date mov es,ax ;ncarca n ES segmentul de date mov di, offset Sir1 ;ncarca n DI adresa sirului mov cx,LB ;Contorul de comparatii n CX mov al,'E' repnz scasb ;Compara pana la prima egalitate neg cx ;In CX este numarul ramas din LB add cx,LB ;si trebuie scazut din LB term: jmp term end start

- 215 -

Programul 8.9 .radix 16 .model small .stack 100h .DATA Sir1 db '123456789' LB equ $-Sir1 ;Lungimea este data de sirul 1 Sir2 db '987654321' .code start: mov ax,@data mov ds,ax ;ncarca n DS segmentul de date mov es,ax ;ncarca n ES segmentul de date mov si, offset Sir1;ncarca n SI adresa sirului 1 mov di, offset Sir2;ncarca n DI adresa sirului 2 mov cx,LB ;Contorul de comparatii n CX repnz cmpsb ;Compara pana la prima egalitate neg cx ;In CX este numarul ramas din LB add cx,LB ;si trebuie scazut din LB term: jmp term end start

Programul 8.10 .model small .stack 100h .DATA Sir1 db '112233445566' LB equ $-Sir1 ;Lungimea este data de sirul 1 Sir2 db '112244335566' .code start: mov ax,@data mov ds,ax ;ncarca n DS segmentul de date mov es,ax ;ncarca n ES segmentul de date mov si, offset Sir1;ncarca n SI adresa sirului 1 mov di, offset Sir2;ncarca n DI adresa sirului 2 - 216 -

mov cx,LB repz cmpsb neg cx add cx,LB jmp term end start

;Contorul de comparatii n CX ;Compara pana la prima inegalitate ;In CX este numarul ramas din LB ;si trebuie scazut din LB

term:

Programul 9.1 .radix 16 .model small .stack 100h .code start: mov dl,30 ;Primul cod ASCII mov dh,80 ;Ultimul cod ASCII reia: mov ah,02 ;Functia 02 Int 21h inc dl ;Urmatorul cod ASCII cmp dh,dl ;S-a ajuns la ultimul? jnz reia ;Daca nu, se reia ciclul term: mov ah,4Ch;Iesirea se face cu functia 4C int 21 ;si se poate vedea ecranul cu end start ;comanda "User Screen" submeniul Window

Programul 9.2 .radix 16 .model small .stack 100h .data - 217 -

sir1 db 'Un sir de caractere terminate cu dolar$' .code start: mov ax,@data mov ds,ax mov dx,offset sir1;Adresa efectiva a sirului in DS mov ah,09;Functia 09 Int 21h term: mov ah,4Ch int 21 end start

Programul 9.3 .radix 16 .model small .stack 100h .data sir1 db 'Primul sir de caractere',0dh,0ah,'$' sir2 db 'Al doilea sir de caractere $' .code start: mov ax,@data mov ds,ax mov dx,offset sir1;Adresa efectiva a sirului 1 in DS mov ah,09 ;Functia 09 Int 21h mov dx,offset sir2;Adresa efectiva a sirului 2 in DS mov ah,09 ;Functia 09 Int 21h term: mov ah,4Ch int 21 end start

- 218 -

Programul 9.4 .radix 16 .model small .stack 100h .code start: mov ah,01 ;Citire tasta in AL Int 21h mov dl,al ;Pentru afisare, codul ASCII in DL mov ah,02 ;Functia 02 Int 21h cmp al,0dh;S-a tastat CR? jnz start ;Daca nu, reia term: mov ah,4Ch int 21 end start

Programul 9.5 .radix 16 .model small .stack 100h .code start: mov ah,07 ;Citire tasta in AL, fara ecou Int 21h mov dl,al ;Pentru afisare, codul ASCII in DL mov ah,02 ;Functia 02 Int 21h cmp al,0dh;S-a tastat CR? jnz start ;Daca nu, reia term: mov ah,4Ch int 21 end start

- 219 -

Programul 9.6 .radix 16 .model small .stack 100h .code start: mov ah,01 ;Citire tasta in AL, cu ecou Int 21h sub al,20 mov dl,al ;Pentru afisare, codul ASCII in DL mov ah,02 ;Functia 02 Int 21h add al,20 cmp al,0dh;S-a tastat CR? jnz start ;Daca nu, reia term: mov ah,4Ch int 21 end start

Programul 9.7 .radix 16 .model small .stack 100h .data buff0 db 10 ;Lungimea permisa a sirului buff1 db ? ;Rezervare (lungimea actuala) buff2 db 10 dup (?);Bufferul de caractere .code start: mov ax,@data mov ds,ax mov dx,buff0 mov ah,0A

; Originea sirului in DX ;Citire tasta in AL - 220 -

Int ;Acum se mov mov add mov mov mov

21h formeaza sirul de afisat (terminat cu '$') bh,0 ;Pregateste BX bl,byte ptr ds:[1];Pentru a citi lungimea ;actuala bl,2 ;Se adauga 2 (octetii CR si LF) ds:[bx],byte ptr '$';Sfarsitul de sir la ;lungime+2 buff0,0Ah ;La inceput Line Feed buff1,0Dh ;si Carriage Return

mov ah,09 ;Functia 09 Int 21h term: mov ah,4Ch int 21 end start

Programul 9.8 .radix 16 .model small .stack 100h .data Sir1 db 'Care din urmatoarele registre indica segmentul de date? (Apasati 1,2,3 sau 4)',0dH,0Ah,'1. BX',0dH,0Ah,'2. BP',0dH,0Ah,'3. SI',0dH,0Ah,'4. DI',0dH,0Ah,0dh,0ah,'$' Sir2 db Sir3 db .code start: mov ax,@data mov ds,ax '. Corect!$' '. Gresit! Era BX sau SI.$'

;Incarca in DS segmentul de date

mov dx, offset Sir1 ;Incarca in SI adresa sirului 1 mov ah, 09 Int 21h - 221 -

mov ah,01 int 21h cmp al,'1' jz corect cmp al,'3' jz corect mov jmp corect: mov afi: mov int term: dx, offset sir3 afi dx, offset sir2 ah,09 21

mov ah,4Ch int 21 end start

Programul 10.1 .model small .stack 100h .code ;Mod video 320x200 mov ah,0 mov al,13h int 10h ;Afiseaza un punct la x=CX, y=DX si culoare=AL mov mov mov mov int cx,100 dx,50 al,2 ah,0Ch 10h

start:

afis:

;functia 0Ch ;Cheama intreruperea 10h

- 222 -

term:

jmp term end start

Programul 10.2 .model small .stack 100h .code

start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h ;Afiseaza o linie la x=CX, y=DX si culoare=AL mov dx,50 mov cx,100 lin1: mov mov int inc cmp jne term: al,2 ah,0Ch 10h cx cx,200 lin1 jmp term end start ;functia 0Ch ;Intreruperea 10h ;Se pregateste scriereaaltui punct ;pana se ajunge la 100 de puncte

Programul 10.3 .model small .stack 100h .code ;Declara parametrii x1=50 ;Inceputul liniilor - 223 -

y1=50 culoare=2 lungime=100 h=50

;Lungimea liniilor ;numarul de linii

start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h afis: ;Afiseaza o linie la x=CX, y=DX si culoare=AL mov dx,y1 mov al,culoare lin2: lin1: mov cx,x1 mov int inc cmp jne inc cmp jne ah,0Ch ;functia 0Ch 10h ;call bios service cx cx,x1+lungime lin1 dx dx,y1+h ;S-a ajuns la numarul final de linii? lin2 ;Daca nu, se reia jmp term end start

term:

Programul 10.4 .model small .stack 100h .code x1=50 y1=50 culoare=2 lungime=100 - 224 -

h=50 ;numarul de linii start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h afis: ;Afiseaza un punct la x=CX, y=DX si culoare=AL mov dx,y1 lin2: mov al,culoare;Se reia linia cu culoarea de inceput mov cx,x1 lin1: inc mov int inc cmp jne inc cmp jne al ;Noul punct cu alta culoare ah,0Ch ;functia 0Ch 10h cx cx,x1+lungime lin1 dx dx,y1+h ;S-a ajuns la numarul final de linii? lin2 jmp term end start

term:

Programul 10.5 .stack 100h .code

x1=50 y1=50 culoare=2 lungime=100 h=50 ;numarul de linii start: - 225 -

;Mod video 320x200 mov ah,0 mov al,13h int 10h afis: ;Afiseaza un punct la x=CX, y=DX si culoare=AL mov dx,y1 mov al,culoare ;Culoarea primei linii mov cx,x1 mov int inc cmp jne inc inc cmp jne term: ah,0Ch ;functia 0Ch 10h ;call bios service cx cx,x1+lungime lin1 al ;Urmatoarea linie are alta culoare dx ;si alt y dx,y1+h ;S-a ajuns la ultima linie? lin2 ;Daca nu, reia jmp term end start

lin2: lin1:

Programul 10.6 .MODEL SMALL .STACK 200H .CODE x1=160 culoarea =3 Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h - 226 -

MOV MOV

AX, 0A000H;Adresa memoriei ecran ES, AX ;in ES

mov di,x1 ;Pozitia punct este offset fata de ES mov al,culoarea stosb oprire: jmp oprire END Start

Programul 10.7 .MODEL SMALL .STACK 200H .CODE lung=200 culoarea =5 Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h MOV MOV Linieo: mov mov mov rep oprire: - 227 AX, 0A000H ES, AX di,0 cx,lung al,culoarea stosb ;Repeta pana cand CX=0

jmp oprire END Start

Programul 10.8 .MODEL SMALL .STACK 200H .CODE x1=100 ;Originea liliei lung=200 culoarea =5 Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h

MOV MOV Linieo:

AX, 0A000H ES, AX

mov di,x1 ;Linia incepe in pozitia x1 mov cx,lung mov al,culoarea repz stosb ;Scrie punctele liniei oprire: jmp oprire END Start

- 228 -

Programul 10.9 .MODEL SMALL .STACK 200H .CODE x1=100 lung=200 culoarea =5 Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h MOV MOV Linieo: AX, 0A000H ES, AX

mov di,x1 add di,320 mov cx,lung mov al,culoarea repz stosb ;Scrie punctele liniei oprire: jmp oprire END Start

Programul 10.10 .MODEL SMALL .STACK 200H .CODE x1=100 y1=50 lung=200 - 229 -

culoarea =5 Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h MOV MOV Liniev: mov mov mov mov mov shl shl add add AX, 0A000H ES, AX di,x1 bp,y1 cx,lung al,culoarea dx,bp ;Se face inmultirea dx,6 ;lui BP (adica a lui Y1) cu 320 bp,8 ;Prin copiere in DX bp,dx ;deplasari la stinga si adunare di,bp ;Deplasamentul obtinut se aduna la DI

rep stosb ;Scrie punctele liniei oprire: jmp oprire END Start

Programul 10.11 .MODEL SMALL .STACK 200H .CODE x1=100 y1=50 lung=50 culoarea =5 Start: - 230 -

;Mod video 320x200 mov ah,0 mov al,13h int 10h

MOV MOV Liniev: mov mov mov mov mov shl shl add add

AX, 0A000H ES, AX di,x1 bp,y1 cx,lung al,culoarea dx,bp ;Se face inmultirea dx,6 ;lui BP (adica a lui Y1) cu 320 bp,8 ;Prin copiere in DX bp,dx ;deplasari la stinga si adunare di,bp ;Deplasamentul obtinut se aduna la ;Noul punct este cu 320 mai ;departe n memoria de

lv1: add di,320 ecran

mov es:[di],al ;Pune punctul loop lv1 ;Repeta de CX ori oprire: jmp oprire END Start

Programul 10.12 .MODEL SMALL .STACK 200H .CODE - 231 -

x1=100 y1=50 lung=50 culoarea =5 Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h

MOV MOV Liniev: mov mov mov mov mov shl shl add add

AX, 0A000H ES, AX di,x1 bp,y1 cx,lung al,culoarea dx,bp ;Se face inmultirea dx,6 ;lui BP (adica a lui Y1) cu 320 bp,8 ;Prin copiere in DX bp,dx ;deplasari la stinga si adunare di,bp ;Deplasamentul obtinut se aduna la

lv1: add di,321;Noul punct este cu 320+1 mai ;departe n memoria de ecran mov es:[di],al ;Pune punctul loop lv1 ;Repeta de CX ori oprire: jmp oprire END Start

- 232 -

Programul 10.13 .MODEL SMALL .STACK 200H .CODE x1=100 y1=50 lung=50 culoarea =5 Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h

MOV MOV Liniev: mov mov mov mov mov shl shl add add

AX, 0A000H ES, AX di,x1 bp,y1 cx,lung al,culoarea dx,bp ;Se face inmultirea dx,6 ;lui BP (adica a lui Y1) cu 320 bp,8 ;Prin copiere in DX bp,dx ;deplasari la stinga si adunare di,bp ;Deplasamentul obtinut se aduna la ;Noul punct este cu 320-1 mai ;departe n memoria de

lv1: add di,319 ecran

mov es:[di],al ;Pune punctul loop lv1 ;Repeta de CX ori

- 233 -

oprire: jmp oprire END Start

Programul 10.14 .MODEL SMALL .STACK 200H .CODE x1=100 y1=50 lung=50 culoarea =5 nrlinii=100 Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h

MOV AX, 0A000H MOV ES, AX mov bx,nrlinii ;Contorul de linii verticale mov di,x1 ;pozitia primei linii in DI Liniev: mov mov mov mov mov shl si,di ;DI va fi modificat eci se salveaza bp,y1 cx,lung al,culoarea dx,bp ;Se face inmultirea dx,6 ;lui BP (adica a lui Y1) cu 320 - 234 -

shl bp,8 add bp,dx add di,bp lv1: add di,320

;Prin copiere in DX ;deplasari la stinga si adunare ;Deplasamentul obtinut se aduna la

;Noul punct este cu 320 mai ;departe n memoria de ecran mov es:[di],al ;Pune punctul loop lv1 ;Repeta de CX ori mov di,si ;Reface DI (pozitia liniei curente) inc di ;si il incrementeaza (linia ;urmatoare) dec bx ;Decrementeaza si contorul de linii jnz liniev ;si daca nu a ajuns la 0, reia

oprire: jmp oprire END Start

Programul 11.2 .MODEL .STACK .CODE x1=100 y1=50 l=200 h=50 culoarea1 culoarea2 SMALL 200H

=05h =01h

Start: call sterge ;Mod video 320x240 mov ah,0 mov al,13h int 10h ;Paleta - 235 -

mov mov mov int princ:

ah,0bh bh,1 bl,8 10h

MOV AX, 0A000H MOV ES, AX mov al,culoarea1 ;in AL culoarea orizontala call dreptunghi oprire: jmp oprire ;******* Subrutine ******* sterge: ;Sterge ecran mov ah,06h mov bh,0 int 10h ret lino: ;Afiseaza o linie orizontala , la y = DX din puncte cu culoarea din DI mov dx,bp shl dx,8 shl bp,6 add dx,bp add di,dx repz stosb ret linv: ;Afiseaza o linie verticala mov dx,bp shl dx,8 shl bp,6 add dx,bp add di,dx lv1: MOV ES:[DI],al add di,320 loop lv1 - 236 -

ret dreptunghi: mov bp,y1 mov di,x1 mov cx,l call ;in BP e Y1 ;In DI e X1 ;In CX e lungimea lino

mov bp,y1+h ;in BP e Y1 mov di,x1 ;In DI e X1 mov cx,l ;In CX e lungimea call lino mov bp,y1 ;in BP e Y1 mov di,x1 ;In DI e X1 add di,320 mov cx,h ;In CX e lungimea dec cx mov al,culoarea2 call linv mov bp,y1 ;in BP e Y1 mov di,x1+l-1;In DI e X2 (cu 1 mai putin decat x1+l) add di,320 mov cx,h ;In CX e lungimea dec cx mov al,culoarea2 call linv ret END Start

Programul 11.3 .MODEL SMALL .STACK 200H .DATA x1=100 y1=50 - 237 -

l=120 h=60 culoarea1 =05h .CODE Start: ;Mod video 320x240 mov ah,0 mov al,13h int 10h princ: MOV MOV mov mov mov mov AX, 0A000H ES, AX di,x1 bp,y1 cx,l al,culoarea1 ;Parametrii primei linii ;in AL culoarea orizontala

mov bx,h drept1: call linieo inc bp dec bx jnz drept1 oprire: jmp oprire ;****** Subrutine ************** linieo: ;Linie orizintala push cx push di push bp mov dx,bp shl dx,8 shl bp,6 - 238 -

add dx,bp add di,dx repz stosb pop bp pop di pop cx ret END Start

Programul 11.4 .MODEL .STACK .CODE x1=10 y1=50 l=20 h=30 culoarea1 culoarea2 Start: ;Mod video 320x240 mov ah,0 mov al,13h int 10h princ: MOV MOV mov mov mov mov mov mov AX, 0A000H ES, AX di,x1 ;Parametrii primei linii bp,y1 cx,l al,1 ;in AL culoarea orizontala bx,h si,20 - 239 SMALL 200H

=05h =01h

et1: call dreptunghi add di,5 add bp,5 inc al dec si jnz et1 oprire: jmp oprire ;****** Subrutine ************** linieo: ;Linie orizontala push cx push di push bp mov dx,bp shl dx,8 shl bp,6 add dx,bp add di,dx repz stosb pop bp pop di pop cx ret dreptunghi: push bx push bp drept1: call linieo inc bp dec bx jnz drept1 pop bp pop bx ret END Start

- 240 -

Programul 11.5 .MODEL SMALL .STACK 200H .DATA x1=100 y1=50 l=200 h=50 culoarea =1h .CODE Start: ;Mod video 320x240 mov ah,0 mov al,13h int 10h princ: MOV MOV p1: mov mov inc mov and mov and mov and inc mov AX, 0A000H ES, AX bx,300h al,[bx] al bp,[bx+1] bp,00ffh di,[bx+2] di,01ffh ;in AL culoarea ;in BP e Y1 ;In DI e X1

cx,[bx+2] cx,003fh ;In CX e lungimea cx ;Lungimea trebuie sa nu fie 0 si,20 ;In SI e inaltimea

call dreptunghi inc bx cmp bx,56000 jnz p1 oprire: jmp oprire - 241 -

;****** Subrutine ************** linv: ;Afiseaza o linie verticala push di push cx push bp

mov dx,bp shl dx,8 shl bp,6 add dx,bp add di,dx mov cx,si lv1: MOV ES:[DI],al add di,320 loop lv1 pop bp pop cx pop di ret dreptunghi: ;afiseaza un dreptunghi cu culoarea "culoare" la x1,y1, de ;lungime l si inaltime h push cx push di d1: call inc di dec cx jnz d1 pop di pop cx ret linv

END Start

- 242 -

Programul 11.6 .MODEL SMALL .STACK 200H .CODE h=30 Start: ;Mod video 320x240 mov ah,0 mov al,13h int 10h princ: MOV MOV AX, 0A000H ES, AX

mov bx,500h p1: push bx mov al,[bx] inc al mov bp,[bx+1] and bp,00ffh mov di,[bx+2] and di,01ffh mov and inc inc inc mov ;in AL culoarea ;in BP e Y1 ;In DI e X1

cx,[bx+2] cx,003fh ;In CX e lungimea cx ;Lungimea trebuie sa nu fie 0 cx cx si,h ;In SI e inaltimea

call dreptunghi pop bx inc bx cmp bx,56000 - 243 -

jnz p1 oprire: jmp oprire MOV MOV INT AH, 4CH AL, 00H 21H ;Return to DOS

;****** Subrutine ************** lino: push push push push ;Afiseaza o linie orizontala , la y = BP din ;puncte cu culoarea din DI bp di cx ax

mov al,0 mov dx,bp shl dx,8 shl bp,6 add dx,bp add di,dx repz stosb pop pop pop pop ret linv: ax cx di bp

;Afiseaza o linie verticala push di push cx push bp mov shl shl add dx,bp dx,8 bp,6 dx,bp - 244 -

add di,dx mov cx,si sub cx,1 add di,320 lvi: MOV ES:[DI],al add di,320 loop lvi pop bp pop cx pop di ret dreptunghi: ;afiseaza un dreptunghi cu culoarea "culoare" la x1,y1, ;de lungime l si inaltime h push cx push di call lino push bp add bp,si ;in BP e Y1 call lino pop bp push ax mov al,0 call linv pop ax inc di dec cx dec cx d1: call inc di dec cx jnz d1 push ax mov al,0 call linv pop ax - 245 linv

pop di pop cx ret END Start

Programul 12.2 .MODEL SMALL .STACK 200H .DATA x1=100 y1=50 lung=100 inalt=50 culo=5 culv=1 .CODE Linieo macro x1,y1,lung,culoarea local lo1 mov di,x1 ;DI contine X1 mov bp,y1 ;BP contine Y1 mov cx,lung ;CX contine numarul de puncte mov al,culoarea;In AL este culoarea mov dx,bp ;Se face inmultirea shl dx,6 ;lui BP (adica a lui Y1) cu 320 shl bp,8 ;Prin copiere in DX add bp,dx ;deplasari la stinga si adunare add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala lo1: mov es:[di],al ;Pune punctul inc di loop lo1 ;Repeta de CX ori endm Liniev macro local lv1 mov di,x1 x1,y1,lung,culoarea ;DI contine X1 - 246 -

bp,y1 ;BP contine Y1 cx,lung ;CX contine numarul de puncte al,culoarea;In AL este culoarea dx,bp ;Se face inmultirea dx,6 ;lui BP (adica a lui Y1) cu 320 bp,8 ;Prin copiere in DX bp,dx ;deplasari la stinga si adunare di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala lv1: mov es:[di],al ;Pune punctul add di,320 ;Noul punct este cu 320 mai ;departe in memoria de ecran loop lv1 ;Repeta de CX ori endm Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h 13 MOV MOV AX, 0A000H; Adresa segmentului ecran in modul ES, AX ;in ES

mov mov mov mov shl shl add add

linieo linieo liniev liniev oprire: jmp END Start

x1,y1,lung,culo x1,y1+inalt,lung,culo x1,y1+1,inalt-1,culv x1+lung-1,y1+1,inalt-1,culv

oprire

Programul 12.3 - 247 -

.MODEL SMALL .STACK 200H .DATA x1=100 y1=20 lung=100 inalt=50 culo=5 culv=1 .CODE ;Linia orizontala Linieo macro x1,y1,lung,culoarea local lo1 mov di,x1 ;DI contine X1 mov bp,y1 ;BP contine Y1 mov cx,lung ;CX contine numarul de puncte mov al,culoarea;In AL este culoarea mov dx,bp ;Se face inmultirea shl dx,6 ;lui BP (adica a lui Y1) cu 320 shl bp,8 ;Prin copiere in DX add bp,dx ;deplasari la stinga si adunare add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala lo1: mov es:[di],al ;Pune punctul inc di loop lo1 ;Repeta de CX ori endm ;Linia verticala Liniev macro x1,y1,lung,culoarea local lv1 mov di,x1 ;DI contine X1 mov bp,y1 ;BP contine Y1 mov cx,lung ;CX contine numarul de puncte mov al,culoarea;In AL este culoarea mov dx,bp ;Se face inmultirea shl dx,6 ;lui BP (adica a lui Y1) cu 320 shl bp,8 ;Prin copiere in DX add bp,dx ;deplasari la stinga si adunare add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala lv1: mov es:[di],al ;Pune punctul - 248 -

add di,320 loop lv1 endm

;Noul punct este cu 320 mai ;departe in memoria de ecran ;Repeta de CX ori

;Linia spre dreapta Lindr macro x1,y1,lung,culoarea local lv1 mov di,x1 ;DI contine X1 mov bp,y1 ;BP contine Y1 mov cx,lung ;CX contine numarul de puncte mov al,culoarea;In AL este culoarea mov dx,bp ;Se face inmultirea shl dx,6 ;lui BP (adica a lui Y1) cu 320 shl bp,8 ;Prin copiere in DX add bp,dx ;deplasari la stinga si adunare add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala lv1: mov es:[di],al ;Pune punctul add di,321 ;Noul punct este cu 320 mai ;departe in memoria de ecran loop lv1 ;Repeta de CX ori endm ;Linia spre stanga Linst macro x1,y1,lung,culoarea local lv1 mov di,x1 ;DI contine X1 mov bp,y1 ;BP contine Y1 mov cx,lung ;CX contine numarul de puncte mov al,culoarea;In AL este culoarea mov dx,bp ;Se face inmultirea shl dx,6 ;lui BP (adica a lui Y1) cu 320 shl bp,8 ;Prin copiere in DX add bp,dx ;deplasari la stinga si adunare add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala lv1: mov es:[di],al ;Pune punctul add di,319 ;Noul punct este cu 320 mai ;departe in memoria de ecran loop lv1 ;Repeta de CX ori endm - 249 -

Start: ;Mod video 320x200 mov ah,0 mov al,13h int 10h MOV MOV AX, 0A000H; Adresa segmentului ecran in modul ;13 ES, AX ;in ES x1,y1,lung,culo x1,y1,lung/2+1,culo x1+lung,y1,lung/2,culo x1,y1+60+lung,lung,culo x1,y1+60,lung,culo x1,y1+60,lung+1,culo

linieo lindr linst linieo liniev lindr

oprire: jmp oprire END Start

Programul 12.4 .MODEL SMALL .STACK 200H .CODE x1=100 y1=50 l=200 h=50 culoarea =1h linv macro ;Afiseaza o linie verticala local lv1 push di push cx push bp - 250 -

mov dx,bp shl dx,8 shl bp,6 add dx,bp add di,dx mov cx,si lv1: MOV ES:[DI],al add di,320 loop lv1 pop bp pop cx pop di endm dreptunghi macro ;afieaz un dreptunghi cu culoarea "culoare" la x1,y1, ;de lungime l si inaltime h push cx push di dd1: linv inc di dec cx jnz dd1 pop di pop cx endm Start: ;dd1 nu trebuie declarat LOCAL

;Mod video 320x240 mov ah,0 mov al,13h int 10h princ: MOV MOV AX, 0A000H ES, AX - 251 -

p1:

mov mov inc mov and mov and mov and inc mov

bx,300h al,[bx] al bp,[bx+1] bp,00ffh di,[bx+2] di,01ffh cx,[bx+2] cx,003fh cx si,20

;in AL culoarea ;in BP e Y1 ;In DI e X1 ;In CX e lungimea ;Lungimea trebuie sa nu fie 0 ;In SI e inaltimea

dreptunghi inc bx cmp bx,56000 jnz p1 oprire: jmp oprire END Start

- 252 -

BIBLIOGRAFIE
1. I. Spnulescu, S.I.Spnulescu - Circuite integrate digitale i sisteme cu microprocesoare, Editura Victor, Bucureti, 1996; 2. I. Spnulescu, S.I.Spnulescu - Prelucrarea, nregistrarea, transmiterea i afiarea datelor, Universitatea din Bucureti, 1984; 3. S.I.Spnulescu - Programarea in limbaj de asamblare a microcontrolerelor -Lucrri de laborator, Editura Victor, 2003 4. D. Somnea, T.Vladu -Programarea n Assembler - Editura tehnic, Bucureti, 1992; 5. Vlad Caprariu, Andrei Enyedi, Marius Muntean- Sistemul de operare DOS. Ghidul programatorului, Ed. Microinformatica, Cluj-Napoca, 1993; 6. Vlad Caprariu, Sistemul de operare DOS. Funcii sistem, Ed. Microinformatica, Cluj-Napoca, 1995; 7. *** INTEL Microprocessors, Vol. 1, 2, Intel Corporation, Santa Clara, California, 1991; 8. Intel Architecture Sofware Developer's Manual Vol 1, 2A, 2B, 3, Intel Corporation, Santa Clara, California, 2003.

- 253 -

CUPRINS
Introducere3 Lucrarea de laborator nr.1. Utilizarea macroasamblorului TASM i a depanatorului TD .7 1.1 Utilizarea TASM i TD n forma clasic (linie de comand, DOS) ...........7 1.2 Utilizarea TASM i TD n forma integrata (fereastra Windows) .............12 Lucrarea de laborator nr. 2. Instruciuni de transfer ntre registre ..............................15 2.1 Elemente ale limbajului de asamblare ......................................................15 2.2 Notaia hexazecimal.................................................................................16 2.3 Registrele procesoarelor Intel x86 ...........................................................18 2.4. Instruciuni de transfer ntre registre ........................................................19 2.5. Instruciuni de interschimbare ntre registre ............................................20 2.6. Instruciuni de adunare i scdere ............................................................21 Lucrarea de laborator nr. 3. Transferuri de date i operaii aritmetice cu memoria ...23 3.1 Componentele unei adrese logice .............................................................23 3.2 Componentele unei adrese efective ..........................................................25 3.3 Transferuri pe 1 octet i pe 2 octei ..........................................................27 3.4 Moduri de adresare ...................................................................................28 Lucrarea de laborator nr. 4. Procedee de transfer cu memoria ..................................35 4.1 Transferuri prin adresare la memorie ......................................................35 4.2 Transferuri prin stiv ................................................................................35 4.3 Transferul prin iniializarea/rezervarea de locaii de catre asamblor........37 4.4 Instruciunea de translatare a unei adrese, XLAT ...................................39 4.5 Instruciuni de transfer pentru registrul de flaguri ....................................40 4.6 ncrcarea unei adrese logice din memorie ..............................................40 4.7 ncrcarea unei adrese efective..................................................................41 Lucrarea de laborator nr. 5. Operaii aritmetice .........................................................43 5.1 Reprezentarea n complement fa de 2 ....................................................43 5.2 Prezentarea instruciunilor aritmetice .......................................................45 Lucrarea de laborator nr. 6. Operaii logice, deplasri i rotaii .52 6.1. Operaii logice .........................................................................................52 6.2. Deplasri i rotaii ....................................................................................53 6.3. Operaii aritmetice BCD (opional, vezi Anexa 1) .................................56 - 254 -

Lucrarea de laborator nr. 7. Instruciuni de salt ..........................................................58 7.1 Instruciuni de salt necondiionat .............................................................58 7.2 Instruciuni de salt condiionat .................................................................58 7.3 Instruciuni de ciclare LOOP, LOOPcc ....................................................60 Lucrarea de laborator nr. 8. Instruciuni de lucru cu iruri .........................................62 8.1. Instruciunile LODSB, LODSW, STOSB, STOSW ................................62 8.2 Instruciunile MOVSB i MOVSW ..........................................................64 8.3 Instruciunile pentru analiza coninutului irurilor, SCASB i SCASW ..66 8.4. Instruciunile de comparare iruri CMPSB i CMPSW ..........................68 8.5 Prefixele REPE, REPZ, REPNE i REPNZ .............................................70 Lucrarea de laborator nr. 9. Funcii sistem (INT 21h) ..............................................71 9.1 Utilizarea ntreruperilor software .............................................................71 9.2 Funcii sistem de intrare i ieire ..............................................................72 Lucrarea de laborator nr. 10. Afiarea n mod grafic .................................................77 10.1 Utilizarea ntreruperii 10h ......................................................................77 10.2 Scrierea direct n memoria de ecran .....................................................79 Lucrarea de laborator nr. 11. Utilizarea de subrutine (proceduri) ..............................84 11.1 Chemarea i revenirea din subrutin .......................................................84 11.2 Salvarea i refacerea registrelor afectate de subrutin ............................86 Lucrarea de laborator nr. 12. Utilizarea macroinstruciunilor ....................................90 12.1 Generalitati .............................................................................................90 12.2 Declararea i utilizarea macroinstruciunilor ..........................................90 12.3 Utilizarea etichetelor locale cu directiva LOCAL ..................................94 12.4 Alte faciliti de macroasamblare ..........................................................96 ANEXA 1. SETUL DE INSTRUCIUNI ALE MICROPROCESOARELOR INTEL 80x86 N MODUL REAL SAU VIRTUAL 8086..97 A 1.1 Notaii, convenii ..97 A1.2. Instruciuni de transfer ..98 A1.3. Instruciuni de calcul108 A1.4 Instruciuni de lucru pe bit ...124 A1.5. Instruciuni de ramificare n program .127 A1.6. Instruciuni speciale 133 ANEXA 2. Lista serviciilor de ecran INT 10h ....135

- 255 -

ANEXA 3. Lista funciilor sistemului de operare INT 21h .161 ANEXA 4. Rezolvrile programelor181 Bibliografie ...253

- 256 -

You might also like