MICROPROCESORUL Intel 8x86

1.1. Structura microprocesorului I8x86
Registre generale (8,16,32biti) 31 EAX ……. AX EBX ……. BX ECX ……. CX EDX ……. DX Registre pointer si index( 16,32biti) 31 ESP ……. SP EBP ……. BP ESI ……. SI EDI ……. DI 15 AH BH CH DH 15 8 AL BL CL DL 0 Acumulator Baze reg. Counter reg. Data reg. 0 Stack pointer Baze pointer Source index Destination index 0 Code segment Data segment Stack segment Extra segment 0 Instruction pointer Flag register

Registre de baza pentru segmente 31 15 ECS ……. CS EDS ……. DS ESS ……. SS EES ……. ES (la Pentium exista si reg.segment FS, GS) Registre de stare 31 15 IP ……. Adresa instructiune curenta FLAG …….NT O D I T S Z A P C

Bitii din registrul Flag sunt indicatori de stare care se pozitioneaza functie de rezultatul ultimei operatii aritmetice sau logice si se testeaza de instructiunile de salt. Instructiunile de transfer a datelor si salt nu pozitioneaza indicatorii. O – Overflow flag depasire capacitate registru la operatii aritmetice D – Direction flag directia deplasarii la instr. pe siruri de caractere( d=0 spre dreapta) I – Interupt enableflag intreruperi admise T – Trap flag S – Sign flag indica semnul rezultatului (S=0 pozitiv, S=1 negativ) Z – Zero flag indica rezultat zero (Z=1) A – Auxiliar carry Transport intermediar din rangul 4 ( A=1) P - Parity flag Numar de biti par in rezultat (P=1) C – Carry flag Transport din rangul cel mai semnificativ (C=1) NT – Nested task Pentru control task-uri

1.2. Segmentarea programelor
1

Programele trebuie sa fie modulare si relocatabile - sa poata fi incarcate oriunde in memorie si sa poata rula din acea zona. Modulele vor cuprinde informatii de acelasi tip rezultate din compilarea programelor. Un segment poate cuprinde mai multe module asamblate de Link-Editor. Un program poate cuprinde mai multe segmente. Exista 4 tipuri de segmente : • segment de cod ce contine numai instructiuni de program cu adrese relative la inceputul segmentului, bazat cu registrul de segment CS; • segment de date ce contine numai date din program, bazat cu registrul DS ; • segment de date comune pentru mai multe segmente, bazat cu registrul ES ; • segment de stiva ce contine datele gestionate ca stive, bazat cu registrul SS ; Implicit adresele datelor din program se bazeaza cu reg.DS, adresele de salt cu reg.CS si adresele de stiva indicate de SP (Stack Pointer) cu reg.SS. Structura unui program relocatabil format din segmente Segment de cod CS=1000 00 0 … 25 0 JMP CS :250 -salt la adresa 250 din seg. de cod plasat la adresa 1000 indicata de CS (adresa absoluta 1250) -incarca z din seg. de date bazat cu DS de la adr. 150 -incarca x de la adr.40 din seg.Extern bazat cu ES

MOV AX,DS :[150] MOV BX,ES :[40] Segment date locale

DS=2000

00 0 - adresa absoluta 2000+150=2150 15 0 Z=350 Segment date extern (comune)

ES=5000

00 0 X=333 40 Segment de stiva ….. ….

- adresa absoluta 5000+40=5040

SS=7500

Contine toate stivele folosite in program

2

Calculul adresei fizice
15

Cod instr.
15

Offset Adresa (Deplasament)

0 Adresa relativa in segment 0

+ =

CS

Adresa inceput segment
19

0000
0

Adresa de memorie fizica 1.3. Moduri de adresare
La microprocesorul Ix86 poate exista o singura adresa de memorie in instructiune. Un operand este in registru iar celalalt in memorie sau alt registru. Adresarea registru registru ADD AX,DX se aduna continutul lui DX la AX pe 16 biti ADD BH,CL se aduna continutul lui CL la BH pe 8 biti COD instr Reg.sursa, Reg.destinatie - codul poate fi pe 1 sau 2 octeti

Adresarea imediata - un operand este in instructiune ADD AX,5000 se aduna 5000 la AX ADD SI,25 se aduna 25 la registrul SI COD instr 5000 (valoare) - valoarea operand poate fi pe 1, 2 sau 4 octeti

Adresarea directa ADD AX,alfa ADD AX,[500] COD instr

- un operand este in memorie continutul lui alfa se aduna la AX (bazat cu DS) continutul adresei 500 se aduna la AX - adresa poate fi pe 1, 2 sau 4 octeti - codul poate fi pe 1 sau 2 octeti

Adresa relativa in segment

Adresarea indirecta ADD AX,[BX] continutul adresei indicate de BX se aduna la AX (bazat cu DS) COD instr. BX Adresa relativa operand RAM Operand2

Adresarea indexata ADD AX,X[SI] din tabloul X se ia elementul indicat de SI (adr.in tablou) 3

COD instr.

Adresa relativa tablou X

Tablou X X1 X2 X3

+SI Xi

Adresarea cu baza ADD AX,[BX+5] COD instr.

BX indica o zona de date, iar 5 este adr.relativa in zona Zona de date +5 Oper2

BX Adresa relativa zona

Adresarea cu baza si index ADD AX,[BX+SI+5] BX indica o zona, iar 5 este adr.rel.a unui tablou si SI pozitia elementului in tablou(nu indice) BX +5 Tablou X SI COD instr. Adresa relativa zona X1 X2 Xi

1.4. Formatul instructiunilor
Informatiile din memoria RAM pot fi: - date in binar, in virgule flotanta, in zecimal si pe diferite lungimi - instructiuni de diferite lungimi Instructiunile care se folosesc determina cum se interpreteaza acele informatii. In limbaj de asamblare nu exista tipuri de date declarate si se poate da doar lungimea. Daca o variabile in VF se adreseaza cu o instructiune binara valoarea este imprevizibila. Daca registrul IP (Instruction Pointer) se incarca cu o adresa de date, datele se interpreteaza ca intructiune si se pot face distrugeri in program. La incarcarea unui program se sterge toata memoria pentru a nu ramane reziduri din vechile programme. Datele pot fi : locale in segment specificate prin adresa relative la care se adauga [DS] comune mai multor segmente (ext) spec.prin adr.rel. si se adauga [ES] temporare care se pastreaza in stive in segmentul de stiva adr. [SP]+ [SS] Setul de instructiuni al calculatorului cuprinde: • instructiuni de transfer, aritmetice si logice realizate in dispozitivul aritmetic; • instructiuni pentru prelucrare siruri de caractere (texte); • instructiuni de control a programului (salturi conditionate); • instructiuni de calcul in Virgula Flotanta (VF) realizate in coprocessor; • instructiuni de calcul in zecimal realizate in coprocessor Pentium si I486 cuprind procesor si coprocesor care lucreaza in paralel. Coprocesorul nu are mecanism de calcul al adresei si salt, care se realizeaza de processor.

Structura instructiunilor I8x86 COD - instructiune pe un octet MOV AL,BL

4

COD COD COD COD

adr.rel operand2 adr.rel Mod r/m

-instr. pe 3 octeti, adresare directa ADD BX,alfa - instr. pe 2 sau 3 octeti – instr. imediata MOV SI,55 operand2 - instr.pe 4 sau 5 oct MOV X,5200 MOV X[SI],5230

deplasament operand2 - instr 6 octeti

In toate cazurile de mai sus implicit la adresa relativa se aduna continutul reg. DS. Daca se doreste sa se specifice al registru segment decat cel implicit DS sau SS pentru stiva, se adauga in fata un octet suplimentar care specifica reg.segment explicit. MOV AX,ES : [BX+5000] operandul se ia din segmentul indicat de ES Codul instructiei este pe 1 octet si are structura de baza : i Cod instr d w i=1 – instructiune imediata d=1 – rezultatul in registru d=0 –rezultatul in memorie w=1 - operand pe 16biti w=0 - operand pe 8 biti

Instructiunile care fac referire la memorie contin o extensie de cod notata Mod r/m care specifica modul de adresare folosit (reg-reg, bazata, indirecta,indexata) si are structura: MOD r/m Mod - 2cb – modul de adresare folosit 00 – deplasament 0 MOV AX,[BX] 01 – deplasament pe 8cb MOV DX,[BX+25] 10 – deplasament pe 16cb MOV DX,[BX+2500] 11 – adresare reg- reg si r/m pe 3cb specifica reg destinatie - 3cb codul registrului sursa utilizat - 3cb indica modul de adresare 000 adresarea este data de [BX+SI+depl] 001 adresarea este data de [BX+DI+depl] 010 adresarea este data de [BP+SI+depl] 011 adresarea este data de [BP+DI+depl] 100 adresarea este data de [SI+depl] 101 adresarea este data de [DI+depl] 110 adresarea este data de [BP+depl] 111 adresarea este data de [BP+DI+depl]

reg r/m

Combinatia Mod=00 si r/m=110 indica o adresare directa. 6cb COD 2cb d w Mod 3cb reg 3cb r/m 8-16cb Depl/data 8-16cb data

Codificarea registrelor in zona reg si r/m este : reg si r/m 000 w=1 reg. pe 16cb AX w=0 reg. pe 8cb AL reg pe 32cb EAX Registre segment ES 5

001 010 011 100 101 110 111 PUSHA

CX CL ECX CS DX BL EDX SS BX DL EBX DS SP AH ESP FS BP CH EBP GS SI DH ESI DI BH EDI salveaza toare registrele in ordinea data de codul registrului.

Pentru utilizarea registrelor pe 32 biti se introduce un octet extensie de cod si inca unul pentru utilizarea adreselor pe 32 biti. Pentru exercitii se va folosi programul de depanare AFD si se vor studia structurile instructiunilor utilizate. Adresele din memorie au octetii inversati. Specificarea lungimii operandului cand nu rezulta din reistrul folosit se specifica prin : /B pentru un octet si /W pentru 2 octeti (word). ADD W/[BX],50 operandul se consider ape 2 octeti

Pentru exercitii se pot folosi instructiunile de mutare, aritmetice si logice pe 1 sau 2octeti. MOV reg_dest,reg_sursa transfer intre registre MOV reg,[adresa] transfer din memorie in registru (citire din memorie) MOV [adresa],reg transfer din registru in memorie (memorare registru) MOV reg,valoare incarcare imediata in registru MOV adresa,valoare memorare imediata in memorie Cand se specifica adresa, ea poate fi directa, indirecta,sau/si indexata. PUSHA memorare toate registrele in stiva POPA incarcare toate registrele din stiva ADD dest,sursa se aduna sursa la destinatie cu un singur operand in memorie SUB dest,sursa se scade din destinatie sursa AND dest,sursa operatia logica SI intre sursa si destinatie OR dest,sursa operatia logica SAU intre sursa si destinatie XOR dest,sursa operatia logica SAU EXCLUSIV intre sursa si destinatie

6

reg seg. F1 StepProg executa un program terminat cu INT 3 (termina un task si revine in AFD). Fereastra din dreapta jos da continutul ASCII al locatiilor de memoriei din fereastra 2. F4 afiseaza Help-ul programului F1 Step executa o instructiune de program( pas de program). adreselor de memorie.2) A adresa asambleaza un program de la adresa (>100).lung scrie intr-un fisier o zona de memorie de lungime specificata QUIT terminare AFD si iesire in DOS sau Windows 7 .5.exe in memorie la adresa W fis. F8 jos.adr. Schimband adresa sau reg. F10 dreapta In fiecare fereastra se poate modifica direct pe ecran continutul registrelor. a continutului celulelor de memoriei. R reg=val initializeaza registre M n adresa afiseaza zona de memorie in fereastra 1 sau 2 (n=1. Fereastra CMD de comanda permite introducerea de comenzi : D adresa -afiseaza in hexa si in limbaj de asamblare o zona de program. CS (Exit-Ctr/Home) G adresa lansare un program de la adresa bazata cu CS (oprire cuCtr/Esc) L prog incarca un program .F9 stinga.1. Valorile din register si memorie sunt reprezentate in hexazecimal. Utilizare AFD (Advanced Full screen Debuger) Exista mai multe ferestre deplasarea cu tastele F4 sus.segment se schimba zona de memorie afisata.

Transferurile se pot executa intre registre de aceeaşi lungime.reg-reg pe 1 octet unde orice combinaţie este posibilă SI. într-o locaţie de memorie in ASM MOV [BX].DX . într-o locaţie de memorie indirect MOV DX. În limbajul de asamblare (ASM sauTASM) lungimea explicită a operanzilor se dă prin: MOV byte ptr[BP+5].DS . indexată). Instrucţiunile de mutare nu modifică indicatorii de condiţie.X[SI] .pentru adresarea stivei prin SP (Stack Pointer) sau când baza este BP.2. intr-o adresa de mem.încărcare imediata constanta intr-o adresa de memorie .pentru instrucţiunile de salt în program DS .3420 . iar la adresarea cu bază se pot folosi numai BX şi BP.25 .byte (1 octet) şi w/ . 4 octeţi .reg mem. din memorie cu adresa indirecta si indexata Când nu se poate da implicit prin registru lungimea în AFD se precizează explicit prin: b/ .încărcare conţinut adresă de memorie intr-un reg pe 4 oct.încărcare imediata in memorie pe 2 octeţi (word) 8 .!! este o combinaţie interzisă fiindcă nu pot fi doua adrese în instrucţiune Prin mem vom înţelege o locaţie de memorie specificată prin orice mod de adresare (directă. Mutările sunt de forma: MOV reg.încărcare imediata constanta intr-un registru pe 2 octeţi ECX. MOV [2400]. Inversarea se produce la orice memorare de registru si la orice citire din memorie.încărcare imediata constanta intr-un registru . INSTRUCŢIUNI ARITMETICE SI LOGICE 2. sursă . La indexare se pot folosi numai registrele SI si DI.EBX .memorare conţinut reg.încărcare conţinut adresă de memorie intr-un reg.mem destinaţie.mem mem. pe 2 octeţi In memorie constanta 0054 se va memora pe cei 2 octeţi inversaţi 5400.încărcare imediata constanta intr-un registru pe 4 octeţi b/[4200].pentru toate datele utilizate SS . Registrele segment implicite sunt: CS . intre registre şi stiva.3420 . const reg.DX .încărcare imediata in memorie pe 1 octet MOV word ptr[BP+5].1. intr-o adresa de mem.word(2octeţi).transfer intre registre pe 1.memorare conţinut reg.încărcare imediata const.4 sau 8 octeţi. La toate adresările se foloseşte un registru de segment implicit sau explicit.memorare conţinut registru într-o locaţie de memorie .25 . pe 1 octet w/[4200].[BX+SI+5]. Exemple: MOV MOV MOV MOV MOV MOV MOV CL.DX . MOV BX. pe 2 oct. 2.încărcare reg. Toate mutările se pot face pe 1.DH .reg-reg pe 4 octeti BP.încărcare conţinut adresă de memorie într-un registru .54 .reg-reg pe 2 octeti aproape orice combinaţie este posibilă EDX.reg reg.memorare conţinut registru într-o locaţie de memorie MOV X. Instrucţiuni de mutare Instrucţiunile de mutare realizează transferul datelor intre registre.[3450] .2. MOV EBX[3450] . indirectă.54 .încărcare imediata const.const mem. iar la transferul intre registre şi memorie lungimea este dată de registrul folosit. din memorie cu adresă indexata din tabel X MOV CX.încărcare reg. intre registre şi memorie.unde ca argumente putem avea combinaţiile: .

DX ..BX.încarcă din stivă un registru pe 32 biţi (POP EBX) PUSH mem ..operand2 (XChange) .(Load Effectiv Adress) .se schimba conţinutul registrelor AX cu variabila X Instrucţiunea NOP este echivalentă cu XCHG AX.[BX+SI+15] .CX.pune în stivă un registru pe 16 biţi (PUSH BX) POP reg16 .se schimba conţinutul registrelor AX cu DX MOV BX. Ex: LEA AX. In stivă se ia din vârful stivei si apoi se incrementează SP.încarcă di stivă registrul FLAGS PUSHFD . PUSH constanta . Ex: MOV AX.încărcare imediata in memorie 10 octeţi(ten byte la VF) XCHG operand1.Instrucţiunea calculează adresa relativa si o memorează in registru utilizat..pune în stivă toate registrele pe 16 biţi (AX.încărcare imediata in memorie pe 8 octet (quadword) MOV tbyte ptr[BP+5].Instrucţiune de interschimbare operand1 cu operand2 Pentru operand1 si operand 2 se păstrează toate posibilităţile de la instrucţiunea MOV.pune în stivă conţinutul unei locaţii de memorie pe 16 biţi Este foarte utilă la transmiterea parametrilor spre subprograme (PUSH X).MOV dword ptr[BP+5].25 .. Când se pune în stivă întâi se decrementează SP şi după aceea se memorează valoarea.încarcă toate registrele pe 32 biţi din stivă PUSHF .pune în stiva registrul EFLAGS POPFD ..offset adresa offset = adresa relativa calculata La coprocesor nu exista dispozitiv de calcul al adresei si se poate folosi LEA 9 .pune în stiva registrul FLAGS (indicatorii de condiţie) POPF .încarcă di stivă registrul FLAGS STIVA 0 PUSH BX SP=SP-2 si BX [SP] POP BX [SP] BX si SP=SP+2 Top vârful stivei SP N BX Alpha Y .25 .încărcare imediata in memorie pe 4 octet (double word) MOV qword ptr[BP+5].ECX.) POPAD . PUSH reg16 .pune în stivă o constantă pe 16 biţi PUSHA ..adresa operandului este memorata in AX LEA reg.adresa Este echivalenta cu: MOV AX.încarcă din stivă un registru pe 16 biţi (POP BX) PUSH reg32 .încarcă toate registrele pe 16 biţi din stivă (starea programului) PUSHAD .X .EBX.pune în stivă toate registrele pe 32 biţi (EAX.AX Adresarea stivei (PUSH şi POP) Stiva este o zonă de memorie adresată prin registrul SP care indică elementul din vârful stivei (top).25 .pune în stivă un registru pe 32 biţi (PUSH EBX) POP reg32 .) POPA .

NU zero si NU negativ C=1 transport din rangul cel mai semnificativ. Rezultatul poate fi si in memorie Z=1 rez=0 sau operanzii sunt egali la comparaţie S=1 rez<0 S=0 si Z=0 rez>0 .2 sau 4 octeţi şi sunt de forma: Adunare Adunare cu carry Scădere Scădere cu împrumut (borow) SI logic pe bit SAU SAU Exclusiv Comparaţie (scadere) Comparaţie cu SI ADD ADC SUB SBB AND OR XOR CMP TEST dest.dwpointer LES reg16. Pentru a selecta un bit sau un grup de biţi din rezultat se foloseşte o mască.mem mem. La adunarea numerelor negative apare obligatoriu C=1 fără a fi depăşire.dwpointer 2.sursa reg. Depăşirea poate apărea la adunarea numerelor de acelaşi semn şi S diferă de acest semn. dwpointer ofsset Adresa SI Adresa segment DS sauES LDS SI.reg reg. Instrucţiuni aritmetice şi logice Instrucţiunile aritmetice şi logice pot fi executate pe 1. La instrucţiunile logice C=0 O=1 rezultatul depăşeşte capacitatea P=1 numărul biţilor de 1 din rezultat este par Instrucţiunile logice se fac bit cu bit iar indicatorii se poziţionează funcţie de întregul rezultat.const mem.E1 24 1 16 66 C=1 nu depasire + 75 4E + 77 14 . 1001 1100 1000 1000 1000 AND Rez1 Masca Rez # 0 + 35 42 . 2 sau 4 octeţi Toate instrucţiunile aritmetice şi logice poziţionează indicatorii de condiţie funcţie de valoarea rezultatului. 10 Rez>0 Rez<0 .dwpointer .LDS reg16.reg16=offset adresa DS= adresa segment Încarcă registrul segment DS sau ES si registrul general de la o adresa de 4 octeţi unde se găseşte adresa relativa a operandului si adresa segmentului din care face parte.reg reg. Se foloseşte la comunicarea intre segmente pentru pregătirea registrelor de segment.const Lungime 1.2.EC 62 S=1 Depasire transfer spre S 1101+ -3 1111 -1 11100 -4 C=1 si nu depas. C=1 nu înseamnă depăşire.

4 sau 8biţi 2. Instrucţiuni cu un operand sunt de tip logic sau aritmetic: NOT NEG DEC INC Reg Mem . dar cu poziţionarea indicatorilor funcţie de rezultat. Z=0 cel puţin un bit din rezultat este 1 (S nu are sens) Indicatorii de condiţie se pot modifica prin program: Instrucţiune CLC STC CMC CLD STD CLI STI LAHF SAHF Operaţie C=0 C=1 C= ~C D=0 D=1 I=0 I=1 AH=Flag Flag=AH Observaţii Pune Carry pe 0 (Clear Carry) Pune Carry pe 1 (Set Carry) Complementează carry Pune D pe 0 (Clear Direction) Pune D pe 1 (Set Direction) Pune I pe 0 (Clear Interupt) dezautorizează întreruperile Pune I pe 1 (Set Interupt) autorizează întreruperile Încarcă Flags în AH (Load Flags from AH) Pune AH in Flags (Store AH in Flags) Instrucţiunile LAHF şi SAHF sunt folosite pentru a prelua indicatorii de condiţie din coprocesor şi ai testa in procesor folosind instrucţiunile de salt condiţionat JZ.sursa face scădere dest-sursa fără a modifica dest. AAA DAA AAS DAS AAM AAD Ajustare pentru Adunare ASCII Ajustare pentru Adunare BCD (Binary Coded Decimal) Ajustare pentru scădere ASCII Ajustare pentru scădere BCD Ajustare pentru înmulţire ASCII Ajustare pentru împărţire ASCII (divide) Corecţia constă în a aduna 6 la cifrele hexa ale rezultatului care depăşesc 10. utilizând obligatoriu registrul AL şi sunt urmate de o corecţie zecimală. dar cu poziţionarea indicatorilor funcţie de rezultatul scăderii.incrementare operand Operand pe 1. Z=1 toţi bitii din rezultat sunt 0. Corecţiile zecimale nu au argumente şi folosesc informaţii din indicatorii de condiţie C şi AC (auxiliar carry).complement operand faţă de 2 (negativ) . 11 . 2.complementare operand faţă de 1 . Operaţii în zecimal codificat binar (BCD) sau ASCII Calculele zecimale se fac în binar pe un octet. Reamintim că nu exista instrucţiuni de salt la coprocesor.3. S=0 dest > sursa S=1 dest < sursa Z=1 dest=sursa Comparaţia TEST dest.Comparaţia CMP dest.decrementare operand .sursa face un SI logic intre biţii din dest şi sursă fără a modifica dest.

. Y la DS:10 şi Z la DS:20. incrementare index pentru rândul următor(I=I+1) .Vom exemplifica pentru DAA si AAA DAA operanzi BCD Rezultat binar Corecţie +auxcarry Rezultat zecimal 54 + 78 CC + 66 32 AAA operanzi 34+ ASCII 38 6C corecţie 6 Forţează 0 si C=1 02 + 30 Rezultat ASCII afişabil 32 Program 1 de adunare pe 16 biţi a elementelor a două tablouri X şi Y şi memorarea rezultatului în Z. Adresa 100 MOV 103 MOV 106 MOV 109 ADD 10C MOV 10F ADD 112 LOOP 114 INT SI. 0C 0E Z Z(1) Z(2) Z(3) X(7) X(8) Y(7) Y(8) Z(7) Z(8) Folosind AFD putem scrie programul de la adresa 100 şi îl terminăm cu INT 3. DS:10 şi DS:20 vom introduce manual valorile pentru elementele tabelelor X şi Y.2 106 3 . Adunarea se va face din dreapta spre stânga octet cu octet.. modificând numărul de octeţi (CX) DS:0 X . 31 SI 35 12 ..AX SI. Selectând zona de memorie DS:0.AX=X(I)+Y(I) . Vom lansa în execuţie programul de la adresa 100 şi vom verifica valorile obţinute în tabloul Z de la adresa DS:20. Vom considera 8 elemente într-un tablou şi tablourile plasate la adresele hexa X la DS:0.0 CX. index I=1 –registrul de segment implicit este DS . terminare program si revenire in AFD Pogram 2 de adunare a doua numere zecimale BCD sau ASCII de lungime 8 octeţi. salt pentru CX # 0 şi face CX=CX-1 . memorare rezultat la Z(I) . 0C 0E Y Y(1) Y(2) Y(3) DS:20 0 2 SI 4 6 .8 AX. Se memorează in Carry transportul dintre ranguri si aduna la fiecare rang si carry cu ADC (iniţial C=0).[SI+10] [SI+20]. contor pentru cicluri (număr de elemente tablou) .. 0C 0E X X(1) X(2) X(3) DS:10 0 2 SI 4 6 .[SI+0] AX. Z(I)=X(I)+Y(I) DS:0 0 2 SI 4 6 . Programul permite operaţii pe orice lungime.AX=X(I) .

[SI+10] .8 . întreg Virgula zecimala pentru nr. AX=X(i)+Y(i) AAA . corecţie ASCII modifica carry MOV [SI+20]. număr de cicluri (număr octeţi) MOV AL. terminare program 2.[SI+0] . (A+B)=(A+B)*(2**-15)*2**15 1 5 S ……2 1 0 Virgula zecimala pt nr. memorează cifra rezultat in Z(i) DEC SI . dar pentru adunare şi scădere sunt valabile şi pentru numerele binare întregi. corecţie ASCII pentru afişare MOV CX.AL .4. corecţie ASCII cifra Z(i) INC SI LOOP C2 INT 3 .0 .7 . 13 . 33 35 39 34 = . număr de cicluri (octeţi) ADD b/[SI+20]. OR AL. Din punct de vedere al dispozitivului aritmetic adunarea se face ca pentru numere subunitare cu virgula după bitul de semn şi avem: A*(2**-15)+ B*(2**-15) (A+B)*(2**-15) Operand1 subunitar Operand2 subunitar Rezultat subunitar adică sa Ca sa obţinem rezultatul corect in întreg (A+B) trebuie ca rezultatul sa-l înmulţim cu 2**15 deplasam virgule cu 15 cifre binare spre dreapta.30 . X(i) ADC AL.primul rang nu exista transport MOV SI.. subunitar Operaţiile de înmulţire şi împărţire se pot face cu operanzi pe 1. MOV SI. cifra următoare LOOP 107 .DS:10 DS:20 Y Z + . SI poziţionat pe ultimul octet MOV CX. 100 101 104 107 10A 10D 10E 110 113 114 116 119 C2: CLC .30 . C=0 ..8 . Instrucţiuni de înmulţire si împărţire Operaţiile aritmetice sunt definite în dispozitivul aritmetic pentru numere subunitare. sau DAA corecţie zecimala .2 sau 4 octeţi. Considerăm 2 numere întregi A şi B pentru care facem o adunare pe 16 biţi.

4 oct. deci în faţa ultimei cifre binare. In figură văzut ca subunitar 4250 < 35 şi nu apare depăşire .2. Restul are semnul deîmpărţitului. IMUL AX Op16 Rez 32cb 15 S S 31 S 0 X X . DIV IDIV operand AX / operand8 AL –cât.zecimal .înmulţire de întregi cu semn Rezultatul înmulţirii este de lungime dublă faţă de operanzi şi se obţine pentru operanzi pe 16biţi în DX şi AX în prelungire. AX. MUL IMUL Operand pe 1. AH -rest pe 1. DX -rest EDX:EAX / operand32 .înmulţire fără semn . care echivalează cu o deplasare dreapta cu un bit.număr întreg în AX (X*(2**-30) 14 . Numerele sunt văzute ca subunitare şi avem: (X*(2**-15) * (Y*(2**-15)= (X*Y)*2**-30 Pentru ca rezultatul sa fie corect în întreg virgula trebuie deplasată cu 30 poziţii spre dreapta. La înmulţire numerele se consideră subunitare şi niciodată nu poate apare depăşire. Rezultatul obţinut trebuie împărţit la 2.dreapta Virgula ca nr. deînmulţitul/deîmpărţitul este implicit în registrul acumulator (Al.2. DX:AX / operand16 (împărţitor) AX-cât. iar celălalt operand poate fi într-un registru sau în memorie.înpărţire fără semn . La IMUL (înmulţire de întregi cu semn) se face o corecţie de deplasare spre dreapta a rezultatului cu o poziţie binară.număr întreg în AX (X*(2**-15) * Y Y – număr întreg pe 16biţ (Y*(2**-15) = 0 X* Y 0 Rezultat X*Y pe 32 biţi în DX şi AX DX AX (X*Y)*2**-30 necesare 30 depl. EAX). AX=AL * operand DX:AX=AX*operand EDX:EAX=EAX*operand .4 oct. DX:AX sau EDX:EAX) împărţitorul este într-un registru sau memorie. IDIV DX:AX 1 5 S 0 X 4250 X .înpărţire de întregi cu semn La împărţire trebuie să avem deîmpărţitul < împărţitorul văzute ca numere subunitare fiindcă rezultatul trebuie să fie subunitar. În caz contrar avem depăşire.Sunt instrucţii cu un singur operand.virgula ca număr întreg Impărtirea presupune ca deîmpărţitul este în registrul acumulator (AX.

4520 CWD . Instrucţiuni de deplasare Instrucţiunile de deplasare se fac numai în registre pe 1.AX REST.CL . rezultatul A*B în DX:AX .B BX CAT.logice sau aritmetice . memorare rest 2.deplasare circulară Rotate (logic) Right Rotate (logic)Left whith Carry Rotate (logic) Right whith Carry 15 Reg.Op16 Rez 16biţi S 3 1 S / Y = 35 0 Cât AX nr.Convert Word to Double word .deplasare deschisă Shift (logic) Left Shift Aritmetic Right Shift (logic) Right Rotate (logic)Left .C sunt numere întregi 16 biţi MOVAX. prin copierea bitului de semn.extindere EAX peEDX:EAX Există şi instrucţiuni de extindere cu Zero MOVZX sau cu Semn MOVSX prin mutare: MOVSX CX.Convert Byte to Word .zecimal Y – număr întreg pe 16biţ (Y*(2**-15) Rezultat X/Y pe 16 biţi în DX -rest şi AX – cât .spre stânga sau spre dreapta .virgula ca număr întreg Rest DX Virgula ca La împărţire numărul din AX trebuie extins spre stânga în DX.Convert Double word to Quad word . SAL SHL SAR SHR ROL ROR RCL RCR Shift Aritmetic Left .A IMUL ADD MOV ADD CWD IDIV MOV MOV word ptr B AX.extindere AL pe AX CWD . BX=A+B .DX . memorare cat .n Reg.B.A BX. extensie AX pe DX pentru împărţire cat in AX=AX/BX restul in DX .extindere pe DX:AX IDIV CX .Cât în AX şi Rest în DX Exemplu de calcul expresie: E=(A*B+C)/(A+B) unde A.extindere AX pe DX:AX CDQ .2 sau 4 octeţi. Deplasările pot fi: .5. Operaţia se face prin intrucţiunile: CBW .C BX.BL MOVZX EAX.deschise sau circulare (Rotate) Deplasarea se face cu un număr de biţi (1-32) dat în registrul CL sau în instrucţiune.1 Reg.CX MOV AX. se aduna C la AX ştiind ca rezultatele nu depăşesc 2 octeţi(16biti) .

0C0H JZ OK .Deplasările aritmetice .verifica dacă rezultatul este egal cu masca .X AND AX. Se poate folosi instrucţiunea imediată cu masca bitului testat: 16 . Prezentăm în figurile de mai jos modul de efectuare a operaţiilor de deplasare: C C C SAL Shift Aritmetic Left 0 SHL Shift Left ROL Rotate Left RCL Rotate Left whith Carry S 0 S Se recopiază semnul S C ROR Rotate Right C SHR Shift logicRight C SAR Shift Aritmetic Right S C ROR Rotate Right whith carry Testarea unui bit dintr-un registru se face prin deplasarea lui în Carry sau în Semn. Testarea unui bit se face şi prin instrucţiunea TEST care face AND între cei 2 operanzi. fără a modifica operandul destinaţie. poziţionează indicatorii de condiţie.spre dreapta se consideră împărţiri cu 2**N La toate deplasările biţi care ies din registru trec prin Carry. Testarea mai multor biţi dacă sunt pe 1 se poate face prin secvenţa: MOV AX.spre stânga se consideră înmulţiri cu 2**N ţi pot da depăşire .0C0H CMP AX.cei 2 biţi sunt pe 1 Dacă trebuie verificaţi biţii care sunt pe 0 se face înainte complementarea lui X (NOT).masca ce indică primi 2 biţi .

bitul este 1 Testarea unui bit se poate face la procesoarele pe 32 de biţi cu instrucţiuni speciale: BT .exe).obj) care conţine instrucţiuni şi date ce sunt plasate de la adresa 000. Modulele obiect nu sunt executabile.asm). Asamblarea programelor Programul sursă scris în limbaj de asamblare va avea extensia . module.4 .lst Fisier listing Prog.4000H JNZ etX2 . Se mai generează şi un fişier listing al programului compilat (Prog. • directive pentru descrierea datelor • directive pentru controlul programului (segmentare.obj LINK EDITOR Prog. LINK EDITORUL prelucrează modulele obiect obţinute prin compilare (asamblare) şi alte module obiect din biblioteci. în care adresele 17 .testează bitul indicat şi îl memorează în C (carry) BTC .lib). Din asamblarea lor rezultă un program executabil (Prog. Include Prog. Programul sursă poate face referire prin directiva INCLUDE şi la alte fişiere sursă (subprograme). salt pentru bit4=1 3.obj obiect Bibl. LIMBAJUL DE ASAMBLARE Limbajele de asamblare permit scrierea programelor folosind: • mnemonici pentru instrucţiunile procesorului şi coprocesorului.testează bitul indicat şi îl pune pe zero (Bit Reset) BTS .asm sursă ASAMBLOR Prog.testează bitul indicat şi îl pune pe 1 (Bit Set) BT JC AX.testează bitul indicat şi îl complementează (Bit Complement) BTR . proceduri) • funcţii DOS apelate prin întreruperi • macroinstrucţiuni definite de utilizator Pentru procesoarele Intel se folosesc curent asambloarele: MASM (MacroAssembler) de la Microsoft împreună cu editorul de legături LINK TASM (TurboAssembler) de la Borland 3. dar pot fi depuse in biblioteci (Bibl.lst).02H JNZ bit2 TEST X. bitul 2 din dreapta este 1 . scris cu un editor de texte şi generează un modul obiect (Prog.exe executabil EX2BIN Rezultate Prog. verifica bitul 4 din AX şi il trece în C (carry) bit4 .lib Mod.com Asamblorul prelucrează un fişier text sursă (Prog. care vor fi înglobate prin copiere în programul sursă.map Date Prog.1.ASM şi trebuie să treacă prin mai multe faze pentru a fi transformat în program executabil direct (Prog.EXE). verifică bitul 2 din stânga lui X .TEST AX.

.2.unde Adresa reală e utilizat 32. Tabelele de definiţii externe şi referinţe externe se păstrează în modulele obiect şi vor fi folosite de linkeditor pentru rezolvarea referinţelor externe prin completarea adreselelor care fac referire la etichete din alte module..AX cu un element X(I) .arg3.4000. comentariu .exe) poate fi lansat ca o comandă DOS. Adresele simbolice definite în alt modul trebuie date ca EXTRN..modulelor şi adresele relative din instrucţiuni sunt recalculate şi se face legătura între modulele care fac apel la alt modul (subprograme).arg2 arg1. MOV CX.500 . iniţializare elemente tablou X Tipuri de constante B binare H hexazecimale O octale D zecimal 0111011B 0BA56H 6573Q 4586D sau 7500 .map se găsesc noile adrese ale modulelor şi ale etichetelor definite ca externe. X DW 3490. .încarcă reg.. implicit numerele se consideră zecimale 18 ..unde e definit 20 Pr2 Referinţe ExternePr1 Adr. Adresele din instrucţiuni se recalculează relativ la începutul segmentului ţinând cont de adresa modulului în segment. Programul executabil (Prog.bx 3. Un program poate conţine mai multe segmente..540 Pr2. care prelucrează datele şi se obţin rezultatele.780.obj n1+n2 Simbol c1 n n 3 n Adr.67. MOV SI.89 20+n1 170.. Scrierea programelor sursă Linia de program sursă în limbaj de asamblare are structura: Eticheta: cod_instr directiva arg1.com a programului. iar cele care sun referite din exterior declarate cu PUBLIC.230 60. Prin programul EX2BIN se poate obţine o variantă Prog. în care se specifică adresa lor din modul. .exe Simbol c1 k alfa n1 Definiţii externe Pr3.. Asamblorul va genera câte un tabel cu etichetele referite în exterior (EXTRN) şi unul cu etichetele care pot fi referite din exterior (PUBLIC).43. comentariu Exemplu: C1: MOV AX.obj jmp c1 0 Pr1. În fişierul Prog.arg2.342Q ..obj c1 mov ax.0FFH .obj Pr1.[BX+SI+20] . 0 0 3 2 n 1 0 2 0 n 2 0 Module .

forţează contorul de amplasare la adresa specificată ALIGN n .4. definire pe 4 octeţi DQ Define Quadword . se generează adresele relative a lui A1 şi A2 54.P1 . E2 LABEL far sau near . definire pe un octet DW Define Word . definire pe 4 octeţi EQU constanta .0ACH.A2 . Menţionăm că în limbaj de asamblare nu există tipuri întregi. declarare variabile ca definiţii externe EXTRN simbol1:tip1. nume_seg ENDS 19 ..0. Etichetele locale – near se pot specifica urmate de două puncte(:) Definire segmente Un segment este cuprins între directivele SEGMENT şi ENDS nume_seg SEGMENT [align]. copiază în acel loc o secvenţă de program (subprogram) Exemple: A1 DB A2 DW A21 DW A4 DD A41 DD A7 DW P1 EQU MOV CR EQU 12. Cod ASCII CR Directive de control program NAME nume_modul .0. definire explicită etichete locale (near) sau externe (far)..041H.’TR’ A1.20.. caracter ca în alte limbaje..asm . PUBLIC var1.[combinare]. declarare referinţe externe spre alte module Unde tip este – byte.345Q.89589BAH A1.’TREN rapid’ 9542. . word... care se pot apela din exterior. reale..var2.near şi far pentru etichete apelate prin Jump sau Call Tipul permite asamblorului să genereze instrucţiuni pe lungimi corecte.0DE89H.[’clasa’] . RET [n] .... inceput de procedură . dword. directiva de sfârşi de asamblare care dă adresa de lansare program Atenţie END se pune după ultimul modul din program.A2 . dă numele modulului compilat Un modul poate fi o procedură care e cuprinsă între: nume_proc PROC near sau far . adresele relative a lui A1 şi A2 cu adresa segmentului 20 DUP(20h) 16 .... simbol2:tip2. logice. ieşire din procedură cu eliberare stivă nume_proc ENDP . sfârşit de procedură END start . unde n=1..Directive pentru definire date: DB Define Byte . qword pentru date specificând lungimea .16 aliniere contor amplasare la multiplu INCLUDE fisier..2.. definire pe 8 octeţi DT Define Ten Byte . eticheta P1 echivalată cu 16 (adresă port) DX. definire pe 2octeţi DD Define Double word . DX=16 0DH .8.. da etichetei valoarea constantei ORG adresa .

ciclu pina CX > 0 int 3 . scazator z db 8 dup(0) . index ultima cifra e1: mov al. rezultat .66h.specifică adresa la care se încarcă segmentul . adresa lansare program 20 .common .page . zona memorie pentru date .75h.29h.DS:seg2. index octet urmator loop e1 .72h.11h .multiplu de 2 .x[si] sbb al. Programul următor conţine un singur segment mixt code+date+stiva.51h. initializare registre segment mov ds.para . corectie zecimala pt. ---------------------------------------------------Lab3_0.AT adresa . Zona pentru stiva . considerate ca tablouri .doc . numar cifre zecimale mov si.83h. memorare octet rezultat dec si .byte . ------------------------------------x db 32h.29h .19h.segment definit ca stivă şi tratat ca public ( bazat cu SS) ASSUME CS:seg1. X(I) .offset stiva .ES:seg3.y[si] .33h.Y(I) das .align .public .ds:pr1.46h. . există un singur segment mixt st1: mov ax. iniţializare pointer stiva mov cx. rezervare spaţiu stiva stiva equ $ .25h. --------------------------------------------------pr1 segment assume cs:pr1. de lungime n Z=X-Y .pr1 .13h.multiplu de 16 (paragraf) .multiplu de 1 Combinarea cu alte segmente: .segmentul începe la multiplu de 256 .none -implicit .14h.word . ------------------------------------db 256 dup(?) .ax mov ss.7 .stack .al .memory -segmente tratate împreună de editor şi plasate la sfârşitul memoriei . vârful initial al stivei .segmente care se încarcă în paralel în aceeaşi zonă de memorie .ax mov sp.ss:pr1 .scadere mov z[si].8 .SS:seg4 precizează registrele segment utilizate la adresarea datelor din fiecare segment. revenire in afd (terminare) .$ este adresa curenta contor amplasare pr1 ends end st1 . descazut y db 29h. Scadere doua numere zecimale codificate binar .

data X dw 7676h.SS.CODEde date DATA şi stivă . bitul este zero inc NX[di] .2234h. index in tabloul NX mov dh. deplasare stinga cu un rang jnc c3 .STACK. Ciclu pentru numarare biti element X(I) c1: mov ax.ax . numar elemente tablou X . rezervare 256 octeti pentru stiva .2 . Rezervarea spaţiului pentru stivă se face pe lungimea dată şi automat se încarcă reg.0 . terminare program end st1 . al tabloului X si memoreaza numarul de biti . incarcare element X(I) mov cx. Modulul de date se numeşte implicit @DATA referit pentru încărcare registru segment DS.16 . --------------------------------------------------Dosseg . Instrucţiuni de salt 21 .N .0FFEEh NX db 5 dup(0) .@data .code st1: mov ax.stack 256 . numar ranguri binare c2: shl ax. model pe cu segmente de 64Ko .1 .1. Dacă se scriu programe complexe cu multe segmente de diferite tipuri trebuie să se utilizeze segmentarea explicită prin definire segmente cu nume cu directiva SEGMENT. ------------------------------------.5463h.model small . mod DOS de tratare segmente .X[si] . Segmentul de date . INSTRUCŢIUNI DE CONTROL AL PROGRAMULUI 4.0 .Dacă programul conţine numai câte un segment de fiecare tip se poate simplifica scrirea specificând unde începe segmentulde code .9541h. in elementele tabloului NX . Segmentul de code al programului .doc . initializare registrul segment de date DS mov ds. verificare sfirsit tablou X jnz c1 int 3 . urmatorul rang add si. ---------------------------------------------------Lab3_1. elemente tablou . nr. urmatorul elment din X(I) inc di dec dh . ------------------------------------. adresa lansare program 4. . index in tabloul X mov di. Programul numara bitii de 1 din fiecare element . nr biti elemente tab X N equ 5 . mov si. bitul este 1 c3: loop c2 .

Programul execută calcule şi funcţie de rezultatele obţinute. JMP BX ..salt în segmentul curent cu -32K până la +32K faţă de IP Cod instr Deplasament E9 25400 Near Jmp deplasament pe 2 octet IP=IP+25400 Far Jmp .. in segm Reg CS EA 4200 Adresa segment IP=4200 CS=adresa segment Far Jmp deplasament pe 4 octeţi Saltul de tip far (îndepărtat) se face între segmente şi se modifica atât IP cât şi registrul de segment CS în care se încarcă adresa segmentului care conţine eticheta destinaţie..salt în afara segmentului curent şi trebuie modificat IP şi reg.. După fiecare instrucţiune aritmetică sau logică.definire et5 ca etichetă externă . Salt necondiţionat JMP (Jump) Saltul constă în memorarea adresei de destinaţie a saltului în reg. Trebuie menţionat că instrucţiunile de mutare şi cele de salt nu modifică indicatorii.. care pot fi testaţi de instrucţiunile de salt condiţionat..salt scurt cu +127 până la -127 faţă de IP (instrucţiunea curentă) Cod instr Deplasament EB -50 Short Jmp deplasament pe 1 octet IP=IP-50 JMP short etich1 Near Jmp . SEGMENT PUBLIC LABEL et5:FAR far ptr et5 et5 FAR . S1 SEGMENT EXTRN .definire eticheta et5 S2 Et5 Salturi indirecte prin registre La salturile indirecte adresa la care se face saltul se specifică într-un registru.. Există 3 tipuri de salt necondiţionat direct: Short Jmp . JMP .definire eticheta et5 ca definiţie externă . CS JMP etich2 Cod Deplas.adresa de salt este conţinută în BX 22 . IP (Instruction Pointer). se poate ramifica utilizând instrucţiunile de salt condiţionat şi necondiţionat.. funcţie de valoarea rezultatului se poziţionează indicatorii de condiţie.. Adresa poate sa să se refere la un tabel de adrese de salt care pot fi selectate prin modificarea dinamică a registrului folosind indexarea.salt în segmentul S2 care conţine eticheta et5 .

Eticheta et1 care este locală.chiar dacă este etichetă locală este pe 4 octeţi In exemplul de mai sus s-au generat 2 tabele cu adrese de salt.. Tabela Tadr1 conţine adrese locale în segment generate pe 16 biţi (NEAR) ce vor fi încărcate în IP.salt la adresa et6 din alt segment et1 et2 et3 et5 et6 et1 ..et2 sau et3.. La JMP far ptr [BX] se apelează o adresă din tabela Tadr2 şi primi 2 octeţi se încarcă în IP iar următorii 2 în CS. Rez < 0 S=1 23 .2.tabel de etichete locale in segment pe 16 biţi(near) . Prin word ptr se precizează că adresele de salt sunt pe 2 octeţi şi valoare se încarcă în registru IP..SI .offset et6 JMP BX JMP word ptr [BX] JMP dword [BX] MOV ADD JMP .MOV BX.... In registru BX s-a încărcat tabela de adrese locale pe 16 biţi Tadr1 şi în registrul SI adresa relativă a unei adrese de salt din tabelă ca multiplu de 2. Forma generală a instrucţiunii este: Jcond eticheta .BX conţine adresa unei tabele de adrese de salt .adună poziţia adresei de salt dorite din tabel(*4) dword ptr [BX] . Salturi condiţionate Instrucţiunile de salt sunt de tip SHORT (+127 la -127) sau NEAR ( procesoa-rele pe 32 de biţi) şi pot referi etichete numai din segmentul curent.în BX adresa unei tabele de adrese de salt de tip FAR BX.. 4. La JMP word ptr [BX] se sare la una din adresele et1.adună poziţia adresei de salt dorite din tabel(* 2 ) word ptr [BX] .offset Tadr1 . et2 sau et3 locale BX.. iar Tadr2 conţine adrese de tip FAR generate pe 4 octeţi care conţin adresa relativă în segment (deplasament) şi adresa segmentului din care face parte eticheta şi care va fi încărcată în registru CS. MOV ADD JMP .tabela de adrese de salt este de tip FAR(CS:IP) BX. care pot fi testaţi de instrucţiunile de salt condiţionat..salt la adresa et1.4 .. .offset Tadr2 . Ele nu pot referi etichete din alt segment. în Tadr1 se generează pe 2 octeţi iar în Tadr2 se generează pe 4 octeţi fiindcă face parte dintr-un tabel de adrese de tip FAR..sursa...încarcă în BX adresa unei tabele de adrese de salt BX.dacă condiţia este îndeplinită salt la eticheta specificată Instrucţiunile aritmetice şi logice poziţionează indicatorii de condiţie funcţie de valoarea rezultatului.adresa etichetei et6 se încarcă în BX . La instrucţiunile de comparare se va ţine cont ca se face o scădere dest ..tabel de etichete de tip FAR pe 32 biţi(near) ce conţin şi adresa segmentului . Tadr1: DW DW DW Tadr2: DD DD DD .salt la eticheta et6 din segment (near) .

JAE. JB si JBE se refera la comparaţii unde elementele sun fără semn.Rez >0 Rez=0 Transport Paritate para Depăşire S=0 si Z=0 Z=1 C=1 P=1 .numărul biţilor de 1 este par O=1 Prezentăm mai jos principalele mnemonice pentru instrucţiunile de salt condiţionat: Instrucţiunea Condiţie Comentarii testată JS sau JL S=1 Salt la Rez<0 Jump on Sign/Low JNS sau JGE S=0 Salt la Rez>=0 Jump No Sign/Greater or Equal JZ sau JE Z=1 Salt la Rez=0 Jump if Zero/Equal JNZ sau JNE Z=0 Salt Rez # 0 Jump if Not Zero/Equal JG S=0 si Z=o Salt la Rez>0 Jump Greater JLE S=1 or Z=1 Rez<=0 Jump if Low or Equal JC C=1 Salt la transport Jump on Carry JNC C=0 Salt la Nu transpot Jump if Not Carry JA C=0 si Z=0 Salt la mai mare Jump if Above (comp.3. fara semn) JAE C=0 Salt la mai mare/egal Jump if Above or Equal JB C=1 Salt la mai mic Jump if Below JBE C=1 or Z=1 Salt la mai mic/egal Jump if Below or Equal JP sau JPE P=1 Salt la paritate para Jump Parity Even JNP sau JPO P=0 Salt la paritate impara Jump Not Parity/ Parity Odd JO O=1 Salt la depasire Jump if Overflow JNO O=0 Salt la Nu depasire Jump if Not Overflow JCXZ CX=0 Salt la CX=0 Jump if CX=0 JECXZ ECX=0 Salt la ECX=0 Jump if ECX=0 LOOP CX # 0 Salt pentru CX # 0 CX=CX-1 si Jump pentru CX#0 Salturile JA. CX=CX-1 şi salt dacă Z=0 şi CX # 0 . 24 . ieşire pentru CX=0 sau Z=1 4. Avantajul procedurilor este că ele sunt reutilizabile. care asigură o dezvoltare ulterioară simplă a programului şi o depanare uşoară. Instrucţiunile SETcond memorează 1 la adresa daca se îndeplineşte condiţia testată: SETS adresa pune 01H la adresa daca S=1 Salturi pentru control cicluri LOOP adr . O procedură este o secvenţă de instrucţiuni care execută un algoritm pe baza unei descrieri formale. CX=CX-1 şi salt dacă Z=1 şi CX # 0 LOOPE . Proceduri Programarea modulară presupune utilizarea subprogramelor. CX=CX-1 şi salt dacă CX # 0 LOOPZ adr . ieşire pentru CX=0 sau Z=0 LOOPNZ LOOPNE adr .

X . primul parametru MOV BX. procedură locală (near) ADD AX. Vom exemplifica cu utilizarea unei proceduri care face media a 2 numere întregi X şi Z care se plasează în registrele AX şi BX. La chemarea unei proceduri de tip FAR. Adr.de revenire în stivă (Top stiva=IP) MOV Z. ST1: MOV AX. parametru 2 CALL Pmed . Parametrii pot fi transmişi prin valoare sau prin adresă. se putea SHR AX. AX=(X+Y)/2 RET . intr-o zonă de memorie sau în stivă. Pregătire parametrii. memorare rezultat ...In limbaj de asamblare există proceduri (nu există funcţii). AX= X+Y CWD . Pmed PROC far ptr Pmed . chemare subpr.AX . La scrierea procedurii se stabileşte modul de transmitere a parametrilor. Parametrii procedurii se plasează înaintea chemării în registre. sfârşit procedură END ST1 La chemarea unui subprogram prin CALL. definite cu directiva PROC şi terminate cu ENDP. care va fi utilizat de RET pentru a reveni în program şi a continua cu instrucţiunea următoare. Pmed PROC NEAR .1 IDIV C2 . Rezultatul se obţine la ieşirea din procedură în AX şi se va plasa la revenirea în programul principal în variabila Z.BX . constanta 2 . revenire în program la adresa de revenire din stivă (IP=Top stivă) Pmed ENDP . Instrucţiunea RET are codul C3H pentru proceduri de tip NEAR şi CBH pentru cele de tip FAR.Y . se pune adresa de revenire (IP) în stivă şi se sare la prima instrucţiune din procedură (IP=offset Pmed)... instrucţiunea CALL are adresa pe 4 octeţi şi depune în stivă atât IP cât şi CS şi încarcă din adresa instrucţiunii noile valori pentru IP şi CS. Chemarea unei proceduri se face cu instrucţiunea CALL. O procedură de tip FAR se deosebeşte de una de tip NEAR doar prin faptul că instrucţiunea RET incarcă din stivă atât adresa de revenire în IP cât şi adresa segmentului în CS.MODEL SMALL . care încarcă în IP adresa din vârful stivei revenind la instrucţiunea următoare după CALL. CALL .STACK 100H .. pune în stivă IP şi CS FAR 25 . Instrucţiunea CALL se deosebeşte de JMP doar că depune în stivă registru de instrucţiuni IP. care poate fi în alt segment... Revenirea din procedură în programul chemător se face cu instrucţiunea RET.DATA X DW 2540 Y DW 15417 Z DW 0 . DOSSEG . Tehnicile de transmitere a parametrilor spre subprograme se vor discuta în capitolul 4. In procedură se execută secvenţa de instrucţiuni până la instrucţiunea RET. Z=(X+Y)/2 rezultat C2 DW 2 .CODE . Se recomandă ca procedurile să fie globale (de tip FAR) pentru a putea fi păstrate în orice segment şi să poată fi apelate din oricare segment de program.

cifre 05 SI 31 34 32 35 37 BX adresa început număr zecimal Luăm pe rând cifrele şi eliminăm primi 4 biţi (3 din faţă) şi obţinem valoarea lor în binar. Numerele se introduc ca şir de cifre zecimale codificate în ASCII având codurile 30.. RET . Exemple de programe 4. incarcă din stivă IP şi CS Near CALL ... 1.39h pentru 0. 3.. Pentru a putea face calcule în dispozitivul aritmetic.. în BX adresa unei tabele de adrese de proceduri locale CALL dword ptr[BX] . Conversia din zecimal în binar Dispozitivele periferice ale calculatorului(tastatură. 32h.salt în segmentul curent cu -32K până la +32K faţă de IP Cod instr Deplasament CALL 25400 IP=IP+25400 Near CALL deplasament pe 2 octet Far CALL . ecran.. Numărul 14257 introdus de la consolă este un şir ASCII reprezentat sub forma: Adresa sir Cifre max DX 0A Nr.1. Calculul numărului binar corespunzător îl facem iterativ folosind valoarea cifrele codificate în binar astfel: N=1*10000+4*1000+2*100+5*10+7 Se poate calcula iterativ fără a folosi puterile lui 10 după algoritmul N=0 N=((((0+1)*10+4)*10+2)*10+5)*10+7 26 .. CS Cod Deplas. în BX adresa unei tabele de adrese de proceduri globale 4.9..4.4. imprimantă) sunt proiectate să lucreze cu şiruri de caractere codificate în ASCII. in segm Reg CS CALL 4200 Adresa segment IP=4200 CS=adresa segment Far CALL deplasament pe 4 octeţi Ca şi la JMP se pot face apeluri de proceduri indirect prin registre: CALL BX . adresa procedurii este în BX CALL word ptr [BX] . şirul de cifre trebuie convertit.. care lucrează în binar. 33h.. 31h.pune în stivă IP .pune în stivă IP şi CS .salt în afara segmentului curent şi trebuie modificat IP şi reg. 2.

0. care se pune în AH şi cere adresa şirului de recepţionat în DX.ax mov dx.data .0 mov cl. numar cifre zecimale dw 17394 . .286c dosseg .10 dup (30h). memorare numar binar int 3 .'$' .code st1: mov ax.intrare BX = adresa numar zecimal.offset m1 .z1+1 .'$' . Conversie zecimal ASCII . ----------------------------------------czb proc xor ax. asteptare numar int 21h mov bx. Zona ce recepţionează şirul (Z1) are în primul octet numărul de octeţi maxim aşteptaţi. Procedura conversie zecimal ASCII -binar 2 octeti . adresa numar zecimal mov ah. Funcţia DOS de afişare mesaj are codul 9 (09H) care se pune în AH şi cere adresa mesajului în DX.stack 100 .'Introduceti un numar de 5 cifre:'.10 . numar de cifre numar zecimal call czb .iesire AX = numar binar . ----------------------------------------. procedura conversie zec-bin mov bin. -------------------------------------. Rezultatul va fi returnat în registrul AX . La chemarea procedurii de conversie CZB în BX se încarcă adresa primului caracter din şirul de cifre zecimale şi în CX numărul de cifre zecimale. . nr zecimal zece dw 10 n db 0 .13.binar 2 octeti . pentru verificare rezultat bin dw 0 .@data mov ds. afisare mesaj dialog mov ah. adresa prima cifra mov cx. iar în octetul 2 numărul de octeţi recepţionaţi (şirul se termină cu enter).10. CX = numar cifre zecimale .ax . numar zecimal ASCII introdus de la tastatura z1 db 10.ax .model small . AX = 0 27 .13.10.9 int 21h mov dx. -------------------------------------. Mesajul de afişat se va termina obligatoriu cu $.offset z1+2 .offset z1 . Funcţia DOS de citire mesaj de la tastatură are codul 10 (0AH). numar binar rezultat m1 db 13.Programul prezentat mai jos citeşte de la tastatură un număr ASCII de maxim 5 cifre ASCII ( reprezentabil pe 2 octeţi) memorat la adresa Z1 şi apelează o procedură de conversie care funcţionează după acest algoritm.10.

numarul zecimal ASCII rezultat se afiseaza zec db 6 dup (20h). La chemarea procedurii se încarcă în AX numărul binar ce trebuie convertit. Conversie binar .2. rezultat zecimal zece dw 10 n db 0 bin dw -17394 . afisare mesaj de dialog mov ah.9 int 21h mov si.10.10. care se memorează într-o zonă ZEC din dreapta spre stânga. urmatoarea cifra 4. Ieşirea din ciclu se face când câtul împărţirii din registrul AX este zero.13.286c .ax mov dx. -------------------------------------. Conversie binar-zecimal ASCII Considerăm un număr binar N pe 16 biţi care trebuie afişat pe monitor în ASCII. incarcare cifra ASCII . index ultima cifra zecimala mov bx.@data mov ds.ax n. N = N*10 . împărţind repetat numărul cu 10 şi reţinem resturile împărţirii din DX.'$' .offset m1 .6-1 .cx si n c3 st1 .'Numarul in zecimal este:'.c3: czb mov mov mov and mul add inc dec jnz ret endp end si.cl cl.zecimal ASCII .offset zec .code st1: mov ax.0fh zece ax. în BX adresa zonei ZEC unde se va pune şirul zecimal şi în SI poziţia ultimului octet în şir.offset zec+5 . Se putea utiliza numai SI care să conţină adresa ultimului octet din şir MOV SI. caz în care se complementează şi se poziţionează un indicator (CH=1). N = N*10 + cifra . La revenirea din procedură se afişează rezultatul cu functia DOS având codul 9. numar cifre zecimale . numar binar de convertit m1 db 13. Conversia în zecimal se face în procedura CBZ.model small . adresa zona numar zecimal 28 . index prima cifra . -------------------------------------dosseg . anulare primii 4 biti .'$' .13.10. iar dacă a fost pozitiv se pune un +.data . Înainte de ieşirea din procedură se verifică indicatorul şi dacă numărul a fost negativ i se pune un – în faţă.4. La intrarea în procedură se verifică dacă numărul este negativ.[bx+si] cl.

zecimal ASCII .30h . numere binare 29 .ch .13.0 .data .4Ch 21h .10 dup (30h).intrare AX = numar binar BX = adresa zona pt numar zecimal . -------------------------------------- . valoare absoluta d1: mov dx.1 .--------------------------------------. numar binar . numar pozitiv mov ch. index cifra urmatoare or ax.10. . Procedura conversie binar . In z1 se transfera numerele zecimale ASCII z1 db 10. bin/10 CIT in AX or dl. terminare program – iesire in DOS . Calcul c = a*b de la tastatura . SI = index ultima cifra zecimala cbz proc xor cx.mov call mov mov int mov int ax. verificare CIT = 0 jnz d1 .offset zec ah.13.dl . pregatire impartire div zece .ax .'b: $' abin dw 0 .ax .13. indicator numar negativ neg ax . conversie binar zecimal . pozitionare indicatori jge d1 . Program înmulţire două numere zecimale ASCII . afisare rezultat conversie .'Introduceti ' a db 10.bin cbz dx.09h 21h ah.'+' .model small .10. Utilizare subprograme de conversie . semn negativ sf: ret cbz endp end st1 4.4. memorare cifra zecimala dec si .'-' . CX = 0 or ax.'$' zece dw 10 n db 0 m1 db 13. verificare indicator negativ jz sf mov byte ptr [bx+si]. corectie ASCII REST din DL mov byte ptr [bx+si].'a: $' b db 10. semn implicit or ch.286c Dosseg . ciclu daca AX > 0 mov byte ptr [bx+si].cx .0.3.

z1+1 call czb mov bbin.ax .bbin cbin czec zec dw 0 dw 0 db 13. acum in ax avem bbin mul abin . mesaj citeste a mov dx.10. citeste b in ASCII mov dx.10. acum in ax avem a*b .offset z1+2 mov cx. conversie rezultat binar . mesaj citeste b mov dx.code st1: mov ax. citeste a in ASCII mov dx.@data mov ds.offset m1 mov ah.0 mov cl.conversie b in binar mov bx.offset czec mov ah.offset z1 mov ah.09h int 21h . conversie a in binar mov bx.09h int 21h .5 call cbz .4C00h int 21h 30 .'a*b= ' . afisare c mov dx.13.10 int 21h .ax . rezultat de afisat db 6 dup(20h).zecimal mov bx.z1+1 call czb mov abin.ax . c=a*b mov cbin.offset z1+2 mov cx.offset z1 mov ah.ax .09h int 21h .'$' .offset zec mov si. terminare mov ax.10 int 21h .0 mov cl.offset b mov ah.

chiar şi între segmente: MOV SI. incrementare indexi pentru caracterul următor INC DI LOOP .offset Sir1 . ISTRUCŢIUNI PENTRU SIRURI DE CARACTERE 5.Sir2 .asm end st1 5. Prelucrare texte Prelucrarea textelor este o operaţie foarte frecvent întâlnită în editoarele de texte şi compilatoare. s-au introdus instrucţiuni specializate pentru prelucrarea şirurilor de caractere (în 1965 IBM 360). D=1 din dreapta spre stânga 31 .conţine adresa sirului sursă (sir1) . Din acest motiv de la primele calculatoare comerciale.2 sau 4octeţi) .AL .conţine numărul de elemente transferate (de 1.conţine adresa sirului destinaţie (sir2) .dreapta. încarcă un caracter din prima zonă MOV ES:[DI].Lung . se copiaza procedurile de conversie CBZ si CZB include convert. ciclu DS:S i Sir1 F A C U L T A T E ES:Di Sir2 F A C U L T A T E Această operaţie poate fi făcută mai simplu utilizând instrucţiunea MOVSB. care nu are argumente şi cele două şiruri şi lungimea transferată se specifică în registre. adresa sir1 MOV DI. pentru a obţine o performanţă ridicată. Din această categorie fac parte operaţiile: Mutare şir de caractere MOVS (Move String) Ştergere zonă de memorie STOS (Store String) Încărcare ciclică elemente şir LODS (Load String) Comparare şiruri de caractere CMPS (Compare String) Căutare caracter în şir SCAS ( Scan String) Traducere şir dintr-un cod în altul XLAT Mutare şir Mutarea unui şir de octeţi (caractere) dintr-o zonă de memorie în alta se poate face printr-un ciclu utilizând instrucţiunile de transfer.indicator de direcţie D=0 din stânga .: DS:SI ES:DI CX DF . Lungime şir ( număr de cicluri) C1: MOV AL.1. Mută în Zona 2 (chiar în alt segment) INC SI ..offset. adresa sir2 MOV CX.DS:[SI] .

adresa sir1 MOV DI. SCASB AL compară cu [ES:DI] şi DI=DI+/-1.MOVSB MOVSW MOVSD . AX sau EAX şi poziţionează indicatorii de condiţie. AX. Diferenţa între cele două cazuri apare când cele 2 şiruri nu sunt disjuncte şi se realizează o translaţie pentru Sir1 spre dreapta (corect cu D=1) sau spre stânga (corect D=0) .2.4 W AX D EAX STOS (Store String) memorează conţinutul registrului AL.SI=SI+1 pentru D=0 şi SI=SI-1 pentru D=1 .4 32 . STOSB AL [ES:DI] şi DI=DI+/-1. Are formele: LODSB [DS:SI] AL şi SI=SI+/-1.mută 2 octeţi (word) de la adresa DS:SI la adresa DS:DI .Sir2 . AX sau EAX la adresa destinaţie ES:DI şi incrementează (D=0) sau decrementează (D=1) registrul index DI.4 W AX D EAX SCAS (Scan String) compară succesiv elementele unui şir de la adresa ES:DI cu conţinutul registrului AL.mută 4 octeţi (dword) de la adresa DS:SI la adresa DS:DI . adresa sir2 MOV CX. forţare D=0 pentru direcţie din stânga spre dreapta MOV SI. Sir1 F F F A A A C C C Sir2 U L U U F F T A A A C C T U U E F L A T C A U T F E MOVSB D=0 stg-dr D=1 dr-stg LODS (Load String) încarcă un element de la adresa DS:SI în AL.SI=SI+2 pentru D=0 şi SI=SI-2 pentru D=1 .offset Sir1 .2. Se pot astfel căuta caractere într-un şir.SI=SI+4 pentru D=0 şi SI=SI-4 pentru D=1 Secvenţa instrucţiuni pentru mutare Sir1 la Sir2 va fi: CLD .mută un octet de la adresa DS:SI la adresa DS:DI . sau EAX şi incrementează (D=0) sau decrementează (D=1) registrul index SI. Dacă indicatorul de direcţie D=1 (STD) se va da adresa ultimului octet din cele 2 şiruri şi prin decrementarea lui SI şi DI se va continua cu mutarea elementelor şirului spre stânga. mută un octet de la adresa DS:SI la adresa DS:DI şi SI=SI+1 LOOP C2 Operaţia poate fi repetată automat fără LOOP prin: REP MOVSB După fiecare mutare de octet instrucţiunea poate fi întreruptă.2. Lungime şir ( număr de cicluri) C2: MOVSB .Lung .offset.

2.4 şi DI=DI +/.1.offset Sir1 .offset. lungime şir MOV DI. repetă instrucţiunea pentru CX#0 şi Z=0 . DS =adresa segment LES reg. adresa şir MOV AL. Comparaţia se face prin scădere din elementul indicat de DS:SI cel indicat de ES:DI. SI=SI +/.200 . repetă instrucţiunea atâta timp cât CX # 0 . Ieşirea din ciclu se face când CX=0 sau funcţie de valoarea indicatorului Z.4 Pentru pregătirea registrelor se pot folosi şi instrucţiunile care încarcă adrese dacă se cer transferuri de date între segmente: LDS reg.2. ciclu atâta timp cât caracterul nu este punct 33 . Operaţia se poate face prin repetiţie şi se va opri la primul element diferit din cele 2 şiruri care va poziţiona indicatorii şi va da sensul comparaţiei.2.4 D EAX 5. forţare D=0 pentru direcţie din stânga spre dreapta MOV SI. setare direcţie stânga .2. REP MOVSB .offset sir . CX=CX-1 Căutarea unui caracter punct într-un şir se poate face folosind SCASBcu secvenţa: CLD . transferă 5000 octeţi din zona1 în zona2 REPE instr REPZ REPNE instr REPNZ .4 W AX DI=DI+/-1. caracter căutat punct (de referinţă) REPNZ SCASB . REP nu se aplică la instrucţiunile aritmetice şi logice. adresa zona1 MOV DI.Sir2 .dwpointer IP=offset adresa.W D AX EAX CMPS compară şirul indicat de DS:SI cu şirul indicat de ES:DI element (caracter) cu element şi poziţionează indicatorii de condiţie.’ . Repetarea ciclică a instrucţiunilor pe şiruri Toate instrucţiunile pe şiruri pot fi repetate atâta timp cât CX # 0. Lungime şir ( număr de cicluri) REP MOVSB .dreapta MOV CX.1. CX=CX-1 . adresa zona2 MOV CX.’.2.5000 . CX=CX-1 . CMPB [DS:DI] se compară cu [ES:DI[ şi SI=SI+/-1.dwpointer IP=offset adresa. ES =adresa segment CLD . repetă instrucţiunea pentru CX#0 şi Z=1 .

16 .n .offset sir3 . adresa ultim octet destinatie rep movsb . afisare sir1 c2: mov ah. functie afisare int 21h 34 . repeta atit timp cit octetii sint egali jl calc .3. mutare sir . sir sursa mov di. memorare reg AL in zona . lungime zona rep stosb . DF=0 directie stinga-dreapta repe cmpsb . adresa sir sursa mov di. -------------------------------------Lab5_0.pr1 mov ds. Translatie zona spre dreapta .9 .offset sir2+15 .offset sir2+26 .offset sir3 . adresa ultim octet din sir mov di. mutare sir dreapta-stinga . zona destinatie cld . adresa sir destinatie mov cx. Muta zona de memorie .'$' st1: mov ax. DF=1 directie dreapta-stinga mov cx.ax mov es. afisare sir3 jmp short c2 calc: mov dx. df=0 directie stinga dreapta rep movsb . adresa inceput zona mov cx.es:pr1 n equ 25 sir1 db 'facultatea calculatoare $' sir2 db 30 dup(20h) sir3 db 'facultatea mecanica $' zona db 50 dup('A').offset zona . ------------------------------------mov al. Programul exemplifica modul de utilizare a . ------------------------------------mov si.ds:pr1. Comparatie siruri: sir1 cu sir3 .ax . instructiunilor de prelucrare siruri de caractere . ------------------------------------std . lungime sir mov si. ------------------------------------mov cx. ------------------------------------pr1 segment assume cs:pr1. sir1 < sir3 ( primul octet diferit) mov dx. lungime sir mov si. Exemple de programe pentru prelucrare texte .offset sir2 . Sterge zona .5.20 .offset sir1 .offset sir1 . lungime de comparatie cld .16 .doc .'B' . caracter ce se copiaza mov di.offset sir1 .

caracter cautat repnz scasb . Cauta caracter diferit de 'B' in zona . caracter cautat (referinta) repnz scasb ..09h int 21h int 3h . ------------------------------------pr1 segment assume cs:pr1. afisare text ce urmeaza mov ah.'$' mesaj1 db 13. Cautare punct in sir1 . -------------------------------------Lab5_2 . revenire in DOS int 21h pr1 ends end st1 .10. caracter de referinta repz scasb .'$' st1: mov ax.50 dup (' '). cautare octet = AL mov dx.'. cautare '.4C00h .50 .' 35 .10. adresa sir mov cx.ds:pr1.10 int 21h mov bl.25 .di .'$' .'Textul scurtat este: '.offset sir1 . DF=0 mov al.13.0 mov (sir1+2).offset zona . adresa zona de memorie mov cx.0. lungime maxima mov al.' .50 .[bx]. caracterul $ la sfirsit cld . Afisare text fara prima propozitie .'$' sir1 db 50. adresa text mov cx. lungime text introdus mov bh.pr1 mov ds. afisare restul sirului mov ah.' . asteptare text mov ah. ------------------------------------mov di.ax mov dx.ax mov es.--------------------------------------mov di.'Introduceti un text: '.es:pr1 mesaj db 13.offset sir1 .di .09h int 21h . cauta primul octet # AL mov dx. lung sir cld .offset mesaj mov ah.09h int 21h mov dx. lungime zona mov al.'B' . directie stinga dreapta mov di.'.offset sir1+2 . revenire in AFD mov ax.13.10.(sir1+1) .10.

Z 5AH Literele mici au codurile: a 61H. f 65H.3.es:pr1 n equ 25 36 .offset mesaj1 ... g 67H..4ch . În continuare se trec codurile pentru litere mari în ordine alfabetică.... La intrare: La ieşire: BX AL AL .Y 59H. Utilizare XLAT pentru codificare text .. terminare program cu iesire in DOS 21h st1 5. c 63H. I 49H J 4AH.. . i 69H j 6AH. e 66H.9 21h ah. ...doc .. Codificarea pentru CARTE va fi 08 01 07 02 04 Pentru a converti un text scris cu litere mici în litere mari vom ţine cont că: Literele mari au codurile: A 41H. h 68H. E 44H. Se convertesc literele mici in litere mari .. k 6BH. Codul caracterului din AL este considerat index în tabelul de coduri şi XLAT returnează în AL caracterul din tabelul de coduri corespunzător indexului . afisare mesaj ah. F 45H. DI poziţionat pe primul octet după punct 21h dx. .codul caracterului tradus Se consideră mai jos tabela de coduri încărcată în BX: BX Tabel de coduri W Index în tabel 0 A 1 T 2 Z 3 E 4 U 5 F 6 R 7 C 8 XLAT pentru AL=03 rezultă AL=K . -------------------------------------Lab5_1.adresa tabelei de coduri .. Traducere text XLAT este instrucţiunea care realizează traducerea unui text codificat într-un cod în alt cod folosind un tabel de traducere plasat la adresa indicată de BX..pr1 mov mov int mov mov int mov int ends end dx. care vor înlocui alte coduri care pot apare în afară de litere mici. H 48H.09h . afisare rest text ah...C 43H.ds:pr1... La începutul tabelei vom plasa 65 de spaţii.y 79H. ------------------------------------pr1 segment assume cs:pr1. G 47H. K 4BH.di . b 62H.. z 7AH Codul lui ‚a’ 61H = 6 x 16 + 1 trebuie să fie index pentru ‚A’ în tabel.codul caracterului de tradus . Prima literă din tabelul de coduri va fi plasată la adresa 6 x 16 + 1=65..B 42H..

Dispozitivele periferice sunt legate la porturi ale procesorului prin interfeţe specializate. index in text mov cx. Tabela coduri tcod db 6*16+1 dup(' ').se citeşte din port în AL. 2 sau 4 octeţi.offset text -1 .0 . care asigură funcţii de adaptare şi care pot să aibă memorii proprii (placi video. Instrucţiunile de intrare-ieşire sunt IN şi OUT.9 int 21h c2: mov ah. sau se poate indica indirect în registrul DX.AL port..ax mov bx. disc. AX sau EAX AL AX . iesire in DOS int 21h pr1 ends end st1 5. monitor.al .offset text mov ah. Prin program informaţia se transferă din memorie intr-un port octet cu octet (OUT).ax mov es. Text de codificat text db 'facultatea de matematici aplicate$' dw 20 dup(0) .4. memorare octet tradus inc si . modem. Instrucţiuni de intrare/ieşire Instrucţiunile de intrare ieşire transferă şiruri de caractere între memoria calculatorului şi dispozitivele periferice (tastatura.. Afisare text dupa traducere calc: mov dx. ------------------------------------st1: mov ax. lungime text c1: mov al. imprimantă .pr1 mov ds.4ch . Adresa portului se poate specifica direct în instrucţiune.EAX IN AL.AX port.'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 7 dup(' ') . traducere octet mov text[si]. sunet). La procesoarele actuale porturile pot să conţină 1.port AL AX EAX port port . OUT port.).offset tcod .text[si] .se scrie în port din AL. Interfaţa preia octeţii din port şi îi transmite spre periferic sau asigură transferul succesiv al octeţilor de la periferic spre port de unde sunt citiţi prin program (IN). adresa tabela coduri mov si.. urmatorul caracter de tradus loop c1 . transferul se face intre port şi acumulator.offset st1 . sau se citesc succesiv din port octeţi care se depun în memorie în zone tampon (buffer).AX sau EAX 37 . un octet din textul de tradus xlat .port AX.

EAX IN AL.EAX EAX Intrări ieşiri pentru şiruri de caractere La procesoarele actuale există posibilitatea transferului unui şir de octeţi de lungime dată în registrul CX. Pentru periferice nu se poate folosi REP.offset Zona .port Adresare indirectă prin DX OUT DX.port1 REP OUTSB ..AX.DX AL AX EAX EAX DXport .).EAX. număr de octeţi transferaţi MOV DX. între o zonă de memorie indicată prin DS:SI sau ES:DI şi un port indicat de un registru DX.imprimantă .2. Citire şir de caractere dintr-un port într-o zonă de memorie indicată de ES:DI INSB INSW (DXport) ES:DI şi DI=DI+/-1. Se poate utiliza comanda REP instr pentru a repeta automat operaţia de transfer. Dacă indicatorul de direcţie D=0 se dă primul octet al zonei în index şi se incrementează indexul după transferul unui element..4 (DS:SI) DXport şi SI=SI+/-1.DX EAX.se scrie în portul indicat de DX din AL. număr port utilizat CLD .2. fiindcă nu se poate realiza sincronizarea între viteza de transmisie DRAM şi viteza redusă a perifericului.AL DX. Scriere şir de caractere în port OUTSB OUTSW OUTSD DS:SI Zona Port DX Adresa port Port1 EQU 40 .se citeşte din portul indicat de DX AX în AL. transferă 3000 de octeţi spre portul 40 Instrucţiunea cu repetiţie se poate utiliza pentru a scrie în cuvintele de comandă ale unor cuploare (placă video. disc. iar dacă D=1 se încarcă în index ultimul element al zonei şi se decrementează indexul. setare direcţie stânga -dreapta MOV SI.3000 . Aceste instrucţiuni nu au argumente. AX sau EAX DXport AL .4 38 . adresă primul octet din zonă MOV CX.AX DX. După fiecare element transferat se incrementează sau se decrementează registrul index pentru a se pregăti transferul octetului următor.DX AX. Modul de lucru este similar ca la instrucţiunile pe şiruri de caractere.

. modificare sau dezvoltare uşoară a aplicaţiei. 6. Utilizarea subprogramului presupune chemarea subprogramului. care pot fi echivalente... Chemarea unui subprogram este un simplu CALL care pune registrele IP şi eventual CS în stivă şi face un salt la adresa indicată din acelaşi segment sau din alt segment.. Pentru a realiza funcţia dorită se pot folosi algoritmi diferiţi care sunt transparenţi pentru utilizator.. citire 2000 octeţi din portul 50 în buffer Aceste instrucţiuni simplifică scrierea programelor (driver) pentru comanda perifericelor. Tipul datelor este dat de instrucţiunile care se aplică asupra lor...2000 INSB .. Subprogramele se pot considera nişte cutii negre legate între ele..) cu rezultate imprevizibile dar fără să dea erori dacă nu apar depăşiri.. adresa port utilizat . scădere... adresă zonă de memorie unde se citeşte .2. .X2. transmiterea valorilor parametrilor efectivi de intrare şi preluarea rezultatelor transmise prin parametrii de ieşire. • Claritatea programelor care permite o corectare.1.Xn) . În limbaj de asamblare transmiterea parametrilor spre subprograme este mai complicată fiindcă nu există tipuri definite de date ci numai date de o anumită lungime (1. număr de octeţi de citit . coordonaţi de un programator şef care stabileşte structura de ansamblu a programului.port2 CX. TRANSMITEREA PARAMETRILOR SPRE SUBPROGRAME 6...offset buffer DX. Xn Definirea unui subprogram se face formal pe baza unui algoritm care primeşte variabile formale de intrare. Pe programator nu-l interesează modul de transmitere a parametrilor între program şi subprograme. Subprogramul stabileşte convenţia de transmitere a parametrilor de intrare şi de returnare a rezultatelor. sau chiar instrucţiuni să fie prelucrate cu instrucţiuni aritmetice (adunare.INSD Port2 EQU CLD MOV MOV MOV REP 50 DI.. care sunt prelucrate de o secvenţă de instrucţiuni care calculează variabilele de ieşire.X2.. Aici se permite ca date care sunt de tip caractere ASCII. care realizează o funcţie prin prelucrarea parametrilor formali de intrare şi returnează rezultate transmise programului chemător prin parametrii formali de ieşire.. Aceeaşi funcţie poate fi implementată prin subprograme diferite. X1 X2 . In limbajele de nivel înalt parametrii de intrare pot fi expresii de acelaşi tip cu parametrii formali de intrare.. Subprogram 39 . • Posibilitatea de reutilizare a subprogramelor existente pentru alte aplicaţii.4 octeţi). înmulţire. Programul chemător care poate fi chiar Y1(X1.Xn) Y2(X1. Subprograme Subprogramele asigură o dezvoltare sistematică a programelor pentru aplicaţii prin: • Programarea modulară – descompunerea aplicaţiei pe funcţiile realizate şi posibilitatea de a lucra mai mulţi programatori.

2..N. Ex: NX dw 20 . memorare suma RET . suma elemente tablou X dw 45. tabela de adrese rezervata local MOV cx. lungime tabela de adrese (3 param*2 octeţi) REP MOVSB . care va folosi metode de adresare indirectă sau/şi indexată. TA dw X...offset Tab . După posibilităţile de utilizare subprogramele pot fi: • Normale pot chema alte subprograme dar nu se pot chema pe ele însele • Recursive care se pot chema pe ele însele direct sau indirect (N!=N*(N+1)!) • Reentrante care pot fi folosite simultan de mai mulţi utilizatori (editare texte) Parametrii se pot transmite spre subprograme: • prin Valoare caz în care valoare parametrului se transmite subprogramului • prin Adresă când sunt tabele cu multe elemente şi adresa tabelului se transmite subprogramului. revenire din subprogram . tabela de adrese locala 40 . Elementele tabelei funcţionează ca parametrii formali apelaţi ca şi variabilele locale. NX şi suma S .723. adresa tablou X. încarcare indirectă numar de elemente Mov SI.534.890.2 .0 . element Xi ADD SI.6 . 6..S .. La apelarea unui parametru formal se apelează indirect adresa parametrului din tabela de adrese.. număr elemente tablou X S dw 0 .offset TA . transfer tabela de adrese din program in subprogram Mov CX.. Adresa Tabelei TA se încarcă într-un registru şi se transmite subprogramului. adresa tabela de adrese TA CALL PSUMA ... Subprogramul transfera tabela de adrese TA într-o zonă de memorie proprie rezervată pentru adresele parametrilor.*N . MOV SI. I=I+1 LOOP C2 MOV *Suma... Suma=0 C2 ADD AX. suma s-a transmis direct in variabila S din program PROC far MOV DI.. dar indirect (*).0 . Transmiterea parametrilor spre subprograme se poate face: • Prin registre în cazul în care sunt puţini parametrii şide lungime redusă • Printr-o zonă de memorie cu structură cunoscută şi a cărei adresă se dă într-un registru (recomandabil BX) • Prin stivă care este un caz particular de zonă de memorie • Prin tabelă de adrese care este cea mai eficientă dar nu poate fi folosită la procesoarele Intel care nu au adresare indirectă prin adresă de memorie. Transmiterea parametrilor printr-o tabelă de adrese Această metodă presupune memorarea adreselor parametrilor într-o tabelă TA.subprogram trebuie să pregătească parametrii de intrare înainte de chemare şi să preia rezultatele la ieşirea din subprogram.AX . Instrucţiunea RET reface numai din stiva adresa de revenire (registrele IP şi CS). chemare subprogram . I=1 Mov AX..*T[SI] ...

In subprogram se recomandă să se salveze registrele care se modifică şi să se refacă înainte de revenirea din subprogram (RET). Este mai simplă salvarea tuturor registrelor la început prin PUSHA şi refacerea la sfârşit prin POPA. adresa suma în programul principal Din păcate nu există adresare indirectă prin memorie şi subprogramul nu se poate implementa în acest mod. În registre se pot încărca valorile parametrilor sau adresa lor.T dw N dw Suma dw 0 0 0 . 0 biţi spre dreapta. --------------------------------------Vhexa. S-ar permite exploatarea variabilelor plasate în diferite locuri în programul principal direct din subprogram. Astfel din caracterul hexa A va rezulta 3AH+07H=41H. • Cifra hexa din dreapta registrului AL se transformă în caracter ASCII în procedura PNIB adăugându-i 30H. In cazul subprogramelor de conversie zecimal-binară şi binar-zecimală discutate deja. Grupele de 4 cifre hexa se despart printr-un spaţiu. 8. care este codul caracterului A în ASCII şi care poate fi afişat.286c . dar este limitată pentru număr redus de parametrii.doc . Dacă caracterul rezultat nu este cifră ( 9) se face o corecţie prin care i se adaugă 07H. 6. . 4. set comun 286 dosseg 41 . Se prezintă mai jos un program de afişare a unei zone de memorie în hexazecimal. Pentru aceasta se ia o zonă de memorie şi se încarcă succesiv în AX câte 2 octeţi din care vor rezulta 4 cifre hexa. Afisare zona de memorie in hexa . • La unele monitoare trebuie adăugată o secvenţă de întârziere pentru a asigura sincronizarea între viteza de transfer din memorie şi viteza perifericului. Problema se reduce la a scrie o procedură (PNUM) care afişează în hexa conţinutul registrului AX folosind succesiunea de operaţii: • Se va selecta pe rând câte o cifră hexa (seturi de 4 biţi) din stânga spre dreapta. într-un ciclu prin deplasarea registrului AX cu 12. adresa tablou . Program de afişare zonă de memorie în hexa. • Caracterul ASCII rezultat se va afişa în procedura PUTC folosind funcţia DOS 02H. care depind de valoarea iniţială încărcată în registre. s-a transmis în BX adresa şirului de cifre zecimale codificate în ASCII şi în AX numărul binar iniţial sau rezultat. chiar prin 2 cicluri suprapuse. -------------------------------------.3. Transmiterea parametrilor prin registre Este cea mai simplă metodă de transmitere a parametrilor. adresa număr de elemente . care afişează conţinutul registrului DL. Intârzierile se pot realiza prin decrementarea ciclică a unor registre. Se pot obţine timpii de întârziere doriţi. La calculatoarele clasice toate limbajele de programare foloseau această metodă de transmitere a parametrilor spre subprograme.

model small .721 .date[si] call far ptr pnum .26. la iesire 4 cifre hexa pe ecran pusha . corectie cifra > 9 42 . selectie 4 biti dreapta add al. la intrare AX=16 biti . numar de cuvinte mov si. refacere registre ret .4 .data date dw 65278. afisare cifra hexa din AL sub cl.0fh .62. afisare hexa continut AX add si.cl .4C00h int 21h . salvare registre mov cl.ax mov cx. afisare spatiu intre 4 cifre hexa call far ptr putc popa .@data mov ds.24.1234h.3ah .code st1: mov ax. deplasare dreapta cu 12.12 . Terminare program mov ax. urmatoarea cifra hexa cmp cl. cifra > 9 jl ph3 add al. cuvintul urmator loop l1 .8. terminare procedura pnumendp . corectie cifra ASCII cmp al.. contor deplasari nib2: push ax . refacere AX initial jnz nib2 mov al.30h .6 . Procedura afisare hexa continut reg AX pnumproc far .07 .2 . salvare AX shr ax. index in zona l1: mov ax.' ' .0 call pnib .0 . Procedura afisare cifra hexa din AL dreapta pnib proc near and al.4.-4 pop ax .

sfarsit segment date sstiva segment stack . eticheta baza stiva 43 .'$' . mesaj de dialog cr db 10.al . mesaj dialog out_msg db 'sirul sortat:'.ph3: call far ptr putc .dim dup(?) . ciclul 2 de asteptare del2: nop loop del2 pop cx loop del popa ret putc endp end st1 . care se memorează într-un buffer.13. Se cheamă o procedură de sortare care utilizează metoda inversiunii şi ordonează caracterele din buffer funcţie de valoarea codului ASCII.0ffh . functie DOS afisare DL mov ah. segmentul de date dim equ 80 .10.'$' .2 int 21h ret . carriage return si line feed sdate ends . buffer pentru sirul de caractere in_msg db 'introduceti sirul de caractere:'.10.'$' .--------------------------------------Program de sortare caractere dintr-un text introdus de la tastatură Se introduce de la tastatură un şir de maxim 80 caractere de lungime variabilă.doc * Sorteaza un sir de caractere prin metoda inversiunii * ==================================== sdate segment . Procedura se poate modifica pentru a primi ca parametru în BX adresa unui text oarecare precedat de lungimea lui (lungimea poate fi transmisă în CX).13.0fh . segment de stiva db 100 dup(?) . rezervare spatiu stiva stiva equ $ . Procedura afisare caracter din AL putc proc far pusha mov dl.13. secventa de asteptare afisare del: push cx mov cx.0. afisare caracter ASCII ret pnib endp . lungime maxima tabel buf db 80. * ====================================SORT. secventa de intarziere mov cx.

nu s-au introdus caractere next: mov al.es:sdate . adresa mesaj int 21h . pregatire chemare procedura call sortare .09h .ax . cod functie DOS afisare mesaj mov dx. afectare reg.0 mov cx.ax .offset stiva . incarcare adresa segment stiva in registrul SS mov sp. sfarsit segment stiva cod segment . cod asteptare sir de la tastatura mov dx.09h .09h . chemare procedura de sortare sir mov ah.09h . segment de cod assume cs:cod.offset buf.ax mov es.sdate .sirul sortat: mov dx. sunt in ordine 44 . se compara cu urmatorul jle cont .LF mov dx.0 mov cl.buf[si] .sstiva mov ss.offset cr int 21h .offset out_msg int 21h mov ah.buf[1] .4ch . primul element considerat cel mai mare cmp al. iesire in DOS int 21h * ================================ * Procedura sortare sir de caractere in zona buf * ================================ sortare proc near .offset in_msg .0ah . afisare CR. incarcare adresa segment date in registrul ES mov ax. declaratie procedura sta: mov dx. intrerupere DOS mov ah. numar cicluri L-1 jz s_end .buf[si+1] .ss:sstiva. incarcare adresa segment date in registrul DS mov ds.offset buf[2] int 21h mov ah. afisare sir sortat mov dx. lungime sir introdus in CL dec cx .ds:sdate. afisare mesaj . incarcare adresa top stiva in registrul SP mov ah. adresa buffer intrare int 21h mov ah.segment start: mov ax.sstiva ends . terminare program.

Parametrii transmişi subprogramului vor fi: Media elementelor calculată ca parametru de ieşire din procedură (S) Numărul de elemente ale tabloului (N) Tabloul de X de N elemente pentru care se calculează media BX Zona memorie (parametrii) S N X X(1) X(2) X(3) . Dacă se utilizează un singur tablou se plasează ultimul dintre parametrii şi poate fi de dimensiune variabilă..0 jnz sta s_end: mov bl.. In programul prezentat se consideră tabloul X cu 5 elemente. Metoda este mai puţin performantă decât transmiterea parametrilor prin tabelă de adrese. In procedură se descrie structura zonei de parametrii prin adresa lor relativa in zonă cu directiva 45 . sfarsit segment end start .buf[si+1] . iesire din procedura sortare endp .. deoarece el este ultimul parametru. deoarece toţi parametrii trebuie grupaţi în zona de memorie ( nu pot fi dispersaţi în program). In subprogram se descrie structura zonei de memorie ce conţine parametrii.'$' ..inserarea $ dupa sirul sortat ret . se inverseaza mov buf[si]. lungime sir mov bh.marcarea unei inversari cont: inc si loop next . Zona de memorie pentru parametrii se alocă în programul principal şi trebuie să fie un spaţiu continuu în care să se memoreze toţi parametrii. Structura zonei este cea cerută la definirea procedurii care implementează algoritmul de calcul.4.0 mov buf[bx+2].1 si salt daca cx > 0 . din programul principal se va încărca într-un registru (ex. Transmiterea parametrilor printr-o zonă de memorie In cele mai multe cazuri trebuie transmişi spre subprograme un număr mare de parametrii şi numai pot fi folosite registrele care sunt într-un număr foarte mic. cx = cx .sfarsit procedura cod ends . dar el poate avea oricâte.al mov dx. La chemarea procedurii in se încarcă în BX adresa zonei de memorie care conţine parametrii. Atunci se foloseşte transmisia parametrilor printr-o zonă de memorie. pregatire urmatoarea trecere cmp dx. Dacă se utilizează mai multe tablouri trebuie stabilite dimensiuni maxime pentru fiecare tablou.xchg al..1 . care vor fi apelaţi indirect prin registru (BX).. La chemarea subprogramului adresa zonei de parametrii. adresa de lansare si sfarsit program * ========================================= 6..BX).. Pentru exemplificare se consideră un subprogram care calculează media elementelor unui tablou de N numere întregi cu semn.buf[1] .

CODE st1: mov ax.-92.offset s . Adrese in zona de parametrii s1 equ 0 . Tabloul de elemente pusha . X1 vor fi folosite în procedură pentru referirea indirectă prin BX a parametrilor. nr.i=1 mov word ptr [bx+s1].[bx+x1+si] .83. -------------------------------------DOSSEG . s=s+x[i] 46 .-424. valoarea medie s-a memorat in S de catre procedura . din tabloul x x dw 1.0 .STACK 256 . Mnemonicele S1. x[i] .DATA s dw 0 .0 . Parametrii spre subpr. Suma rezultata n1 equ 2 . --------------------------------------Lab7_0 . Adresarea lui S pentru iniţializare se face prin: mov word ptr [bx+s1].53 . salvare registre mov si. N1.ax . s=0 Trebuie folosit word ptr fiindcă nu se utilizează registru şi trebuie precizată lungimea operanzilor folosiţi.286C .0 . s = media n dw 5 .ax mov bx. Procedura calcul medie elemente tablou . ----------------------------------------. ----------------------------------------sp1 PROC near .[bx+x1+si] . adresa zona parametrii call sp1 . elem.@DATA mov ds. Pentru a referi un element de tablou direct în programul principal se foloseşte şi indexarea cu SI: c1: mov ax. numar de elemente x1 equ 4 . Calcul medie elemente tablou X . Adresa BX + s1 este echivalentă cu BX +0. x[i] add [bx+s1]. Intrare: BX adresa zona parametri .EQU.[bx+n1] . s = 0 mov cx.MODEL SMALL . transmisi prin zona de memorie . numar elemente c1: mov ax. chemare subprogram int 3 .

definire structura data zi db 0 . sfarsit definire structura Pentru variabilele din structură nu se rezervă spaţiu de memorie. AX = suma elemente .5. Putem defini tipul compus dată pe 4 octeţi format din zi. ca în cazul utilizării directivei EQU.extindere pentru impartire word ptr [bx+n1] . definire tablou virtual pentru care nu se aloca spatiu ENDS . nume_struc STRUC --------------nume_struc ENDS . O structură de date defineşte un tip ca o colecţie de una sau mai multe variabile. Definire şi utilizare structuri de date Definirea structurii unei zone de memorie se poate face cu directiva STRUC. memorare medie . care compun structura Variabilele dintr-o structură pot fi declarate cu sau fără valori iniţiale.ax . date STRUC . luna anul dw 0 .sp1 add loop mov cwd idiv mov popa ret endp end si. de tipuri diferite. definire machetă pentru structura zonei DW ? DW ? DW 50 dup (?) . lună. i=i+1 . care creează o machetă şi ataşează fiecărei etichete o adresa relativă la începutul zonei. an. nu trebuie să ne preocupe ce adrese se generează. Valorile iniţiale sunt cele implicite care servesc la generarea unei zone cu acea structură. Definirea echivalentă pentru zona de parametrii din procedura anterioară se poate face: Zona S1 N1 X1 STRUC .2 c1 ax. refacere registre st1 6. grupate sub un singur nume pentru utilizare. Folosind acest mod de definire pentru o structura nu trebuie să calculăm poziţiile parametrilor în zonă. anul date ENDS Putem defini o variabilă structurată de tip date şi cu valori ale câmpurilor: 47 . definiţie variabile formale . Directiva DW este utilizată numai pentru a preciza lungimile operanzilor şi a calcula adresele relative ataşate etichetelor. s = s/n media [bx+s1].[bx+s1] . ziua luna db 0 . Dacă adăugăm noi parametrii sau le modificăm lungimea.

Vom concepe un program care utilizează o procedură de calcul a mediei numerelor pozitive şi cele negative dintr-un tablou de numere întregi cu semn. se încarcă 1978 MOV AL. zi luna. 15 februarie 1978 Vom declara structura STUDENT care conţine date personale: Student STRUC Nume db 15 dup(20H) . Transmisia parametrilor spre subprograme prin stivă Toate limbajele de nivel înalt folosesc transmiterea parametrilor prin stivă. varsta Datan db 0. an Cods db 5 dup(0) .9. Cu aceste precizări structura stivei văzută de procedură va fi: SP -16 -14 -12 -10 -8 -6 Stiva procedurii Suma pozitive Nr.K1.Cods Valorile câmpurilor dintr-o structură pot fi referite în instrucţiunile programului: MOV BX. In procedură trebuie definită structura datelor din stiva.Varsta .1978> .varsta.Anul . nume.an.grupa.sectie.nr Student ENDS Pentru a genera datele personale pentru un student vom scrie: Radu <’Radu’.15. care este un caz particular de transmitere a parametrilor printr-o zonă de memorie.D1 date <15. BX.0.K2) • Se vor salva în stivă registrele BP. cod student fac. care se va folosi la adresarea parametrilor şi variabilelor locale.elemente negative S1 K1 S2 K2 CX 48 .elemente pozitive Suma negative Nr.se încarcă ARAD 6. se încarcă 25 MOV DX.0 . adresa (implicit Timisoara) Varsta db 18 . FLAGS şi CX. • Parametrii de intrare vor fi adresa tabloului (atx) şi numărul de elemente (nv) • Parametrii de ieşire sunt media elementelor pozitive MP şi negative MN • Variabile locale suma si numărul elementelor pozitive şi negative(S1.D1.’AC34F’> .6.Radu. In stivă procedura va găsi mai multe tipuri de date: • Parametrii subprogramului transmişi de programul principal • Adresa de revenire în programul principal (după CALL) .S2.25.Adresa .adresa.75.valoare lui IP şi CS • Registrele salvate de procedură • Variabilele locale ale procedurii • Stiva procedurii. nume student Adresa db ’ Timisoara ’ .2.’Arad. care poate şi ea sa cheme subprograme Pentru orice procedură se începe cu proiectarea structurii stivei şi definirea ei printr-o structură de date. offset Radu.datan.

.pozitive MN dw 0 .-4 FLAGS Registre salvate -2 BX BP +0 BP BP registru de bază adresare stivă +2 IP Adresa instrucţiunii următoare +4 CS Adresa segment +6 Adresa tablou MP Adresa tabel (medie pozitive) +8 N MN Nr elemente (medie negative) In programul principal s-au pus în stiva adresa tabloului X şi N numărul de elemente. Transmiterea parametrilor prin stiva . • Se salvează registrele şi se memorează SP în BP. virful stivei SSTIVA ends . si negative dintr-un tablou X .S2. ----------------------------------------NAME MEDIA1 SSTIVA segment 'stack' dw 100 dup (?) stiva equ $ .segment date . • Se alocă spaţiu în stivă pentru cele 4 variabile locale (S1.-----------------SDATA segment MP dw 0 . In procedură se fac secvenţele de operaţii. La revenirea în programul principal trebuie ca stiva să fie goală adică sa aibă aceeaşi poziţie ca la apelul procedurii. medie elemente .K1.-----------------. care va deveni referinţa pentru adresarea elementelor din stivă.K2) prin decrementarea cu 4*2=8 a lui SP • Registrul SP va adresa în continuare stiva procedurii • Se defineşte structura Z şi adresele variabilelor locale faţă de BP • Se iniţializează variabilele locale • Se calculează printr-un ciclu suma elementelor pozitiveS1. a celor negative S2 şi numărul lor k1 respectiv k2 • Se calculează media elementelor pozitive peste adresă tablou(ATX) şi negative peste N • Se eliberează spaţiul ocupat de variabilele locale prin incrementarea lui SP cu 8 • Se refac registrele salvate • Se revine în programul principal cu RET care încarcă din stivă IP şi CS Dacă la revenirea din procedură mai rămân parametrii reziduali în stivă se utilizează RET N unde N este valoarea cu care se incrementează SP. Se apelează subprogramul prin CALL far ptr care pune în stiva CS şi IP. La revenirea din procedură se iau din stivă rezultatele MP(medie elemente pozitive) şi MN (medie elemente negative).negative N dw 10 . Subprogram calcul medie elemente pozitive . numar elemente tabel X 49 . -----------------------------------------Lab8_1 . .

17. Zona variabile locale s1 equ -14 .-6.adresa tablou push ax call far ptr medie .SSTIVA mov ss. -------------.ds:SDATA.-12. chemare subprogram .------------------------SPR segment assume cs:SPR.------------------------. -------------. si negative dintr-un tablou X . rezultatele s-au depus in stiva peste parametrii de intrare pop MP . Structura stiva relativ la adr. reg bp baza in stiva push bx .X dw 15.negative int 3 .pozitive pop MN . .8 . -----------------.0.ax mov ax. salvare reg BP mov bp.offset stiva . alocare spatiu variabile locale .segment program principal . de baza din BP .elemente mov ax.-1.ss:SSTIVA st1: mov ax. Corp procedura .ax mov sp. -----------------------------------------MEDIE proc far . depune in stiva . Subprogram calcul medie elemente pozitive .offset X . initializare registre segment mov ds.-7. -----------------push N . -----------------------------------------.1 SDATA ends . suma elemente pozitive k1 equ -12 . Pregatire stiva push bp .sp . salvare registre pushf push cx sub sp. .nr.19. . contor elemente pozitive 50 .18.SDATA . extrage medie elem. Chemare subprogram .

element X(I) or ax.principal atx dw ? . contor elemente negative z struc .ax .ax . initializari mov si. reg IP . Secventa calcul medii mov ax.ax mov [bp+s2].ax .word ptr [bx+si] . suma elemente negative k2 equ -8 . CS . S2 = S2/K2 mov [bp+8].ax .ax .2 . K1 = K1 + 1 jmp short c2 minus: add word ptr [bp+s2]. adresa tabel X nv dw ? . descriere structura parametrii bpv dw ? .word ptr [bp+atx] . BX adresa tablou X mov ax. S2 = S2 + X(I) inc word ptr [bp+k2] . reg BP vechi ipv dw ? .0 .word ptr [bp+nv] . urmatorul element din tabel loop c1 . de elemente tablou X z ends .--------------. Ciclu de calcul sume elemente pozitive si negative c1: mov ax.ax . nr. pozitionare indicatori jl minus .ax .adresa de revenire csv dw ? .word ptr[bp+s1] cwd idiv word ptr [bp+k1] .s2 equ -10 . initializare variabile mov cx.adresa segment prog. X(I) < 0 add word ptr [bp+s1]. memorare medie negative . ------------. memorare medie in stiva mov ax.ax mov [bp+k2].secventa iesire 51 . index adresare in X mov [bp+s1]. variabile locale mov [bp+k1].0 . K2 = K2 + 1 c2: add si. S1 = S1/K1 mov [bp+6]. contor cicluri mov bx.[bp+s2] cwd idiv word ptr [bp+k2] . S1 = S1 + X(I) inc word ptr [bp+k1] .

care este condiţia de ieşire din ciclul recursiv Se scrie programul principal. In procedură se decrementează AX şi se cheamă recursiv procedura Fact.. Există aplicaţii care pot fi rezolvate prin algoritmi iterativi sau/şi algoritmi iterativi. Subprograme recursive Subprogramele normale pot apela alte subprograme. Subprogramele recursive permit ca în secvenţa de definiţie (sau în subprogramele apelate) să se apeleze pe ele însele. fie direct. ---------------------------------------------------52 . iar procedura Fact va returna în AX rezultatul N!.--------------add sp. eliberare spatiu variabile locale pop cx . S-a făcut o exemplificare grafică a algoritmului pentru N=5. Apelul se face înainte de a se termina procedura. La apelarea subprogramului nu ne interesează ce tip de algoritm se utilizează.. Prin RET se revine la C3 unde se calculează BX=I+1=3 şi AX=I*2!=3! Prin RET se revine la C3 unde se calculează BX=I+1=4 şi AX=I*3!=4! Prin RET se revine la C3 unde se calculează BX=I+1=5 şi AX=I*4!=5! Prin următorul RET se revine la C2 în programul principal şi AX=5! . Prin RET se revine la adresa din vârful stivei C3 unde se face BX=I+1=2 şi se calculează 2!. dar nu se pot apela pe ele însele.N Definiţia recursivă se bazează pe valoarea funcţiilor anterioare care nu sunt cunoscute N! = N*(N-1)! cunoscând că 1! =1. fie indirect prin alte subprograme pe care le apelează. • Definiţia iterativă este un ciclu de N înmulţiri: N! = 1*2*3*4*5*6*. care transmite în AX valoarea lui N. La fiecare Call de procedură se pune în stivă adresa de revenire C3.. Ne interesează ca rezultatul obţinut să fie corect. La intrarea în procedură vom găsi în stivă adresa de revenire notată C2. Când AX=1 se sare la eticheta C1 unde se initializează AX=1!=1 şi BX=I=1.. Funcţia factorial are atât o definiţie iterativă cât şi una recursivă..... ----------------------------------------6. refacere registre salvate popf pop bx pop bp ret . iesire din subprogram MEDIE endp .7.*N Algoritmul iterativ ce poate fi folosit este: F=1 F=F * I pentru I=1.8 . rezultatele MP si MN in stiva SPR ends end st1 .

initializare registre segment mov ds.ax mov ax. chemare subprogram recursiv N! c2: mov f1.ax . N=N+1 1| imul bx .ss:stiva st1: mov ax. N!=N*(N-1)! 2 | ret . revenire 3| c1: mov ax. Intrare AX=N Iesire AX=N! .1 . segment de stiva dw 256 dup(?) top equ $ stiva ends end st1 Stiva C3 C3 C3 C3 C2 BX 1 2 3 4 5 AX 1! 2! 3! 4! 5! 53 . terminare program .4c00h int 21h .ax mov sp. Program recursiv pentru calcul factorial .----------------------------------------------------Pfact Segment 'code' assume cs:pfact. F1= N! memorare rezultat din AX .1 .ds:sdate. AX=N pregatire apel subprogram call Fact .sdate . segment de date f1 dw 0 n dw 5 Sdate ends stiva Segment 'stack' .n . int 3 mov ax. N=1 si 1!=1 N| call Fact . 1!=1 4| mov bx. revenire Fact endp Pfact ends Sdate Segment 'data' . apel recursiv | c3: inc bx .stiva mov ss.offset top . initializare stiva mov ax. N=1 SP 5 | ret .. Procedura recursiva calcul N! Fact Proc near | dec ax | jz c1 .

fără a modifica programul principal. Programul poate fi memorat într-o memorie de tip ROM (Read Only Memory). care la rândul lui poate fi întrerupt. Subprograme reentrante Subprogramele reentrante conţin cod pur care nu se modifică în timpul rulării: • Instrucţiuni • Constante. fiindcă el face un salt la o adresă din vârful stivei. N=1 si 1!=1 . 2.8. apel recursive . Pe perioada întreruperii poate fi folosit de un alt utilizator.N=N+1 . N=N-1 . mesaje sau tabele Nu se acceptă ca un subprogram reentrant să conţină variabile care îşi modifică valoarea în timpul prelucrării. Subprogramul reentrant poate fi folosit simultan de mai mulţi utilizatori. atunci procedura PFACT se modifică. 3.Dacă se transmite prin stivă şi valoarea lui N la fiecare apel recursiv. 6. El poate fi întrerupt înainte de a se termina (aşteptări de date sau întreruperi de timp).N! = N*(N-1) ! Se observă că deşi există un singur RET efectul lui este diferit.1 GATA AX AX FACT BX BX . 54 . In acest caz evoluţia stivei este cea din figura următoare. Starea lui nu depinde de „instoria sa”. care depinde de structura stivei. Principalele caracteristici ale programelor reentrante sunt: 1. N 1 2 Stiva AX 1!=1 2!=2*1! 3!=3*2! 4!=4*3! 5!=5*5! SP C3 2 C3 3 3 C3 4 4 C3 5 N=5 Adresa C2 FACT C3: GATA : FACT PROC CMP JZ PUSH DEC CALL POP IMUL RET ENDP AX. Este o succesiune de adrese de revenire şi de valori ale lui N la chemarea procedurii.

Un program întrerupt continuă la relansare din punctul din care a fost întrerupt. Zona de lucru activă se specifică printr-un registru de segment care se încarcă la activarea unui utilizator. 9. 5. dar cu aceeaşi structură. Fiecare utilizator are o zonă de date proprie de 10 linii x 40 caractere. La fiecare întrerupere de program starea programului întrerupt se memorează în zona de lucru a utilizatorului care a fost activ (registre. 8. La activarea unui nou utilizator se va încărca din zona sa de lucru starea programului şi se va continua din punctul în care a fost întrerupt. Fiecare utilizator va avea propria zonă de memorie care are aceeaşi structură pentru toţi.4. 7. CS Program reentrant ----------------------. Programul va lucra pe o structură de date virtuală declarată cu STRUC. Prima adresă liberă din text unde se va scrie următoarea linie este dată în al 2-lea cuvînt al zonei (N*40). Structură Zonă 0 Număr linii introduse 2 Index prima linie liberă în zona 4 Linie 1 44 Linie 2 84 Linie 3 -------- 55 . In figura următoare se prezintă schematic modul de structurare a datelor la un program reentrant. Flag-uri). 6.cod pur ------------ DS Zona date user1 N S X--------------Stare registre DS Zona date user2 ----------------------------Zona date user3 ------------------------ Program reentrant pentru introducere şi afişare texte pe linii Considerăm mai mulţi utilizatori care lucrează simultan de la 3 console şi introduc fiecare câte un text şi pot fi întrerupţi după fiecare rând introdus. Indexarea liniilor de text se face cu DI. în care sunt memorate toate variabilele din program pentru acel utilizator. care se aplică peste zona utilizatorului activ. Numărul de linii N introduse de fiecare utilizator este diferit şi se tine la începutul zonei. IP.

REENTR * Program reentrant de introducere si afisare texte (Lab8) .z2. lung=40 caractere .nr terminal . segment de date . Pentru a putea calcula adresa fiecărei zone.adresa zona . care se va încărca în registru BX.ax . segment stiva dw 100 top equ $ . buf+3 c-da A-afisare. structura buf NA .z3 .2 (număr user) CDA – Comanda introdusă care poate fi A – afişare text introdus Text – linie text de maxim 40 carctere I – introducere linie de text S – Stop oprire lucru pentru utilizatorul curent Structură liniei de la consolă BUF NA NR NRT CMD Linie text (max 40 caractere) Comanda (A-afişare. adrese zone de date utilizator (far) .stop) Număr terminal (nr user) Număr caractere recepţionate Număr caractere aşteptate Deoarece liniile introduse sunt de lungime variabilă.nr caractere asteptate . care pune după ultimul caracter din fiecare linie semnul $.buf+2 bl.0 bl.I-introducere.nr terminal .Deoarece folosim pentru simulare consola unui singur calculator vom stabili structura liniei de text care va conţine: NA – Număr de caractere aşteptate NR – Număr de caractere recepţionate NRT – Numar terminal 0. buf+1 NR .NT*4 .z2. S-stop . buf+4 linie text.S. I-introducere. ---------------------------------------------------------------------- .1. tz ----- dd mov mov and shl lds mov z1. Pentru afişarea acestor linii s-a utilizat o macroinstrucţiune de afişare AFIS.0fh bx. virful stivei stiva ENDS Sd1 SEGMENT tz dd z1.tz[bx] bx. trebuie păstrată lungimea lor în zona de lucru. adrese zone de date utilizator (far) 56 .286 stiva SEGMENT stack .nr caractere receptionate .2 ax. s-a generat o tabelă de adrese zone TZ.z3 bh. ----------------------------------------------------------------. De aici adresa zonei se ia indexat cu numărul terminalului. pentru ca restul de caractere până la 40 să nu se afişeze. buf+2 TR .

Segment de code prr SEGMENT 'code' assume cs:prr.13 buf db 40.stiva mov ss.c-da (A.ss:stiva . zona date 2 z3 dw 0.4 db 400 dup(0) .nr linii si index db 400 dup(0) . afisare text cu lung pe octet 1 si urmat de CR.afisare int 21h popa ENDM .CR si LF mov buf1[si+3].0 mov al. st1 label far mov ax. zona date 3 Sd1 ENDS Z n index tx Z STRUC . bufer receptie z1 dw 0.'$' mov dx.13.13.nr linii introduse dw 0 .text '.'Introduceti nr utiliz.ax mov word ptr buf1[si+1].45 DUP(0).ax mov es.'$' .es:sd1.9 .inceput text mov ah.offset top 57 .LF afis MACRO buf1 pusha mov ah.4 db 400 dup(0) .'$' db 10.I).ds:sd1.lungime mov si.4 .10.ax mov ax.linii de text ENDS .0a0dh .sd1 mov ds.offset buf1+1 .0.index linie libera dw 40*10 dup(?) . max 10 linii*40 caractere z2 dw 0.buf1 .structura zona date utilizator dw 0 .mes db 10.ax mov sp.

lungime mov di. afisare text zona selectata jnz c1 .transfer rind in zona inc [bx+n] .2 .bx . SI=adresa zona add si.[bx+n] .buf+1 . mutare rind in bufer afis buf+1 .dialog .Terminare prin S la dialog 58 .4ch .4 .adresa zona mov bx.[bx+index] .nr linii text mov si.0 mov bl.se memoreaza si lungimea mov bh.afisare sir cu lung pe octet 1 dec dx .0 mov cl.inceput zona add di.tz[bx] .contor linii jnz c4 .10 int 21h cmp buf+3.asteptare mesaj mov ah.nr inregistrari in zona add [bx+index]. sfarsit program int 21h c2: mov ch.terminat jnz c2 mov ah.offset mes . Introducere rind text mov di.nr caractere receptionate inc cx .introducere jnz c3 .afisare rind urmator jmp c1 .nr terminal and bl.bx .index rind curent in zona jmp c1 c3: cmp buf+3. adresa rind in bufer cu lung rep movsb .prima linie c4: mov cx.9 mov dx.c1: mov ah.NT*4 lds ax.'a' .'s' .adresa rind liber mov si.offset buf+1 .offset buf.ax cmp buf+3.0fh shl bx.afisare mesaj int 21h mov dx.40 .offset buf+1 .buf+2 .40 . adresa rind curent rep movsb .'i' . Afisare text introdus mov dx.

cod funcţie revenire în DOS INT 21H Funcţiile de intrare ieşire referitoare la dialogul cu operatorul sunt: 01H 02H 03H 04H 05H 06H Citire de la tastatură un caracter ASCII cu ecou în registrul AL. sau Windows Commander. Se pot construi aplicaţii care utilizează comenzile DOS în programe.1.par2 21H .cod_funcţie reg1. Trimite din DL un caracter ASCII spre portul serial AUX. Afişare un caracter ASCII din registru DL pe monitor. Din această categorie face parte şi Norton Commander.1bit de Stop. codul funcţiei DOS se încarcă în registrul AH . apel funcţie (subprogram) prin întrerupere 21H Intreruperea 21H serveşte la apelarea a zeci de funcţii indicate prin codul funcţiei ce se încarcă în registrul AH. care se apelează prin întreruperi. Oprire program cu revenire în DOS se realizează cu funcţia care are codul 4CH MOV AH.par1 reg2. Funcţii DOS de intrare/ieşire Funcţiile DOS sunt un caz particular de subprograme existente în sistemul de operare DOS.prr ENDS END ST1 7. Intrare ieşire directă fără ecou serveşte la transmiterea caracterelor funcţionale(CTRL+) Dacă DL=FFH aşteaptă un caracter în AL de la tastatură Z=1 dacă nu s-a tastat caracter şi se aşteaptă Z=0 dacă s-a apăsat o tastă caracterul se găseşte în AL AL=0 indică recepţia unui caracter funcţional a cărui cod se citeşte prin următoarea c-dă Dacă DL#FFH se afişează caracterul din DL 59 . Oricare comandă DOS are o funcţie corespondentă care poate fi apelată din programe scrise în limbaj de asamblare. MACROINSTRUCTIUNI 7. Citire în AL un caracter de la intrarea AUX. Apelul funcţiilor DOS este independent de Versiunea sistemului de operare. Tipăreşte din DL un caracter ASCII la imprimantă. care este în mod normal portul de comunicaţii seriale COM1 (2400 bauds.4CH . fără paritate . Apelarea unei funcţii DOS de intrarea ieşire se face printr-o secvenţă de forma: MOV MOV MOV INT AH. Fiecare funcţie necesită un număr de parametrii care se încarcă în registre. pregătire parametrii în registre . Transmiterea parametrilor se face prin registre sau prin zonă de memorie. 8 biţi de date). Ecou înseamnă afişare caracter tastat şi pe pe ecran.

Pentru caractere funcţionale se poziţionează C=1.ora (0.12) DL – ziua (1. ESC şi caracterele însoţite de CTRL (Controle) şi ALT (Alternate). Prin program trebuie testat dacă s-a apăsat o tastă lucru indicat prin Z=0. apel 2 care dă codul caracterului în AL . Citire caractere funcţionale In aplicaţiile actuale ( editoare de texte. CL – minutul. cod funcţie citire afişare fara ecou .număr de caractere recepţionate până la ENTER AL – ziua în săptămână (0 duminică.. DH – luna. 02H). Del. Pentru funcţia 06H nu se aşteaptă apăsarea unei taste. DH secunda.2. pentru a putea să fie tratat caracterul ca funcţional în programul care a apelat procedura ReadF PROC far C1: MOV AH. PageDown... PageUp. nu este caracter funcţional . Home.) CX – anul ( 1980-2098) DH – luna (1.. CL – minutul.End. săgeţile.AL JNZ C2 INT 21H STC C2: RET CARF ENDP . Z=1 ciclu de asteptare nu s-a apasat tasta . 0AH.ora.07H Citire directă în AL de la tastatură fără ecou (nu verifică CTR/BRK) 09H Afişare la consolă şirul de caractere terminat cu $ indicat în registrul DX 0AH Citire de la tastatură un şir de caractere cu ecou terminat cu ENTER. 1 luni. Prezentăm mai jos o procedură care poate citi de la tastatură şi caractere funcţionale. 01H.. programe de grafică. DL – Sutime secundă 2DH Setare ora în calculator CH .F12. test dacă AL =00H şi C=0 .31) CX..0FFH INT 21H JZ C1 OR AL. apel DOS . Din această categorie fac parte tastele funcţionale F1. Shift +Fi. La recepţia unui caracter funcţional AL=00 şi trebuie apelată încă odată funcţia DOS (INT 21H) când se primeşte codul caracterului ce se va interpreta prin program ca un caracter funcţional.Coded Keyboard Data) . la adresa din DX.. DL – Sutime secundă 7. DH secunda.număr de caractere maxim aşteptate (dacă se introduc mai multe de NA-1 se ignoră) . DX NA NA NR NR Text ..6 MOV DL.. DL – ziua 2AH Obţinerea datei curente 2BH Setare dată în calculator 2CH Obţinere ora curentă CH . funcţie citire tastă in AL . Codurile acestor caractere se suprapun peste codurile caracterelor ASCII uzuale.23).. programe de baze de date. Numărul acestor coduri este foarte mare şi pentru citirea lor în registrul AL fără a fi filtrate se utilizează funcţia 06H din DOS şi se setează DL=0FFH.. care sunt filtrate de către funcţiile DOS de citire şi afişare şir de carctere (09H. poziţionare C=1 pentru a indica programului caracter functional 60 ..anul.) se folosesc foarte des caractere funcţionale( Extended ASCII. Cât timp Z=1 se aşteaptă prin ciclu de apel.

.. eticheta secventa analiza caracter functional ..AL . caracter ASCII uzual memorat intr-o zona de text .. chemare procedura citeste un caracter (inclusiv functional) .... . continuare program 61 ..CALL ReadF JC Funct MOV Text1[SI]..

62 .

9 INT 21H 63 ..7. Exemplul 1... AFIS MACRO mesaj .offset mesaj . specificând parametrii efectivi care vor înlocui în secvenţa de program generată parametrii formali... definire macroinstrucţiune AFIS MOV DX. Secvenţă de program care utilizează parametrii formali . sfârşit secvenţa de definiţie Utilizare macroinstrucţiune AFIS în program pentru afişare text : AFIS text1 . afişare şir de la adresa text1 In program unde s-a utilizat macroinstrucţiune se va genera secvenţa: MOV DX.. în cadrul programului. Definirea unei macroinstrucţiuni se face ca pentru un subprogram din limbajele de programare de nivel înalt specificând: • numele macroinstrucţiunii prin eticheta directivei MACRO • lista de parametrii formali utilizaţi • secvenţă de instrucţiuni care definesc algoritmul pe baza parametrilor formali.... sfârşit secvenţă de program de definiţie Utilizarea unei macroinstrucţiuni definite se face ca pentru o instrucţiune... Macroinstrucţiunile permit o programare modulară simplă prin: • Extinderea setului de instrucţiuni recunoscute de Asamblor • Simplificarea scrierii secvenţelor de cod utilizate repetat. adresă text de afişat terminat cu ’$’ MOV AH. lista de parametrii formali LOCAL etich1. Definire macroinstrucţiuni Macroinstrucţiunile sunt secvenţe de instrucţiuni definite ca machetă pe baza unor parametrii formali prin directiva MACRO.. listă de etichete locale .9 . Nume_macro par1..3. Utilizarea unei macroinstrucţiuni se face ca şi pentru o instrucţiune cablată. prin înlocuirea lor cu macroinstrucţiuni. apel funcţia de afişare ENDM . ai variabilelor şi constantelor din program • sfârşitul unei macroinstrucţiuni se specifică prin directiva ENDM • etichetele din secvenţa de instrucţiuni cu directiva LOCAL nume_macro MACRO param1.. • Simplificarea apelului funcţiilor sistem prin definirea lor ca macroinstrucţiuni • Apelul simplu al subprogramelor. Afişare şir de caractere prin apel funcţie DOS definită ca macroinstrucţiune..offset text1 MOV AH. prin înlocuirea secvenţelor de apel şi pregătirea parametrilor cu macroinstrucţiuni. ...param2.etich2...... .. . cod funcţie DOS INT 21H ... Definirea macroinstrucţiunii trebuie făcută înainte de utilizare.. ENDM .par2.

Y. folosind elemente de timp din momentul generării şi vor fi unice în program. zecimal de la adresa zec în binar la adresa bin MOV BX. pentru care se vor definii proceduri. Pentru cazul unei aplicaţii cu algoritmi mai complecşi se va folosi programarea modulară: • Se vor analiza funcţiile ce trebuie realizate.n .Y ..AX=(X+Y)/2 MOV Z.1 . Etichetele definite cu directiva LOCAL vor fi modificate la fiecare utilizare a MACRO. Macroinstrucţiuni şi subprograme.4. Dacă avem etichete în definirea MACRO acestea nu pot fi folosite direct. Nu se vor defini macroinstrucţiuni pentru algoritmi care se realizează cu un număr mai mare de instrucţiuni (conversii. salt la eticheta locala care va fi modificata la compilare E2 LABEL near . La fiecare utilizare se generează secvenţa de program din definirea MACRO. este similară unei instrucţiuni cablate Etichetele locale din MACRO se definesc prin directiva LOCAL.5. definire etichete locale CMP X.. definire medie Z= (X+Y)/2 MOV AX. numar de cifre zecimale CALL CZB . care apelează procedura de conversie CZB definită anterior. AX=X+Y SHR AX.AX . DEC word ptr X JNZ E1 .Y LOCAL E1..n.bin .Y JZ E2 . memorare numar binar la adresa bin ENDM Pentru conversia unui număr Xzec din zecimal în binar la adresa X se va scrie: C_ZB Xzec.Z . MAC1 MACRO X.offset zec . C_ZB MACRO zec. ieşire din secvenţa de calcul E1: MOV AX.). eticheta dupa ultima instructiune din MACRO ENDM 7. 64 ..X .AX . Z=AX memorare rezultat ENDM Media C între două numere A şi B se va calcula prin: MED A.Exemplul 2. Medie aritmetică a două numere definită ca macroinstrucţiune: MED MACRO X.. adresa numar zecimal ASCII MOV CX. etc. deoarece secvenţa de program se generează de mai multe ori şi etichetele se duplică. înmulţire de matrici. Macroinstrucţiunile se folosesc pentru algoritmi care se realizează prin secvenţe scurte de câteva instrucţiuni. conversie nr.C Exemplul 3.B. Conversia zecimal-binară a unui număr definită ca macroinstrucţiune. apel procedura conversiecare returneaza numar binar in AX MOV bin.E2 .X ADD AX .X .

apelează procedura şi memorează rezultatele. In cadrul programului se realizează funcţiile: • Se citesc 10 numere zecimale de la tastatură de 1. • GET citire şir de caractere de la tastatură (funcţia 0AH din DOS) şi trecere la rând nou. Apelul subprogramelor devine transparent la acest nivel şi programarea se simplifică Exemplul 4.5 cifre ( numărul de cifre în octet buf+1) • Se converteşte în binar pe 2 octeţi fiecare număr citit şi se memorează într-un tabel • La conversia zecimal binară se verifică fiecare caracter introdus dacă este cifră( 0.. care se apelează prin macroinstrucţiunile definite • Programul principal care utilizează numai macroinstrucţiuni prin care se apelează procedurile.. • Definire subprograme necesare. • SELSORT sortare tabel de N numere binare pe 2 octeţi Macroinstrucţiunile sunt definite la începutul programului şi sunt folosite în programul principal şi în proceduri: • PRINT afişare text terminat cu ’$’ (apelare funcţie 09H dinDOS). Program complex care utilizează proceduri şi macroinstrucţiuni care pregătesc parametrii pentru apelul procedurilor.9) • Se afişează tabelul nesortat • Se sortează tabelul în ordine crescătoare • Se afişează tabelul sortat convertind în zecimal fiecare număr binar în buffer Programul are următoarea structură: • Definire date într-un segment de date • Definire macroinstrucţiuni ce pregătesc parametrii şi apelează subprogramele definite sau funcţii DOS şi se folosesc în programul principal sau proceduri. • SORT sortare tabel de n numere binare pe 2 octeţi • SCRIE afişare tabel de n numere binare pe 2 octeţi după ce sunt convertite în zecimal 65 . In cadrul programului s-au definit procedurile: • CBZ şi PRINTR realizează conversie binar zecimală şi afişează numărul zecimal • DECTOBIN conversie zecimal binară . verificare că avem numai cifre şi + sau ... pe primul octet din şir) în binar.• • • Se va defini fiecare procedură pentru a specifica algoritmul folosit şi se vor stabili convenţiile de transmitere a parametrilor spre procedură. • PUTC Afişare un caracter pe monitor din DL (funcţia 02H din DOS) • CONVBIN conversie număr zecimal( lung.. Se va scrie un program principal care va utiliza macroinstrucţiuni pentru a realiza funcţiile dorite. care apelează procedura DECTOBIN şi îi transmite adresa numărului zecimal în SI şi lungimea în CX. Se va defini o macroinstrucţiune pentru fiecare procedură. care va defini secvenţa ce pregăteşte parametrii.

segment de cod program PRINT MACRO msg .cnt .2 int 21h pop ax endm CONVBIN MACRO buff .stack 256 .code . Conversie binar zecimala .cnt .8 dup(?) .'$' smsg db 'Nr. prima cifra xor ch. constanta 10 pentru conversiiBinar zecimale cr db 13.10 int 21h print cr . subpr. receptie mov ah.offset buff . buf. elemente 66 .cnt .09h int 21h endm GET MACRO buff .offset buff inc si mov cl.Citire un sir de numere . -----------------------------------------------------------------------------------dosseg .'$' inval db 'Nr.13. chemare subprogram endm SORT MACRO tab. tabel numere binare receptionate mes db 'Introduceti 10 nr..10. rind nou endm PUTC MACRO . conversie zecimal binara sir mov si. cr si lf . afisare mesaj terminat cu $ mov dx.10. sortare tabel de n elem mov si. mesaj pentru numar invalid (litera semn. segment stiva .'$ .13. nr. . Afisare elemente tabel sortat . cifre inc si .[si] . . citire sir mov dx. sortare tabel endm SCRIE MACRO tab. intregi cite unul pe linie'.Sortare tabel . nr elemente tabel call selsort .offset tab .10. sortate sunt:'. afisare caracter din DL push ax mov ah. Program care utilizeaza macroinstructii pentru chemare subprograme . invalid'.13.model small . adr.'$' bufs db 10 dup (20h).'$' .13.data buf db 7.10.ch call dectobin . buffer primire 7 cifre table dw 10 dup(?) . Memorare in tabel . Conversie zecimal binar . contor nr.10. adresa tabel intregi mov cx.) zece dw 10 .offset msg mov ah.cnt . afisare tabel n elemente intregi Local s1 mov cx.

resturile MOD 10 . rind nou ret CBZ ENDP .[bx+si] s1: 67 . In AX nr pozitiv binar.nr.adresa primul element. CX . val absoluta mov dl. cifra ASCII PUTC .si c1: dec cx jz gata push cx mov si. afisate in ordinea inversa obtinerii cwd .-----------------------------or ax. subpr. afisare cifra din dl ret PRINTR ENDP . apel recursiv pop dx .inc . Procedura sortare tabel elemente binare .offset bufs .'-' putc . de elemente . citul in AX or ax. reface restul gata1: or dl.0 .30h .tab[di] . adresa bufer conversie mov si. procedura recursiva conv bin-zec print cr . cit=0 ? jz gata1 . da push dx . bin-zec si afisare add di.0 mov dh. ---------------------------mov bx. SI . --------------------------PRINTR PROC near .7 call cbz .-----------------------------CBZ PROC near . conv. T(I)=>AX mov bx.ax . include bindec. N/10 restul in dx.in fata . pozitionare indicatori jns pos . converteste in zecimal cu + sau .0 c2: mov ax. Afiseaza un numar binar din ax dupa ce il . --------------------------SELSORT PROC near .2 loop s1 endm .ax . afisare un caracter din dl pos: call printr . index in tabel mov ax. memorare rest call printr . pregatire impartire DX=0 idiv zece . se pot copia subprogramele de conversie bin-zec si zec-bin .mov di. numar pozitiv neg ax .

cautare in sir nesortat nexte: scasw. Procedura conversie zec-binara cu semn . SI .numar cifre dec cx . n-1 cicuri lodsw . cauta urmatorul minim ret SELS ENDP .ax .-------------------------------------DECTOBIN PROC near . primul element [SI] mov di.bh xor ax. corectie contoare dec si plus: clc . df=0 lodsb .-------------------------------------SELS PROC near . ax<=[DI] xchg ax. primul caracter cmp al. N=0 68 .adresa prima cifra .adresa primul element .ax inc dh c3: add si. salvare indicatori xor bh. SI . ciclu semn cld .[bx+si+2] jl c3 xchg ax. compara ax cu[DI] jle ismin .2 loop c2 or dh. cf=0 minus: pushf .ax . CX .'+' . fara semn.'-' . semn minus stc . memorare minim pop cx loop nextp . Subprogram sortare prin selectie . ------------------------------------cld . semn plus jz plus inc cx .cmp ax. . directie stg-dr dec cx nextp: push cx .[bx+si+2] mov [bx+si].si .nr elemente .[DI-2] . CX . cf=1 jz minus cmp al. noul minim ismin: loop nexte mov [si-2].dh pop cx jz gata jmp c1 gata: ret SELSORT ENDP .

mesaj dialog mov cx. binar rezultat pop di pop cx jc cont . reface indicatori jnc pozitiv neg ax . memorare numar binar in tabel inc di inc di cont: adc cx.cwd mov bl. urmatoarea cifra popf .ax .'0' .4ch . ------------------------------------pp: mov ax. N=N*10 add ax.nu-i cifra sub bl.'9' jg nodigit .[si] . sortare tabel scrie table. asteapta un numar convbin buf .daca c=1 atunci nr citit este invalid mov table[di]. cmp bl. N=N*10+cifra inc si loop next .ax stc . numere de introdus mov di.0 .ax print mes .initializare reg segment mov ds.10 . tabel nesortat sort table. afisare tabel sortat mov ah. mesaj numar invalid popf xor ax. prima pozitie in tabel cit label near push cx push di get buf .bx . afis. setare CF=1 nr. AX nr. Program principal .30h mul zece .0 . numar negativ clc pozitiv: ret nodigit: print inval . ------------------------------------. o cifra zecimala cmp bl. stop int 21h end pp next: 69 . verificare numeric jl nodigit .10 .@data .invalid ret dectobin endp .ax mov es.10 .10 .err. neglijare numar eronat loop cit scrie table.

= 1. Poziţionarea blocului capetelor de citire pe un cilindru este realizată automat de electronica de pe disc şi de interfaţa cu discul. 70 . Pistele de pe aceeaşi verticală formează un cilindru. ce au ambele feţe active şi au un sistem de capete magnetice de citire mobile. Sectoarele sunt separate de spaţii goale ’gap’ corespunzător a cca 10-12 octeţi.= Timp acces RAM 10ns -----. care pot fi ulterior regăsite şi citite în memoria centrală pentru prelucrare.44Mocteţi. Pentru a minimiza mişcările mecanice. O pistă este împarţită în sectoare. Timp acces disc ------------------.000. Un disc are funcţie de capacitate peste 10. Aceste date nu sunt persistente ele fiind pierdute la deconectarea calculatorului. Organizarea fizică a informaţiilor pe disc Floppy discul de 3 ½ inch are ambele fete active şi câte un cap de citire pentru fiecare faţă rezultând o capacitatea de 1. Informaţiile pe disc se pot memora numai ca fişiere pentru care se asigură gestiunea spaţiului de memorare şi securitatea accesului prin utilizarea funcţiilor DOS. UTILIZAREA FISIERELOR PE DISC 8.44Mo Sectoarele sunt subdivizini ale pistei pentru a putea adresa mai fin informaţia. 2 feţe x 80 piste x 18 sectoare/pistă x 512 octeţi/sector = 1.8. Pe hard/floppy disc se memorează persistent ca fişiere volumele mari de informaţii şi programele. Scrierea se face serial prin dipoli magnetici pe cercuri concentrice numite piste. Timpul de acces la informaţiile de pe disc de cca 10msec este de 1 milion de ori mai mare decât la RAM. Pista 0 Hard discul este format dintr-un pachet de 2-5 discuri de 3½ inch. câte unul pentru fiecare faţă activă.000 10ms Din acest motiv nu se recomandă utilizarea directă a informaţiilor din fişierele disc ci se citesc blocuri întregi de informaţie în RAM unde se va face prelucrarea.000 de piste. a căror număr diferă de densitatea permisă de tehnologie. Uzual se folosesc sectoare de 512 octeţi atât pentru floppy cât şi pentru hard discuri.1 Organizarea fişierelor pe disc In memoria centrală se poate memora un volum redus de date care pot fi adresate într-un timp foarte scurt de ordinul 10nsec.

728 320.086. Se foloseşte aceeaşi tehnologie.383 MaxCil Max LBA 120.816 238.297.528 240. 5200 sau 7200rot/minut.136 486. Adresa sectorului se ia la discurile actuale global fiindcă numărul de biţi alocaţi iniţial pentru cilindru este insuficient şi nu se mai poate respecta structura.383 16. This may potentially cause data loss.383 cylinders in the system BIOS.383 16:63 16:63 16:63 16:63 16:63 16.960 sectoare x 512 octeţi =40Mo • 1cilindru = 5 piste x 17 sectoare/pistă = 85sectoare x 512octeţi =42.234. Apare în acest caz o structură logică de adresare (LBA) care pentru discurile Maxtor de 80GB (LBA=160 milioane de sectoare) avem CIL=16.088 490. în timp ce numărul real de cilindrii este de 160.informaţii de sincronizare (64 biti de 1) indică început sector Cilindru – număr cilindru pe care se găseşte sectorul Cap . 3600. cilindri ) şi numărul de discuri în pachet.173.752 GB Capacity 60GB 80GB 120GB 160GB 200GB 250GB “L” in model denotes ATA/133 2 MB Transfer.000.344 HDS :SECT 16.număr sector pe pistă Syn . HEAD=16 şi SECT=63. dar capacitatea diferă funcţie de densitatea radiară (nr.000.5Ko • 1 pistă =17sectoare x 512octeţi = 8. La un moment dat este selectat un singur cap de citire.383 16. “P” .8 MB Buffer PATA = Parallel ATA MAXTOR.000 pentru un disc de 80MB.5Ko DiamondMax Plus 9 PATA MAXTOR Ultra DMA133 7200 RPM: MODEL 6Y060L0 6Y080L0 / 6Y080P0 6Y120L0 / 6Y120P0 6Y160L0 / 6Y160P0 6Y200P0 6Y250L0 / 6Y250P0 CYL 119.056 398. Discul se învârte continuu cu viteză constantă de 2400.1 octet pentru control ciclic de paritate pentru octeţii din sector Prezentăm ca exemplu un hard disc de 40Mo care mai respectă structura fizică: • 5 feţe active pe 3 discuri fizice în pachet (5 capete de citire) • 976 cilindri =82. Discul cuprinde 4 zone: 71 .103. La turaţii mai mari debitul instantaneu de octeţi transferaţi este mai mare ( de 3 ori mai mare la 7200rot faţă de 2400). Structura unui sector este: gap iiiiii Cilindru Cap Sync Adresa sector Sector iii Informaţie utilă syn 512 octeţi par Gap .121. Logic un disc este văzut în program ca o memorie cu N sectoare de 512 octeţi.com NOTE: NEVER enter more than 16.200 160.parcurgerea şi numerotarea pistelor se face pe cilindrii de sus în jos.numărul pistei de pe sector (cap de citire ce trebuie selectat) Sector .000.383 16.biţi de 1 pentru aşteptarea verificării adresei sectorului căutat Par .216 317. Cilindrii se numerotează de la exterior spre interior.spaţiu intersector ( 16 biţi de 0) Sync .383 16.632 395.150 16:63 158. Selectarea unui sector de pe pistă se face dinamic prin numărul său plasat ca informaţie de control la începutul sectorului. 160. deci o singură pistă de pe cilindru.

5-32K).clust Ch Intrarea de director a unui fişier conţine adresa primei intrări în FAT. Unele fişiere pot fi director. Tabela de alocare a discului (FAT) conţine o intrare pentru fiecare cluster de forma: Număr cluster alocat 16 sau 32 biţi Adresa urmatoare în FAT 16 biţi Nr.FAT t FAT Nr.SYS • File Alocation Table (FAT) conţine tabela de alocare discului • Root directory conţine directorul rădăcină pentru 128 fişiere disc (4K) • Zona fişiere împărţite în clustere. S-sistem. Fiecare fişier are un atribut care indică modul de acces: Atribut 00 A D V S H R A-archive. In ultimii 15 ani s-au trecut 10 bariere de capacitate. H-hide. V-etichetă volum. care specifică adresa primului cluster alocat şi următoare intrare (Ch) din FAT pentru fişier. Pentru programator un fişier este un spaţiu continuu. Exploatarea fişierelor pe disc prin FCB 72 . care au impus modificarea nucleului BIOS (Basic Input/Output System). care permite 2 miliarde de clustere.000 de capacitatea de adresare a tabelei de alocare FAT. Aceasta a dus la mărirea adresei de cluster din FAT la 32 biţi. La crearea unui fişier i se alocă un cluster şi când acesta este plin i se alocă următorul. unde s-a găsit un cluster liber. iar la discurile mari pentru cluster=32K capacitatea de adresare este de 2GB. 8. Cluster-ul este unitatea de alocare pe disc şi poate fi de 1-64 sectoare (0.SYS şi MSDOS. care conţine intrări pe 16 biţi.2. D-subdirector.Sectorul de boot conţine programul de preîncărcare în RAM a nucleului DOS format din fişierele sistem IO. care se adresează relativ la începutul fişierului. Pentru discul curent se ţine în memorie în 2 exemplare tabela de alocare FAT. R-Read-only Spaţiul pentru un fişier este discontinuu pe disc. La floppy disc alocarea se face la nivel de sector (cluster=512oct).cluster=00 liber FFFF pt cluster defect 28 Lung fis • Directorul rădăcină conţine 128 intrări de 32 octeţi de forma: 0 8 11 12 22 24 26 Nume fişier Ex Atrib Neutiliz timp data Intr. Numărul total de clustere este limitat la 64. fiind format din clustere plasate în diferite zone ale discului. La ştergerea unui fişier clusterele alocate se eliberează pentru a fi realocate.

Sistemul de operare DOS asigură gestiunea şi securitatea informaţiilor pe disc ca fişiere (inclusiv sistem). Adresarea se face la nivel de înregistrare. care au concepte diferite şi funcţii specifice. Când se specifică adresa unui sector ce trebuie citit din fişier (relativ la începutul fişierului). care face referire la un FCB din sistem şi permite adresarea fişierului la nivel de octet relativ la începutul fişierului.Deschide fişier existent în directorul curent cu numele din FCB dat de DX..asm). . dar aceeaşi organizare fizică: • Utilizare FCB pentru comunicare cu sistemul şi se citesc/scriu înregistrări de lungime dată. inreg. disc fişier t inreg fişier p in bloc acc direct Pentru FCB s-ar putea declara o structură de date de forma: FCB SRUC Drive db 0 Fnume db 8 dup (20h) Fext db 3 dup (20h) Lrec dw 80 Lfis dd 0 Fdate dw 0 Ftime dw 0 Frez db 8 dup(0) Fnrc db 0 Frand dd 0 FCB ENDS . rezervat . extensie nume . Parametrii necesari se transmit prin registre sau printr-o zonă de memorie pentru dialog ataşată fişierului numită FCB (File Control Bloc). 0EH 0FH 10H 11H 12H . .1-B. lungime înregistrare . Se citeşte directorul rădăcină şi FAT în memoria RAM.Inchide fişier indicat de FCB-ul indicat de DX.Selectare disc a cărei adresă este în DL (0-A. Inaintea apelării unei funcţii DOS se va încărca în DS:DX adresa FCB fişier utilizat. scrierea. ştergerea.*. ora de creare . data de creare .inreg Nr. .. cod disc utilizat .Căutare următorul fişier cu nume generic indicat în FCB. .). După executarea unei funcţii DOS A=00 indică operaţie reuşită. Pentru crearea. nume fişier . 73 . Există 2 modalităţi de exploatare a fişierelor. • Utilizare indicator logic (handle).bloc Lung Lung Data Tim rez Nr.Căutare primul fişier cu numele generic dat în FCB (ex. lungime fisier . număr articol curent în bloc . citirea şi actualizarea fişierelor există funcţii DOS care se apelează din program prin INT 21H. din FAT se stabileşte rapid numărul clusterului care îl conţine şi rezultă numărul sectorului fizic în care se găseşte. Exploatarea cu FCB presupune declararea unui FCB pentru fiecare fişier utilizat. Structura FCB cuprinde pe 36 octeţi informaţii furnizate de program şi informaţii returnate de sistem după executarea unei operaţii (funcţii): DS:DX 0 1 9 12 14 16 20 22 24 32 33 Cod Nume Ex Nr. numar inregistrare in acces direct (random) Funcţii DOS pentru exploatarea fişierelor cu FCB Orice citire de informaţie de pe disc în acces direct necesită o poziţionare pe disc pentru că FAT este păstrată în memorie. 2-C.

înreg. Exemplu de program pentru citire scriere în fişier utilizând FCB Pentru a simplifica scrierea programului se vor folosi macroinstrucţiuni pentru apelul funcţiilor DOS.20 .0. Utilizare fisiere prin fcb DS:DX contine adresa FCB .'$' . FCB fisier db 26 dup (?) er db ' Operatie eronata'.Redenumeşte fişier din FCB cu numele din octeţii FCB +17H 19H .10.0.10.10. de pe sectorul dat în FCB+33. Dacă nu există spaţiu AL=0FFH. Se trece automat de la un bloc la altul.13 .Citeşte secvenţial o înregistrare din fişierul indicat în FCB. Scrie o intrare în directorul curent.'$' . CR si LF buf db 20. La iniţializare sistem adresa DTA=80H. 21H . 15H .Scriere în acces direct din DTA cu specificare adresă sector disc în FCB+33. Extinderea fişierului se face automat dacă un cluster s-a umplut. • Modificaţi conţinutul textului din fişier şi afişaţi-l cu un editor. • Modificaţi lungimea înregistrărilor FCB+14 şi afişaţi fişierul . 22H . chiar şi cu nume generic . Octetul 32 din FCB (nr.stack 100 . de lungime precizată în octet 14 din FCB.stack 256 .'$' start db ' Dialog:'.model small . Buffer I/O FIS db 0. ********************************************** dosseg .13H 14H .13.Citire în acces direct de pe fişier. Adresa bufer este zona curentă DTA (Disc Transfer Area).13.Deschidere fişier nou cu numele dat în FCB. Se utilizeaza macro definiti si control erori . ********************************************* .10.13.'$' LFCR db 10.code eroare macro coder .13. 16H . Citire text tastatura .data b1 db 10.0.în bloc) se pune iniţial pe zero şi ulterior se incrementează automat după fiecare citire.13. 17H .Stabileşte adresa DTA (Disc Transfer Area) zonă tampon curentă dată în DX. Afisare eroare daca AL # 0 74 .80 dup(20h). Citire de pe fisier si afisare . care foloseşte macroinstrucţiunilele definite.'fisier txt'. Scrire text pe fisier . F4 din Windows Commander) şi citiţi-l cu un program.Scrie secvenţial o înregistrare din DTA în fişier de lungime dată de FCB+14 .Obţine cod disc curent în AL 1AH .Sterge fişier indicat în FCB. Scrierea pe ultimul sector din fişier se face pentru rezervare spaţiu. • Scrieţi un fişier cu un editor de texte (NotePad.

al jz gata mov ah. test eroare . cod eroare pt fiecare macro macro msg mov dx. rand nou cit .0 .9 int 21h mov dx. specificare zona tampon utilizata 75 . adresa FCB mov ah. bufer receptie open macro fcb1 .offset msg mov ah. afisare mesaj pe ecran .offset FCB1 . adresa FCB mov ah. initializare nr. din zona buf . scrie in fisier o inreg. functie DOS setare zona DTA(disc transfer area) .0fh .16h int 21 eroare 33h endm writef macro fcb1. adresa FCB . inchidere fisier mov dx. cod eroare = 1 endm close macro fcb1 .local gata or al.offset lfcr mov ah.offset buf1 mov ah.09h int 21h endm macro buf1 mov dx. citire sir de la tastatura .coder mov er.offset FCB1 mov ah.buf mov ah. adr.ah afis er gata label near endm afis .10 int 21h endm . cod functie DOS . inregistrare in bloc = 0 eroare 31h .10h int 21h eroare 32h . deschidere de fisier existent mov word ptr FCB1+14. functie DOS deschidere fisier existent int 21h mov FCB1+32. lungime inregistrare (RCS) mov dx. creare fisier nou . cod eroare = 3 . operatie corecta .20 . cod eroare = 2 endm create macro fcb1 mov dx.offset FCB1 .1ah mov dx.offset buf+2 .

afisare inregistrare loop c6 c1 : nop mov ah.inchidere fisier . din zona DTA de lungime RCS din FCB+14 .int 21h mov dx.15h int 21h eroare 34h endm .introducere rand text writef fis.scriere pe disc afis buf .offset buf+2 int 21h mov dx.ax mov es. Program principal pp: mov ax.0 mov cx. Citire text de la consolă şi scriere in fisier c5: afis start . adresa FCB .afisare dialog cit buf .30 .ax .30 .nr inreg. din fisier afis buf . RCS c6: readf fis .offset FCB1 mov ah.contor inregistrari open fis mov fis+32. deschidere fişier existent . adresa FCB mov ah. se crează la prima rulare . Secventa de citire din fişier mov cx. functie DOS scriere secventiala pe disc .=0 . cod eroare = 4 readf macro fcb1 .afisare pe disc loop c5 close fis . .0 . setare DTA mov dx.5 .5 . citire inregistrare de pe disc in zona DTA mov ah.14h int 21h endm .contor nr inregistrari . afis buf open fis mov fis+14. create fis mov fis+32.offset FCB1 .lungime inreg.lungime inregistrare RCS .citire inreg.4ch int 21h end pp 76 .adresare imediata mov fis+14.1ah .@data mov ds.buf .

La iniţializarea sistemului se alocă un număr de peste 100 de FCB-uri gestionate de sistem. EXPLOATAREA FIŞIERELOR CU INDICATOR LOGIC (HANDLE) 9. Programatorul vede fişierul ca fiind continuu. Aceasta este limita numărului de fişiere care vor putea fi deschise simultan în aplicaţii.9. specificând lungimea înregistrării şi numărul înregistrării transferate. • Exploatarea fişierelor cu indicator logic permite adresarea informaţiei la nivel de octet faţă de începutul fişierului.txt’. Există un singur mod de organizare a fişierelor pe disc. Fisier. când prin apariţia hard-disc-ului pe PC XT (10MB). In DOS V3 s-a adăugat un nou set de funcţii pentru exploatarea informaţiilor din fişiere schimbând şi principiile de lucru. specificând lungimea transferată în octeţi. Se caută fişierul în directorul specificat şi i se alocă un FCB sistem al cărui handler (pointer) se returnează în registrul AX şi se va încarcă în BX înaintea apelării altor funcţii care se referă la acel fişier. In FCB se putea specifica numai numele fişierului. sau introdus subdirectoare şi trebuia specificat numele fişierului şi calea.1.txt Adr. Numele fişierului inclusiv calea se dă într-un text ASCII de lungime variabilă terminat cu 00H definit sub forma: Fis1 DB ’C:\Prog\Laborator\PLA\Fisier1. Dacă se utilizează exploatarea cu indicator logic atunci trebuie specificată adresa primului octet citit/scris din fişier şi lungimea în octeţi a informaţiei transferate. Conceptul de indicator logic (handle) Alocarea fişierelor pe disc este discontinuă pe clustere a căror adresă se află din tabela de alocare a discului (FAT). cel prezentat la începutul capitolului şi două moduri de exploatare: • Exploatarea fişierelor cu utilizare FCB a fost prima modalitate existentă în DOS şi realizează citirea/scrierea din fişier la nivel de înregistrare. care se modifică cu funcţia de poziţionare (41H). La deschiderea fişierului adresa curentă este 0 şi se referă la începutul fişierului.0 La deschiderea fişierului se încarcă în DS:DX adresa textului care dă numele fişierului. După executarea oricărei funcţii CF=0 dacă operaţia a reuşit şi CF=1 dacă a apărut o eroare. Adresa octetului curent referit din fişier se ţine în pointerul de citire/scriere (din FCB-ul alocat). iar adresa unei informaţii se dă relativ la începutul fişierului.in fisier (Pointer cit/scr) BX=handler CX=lung in octeti 77 . Metoda a apărut în DOS V3.

Intrare AH = 3FH cod funcţie DOS de citire din fişier BX = indicator logic fişier referit (handle) DS:DX =adresă zonă de memorie (buffer) CX =număr de octeţi transferaţi (lungime) Ieşire AX =număr de octeţi citiţi dacă CF=0 (AX=0 este EOF sfârşit de fişier). Funcţii DOS 3CH Creare fişier (Create) Creează în directorul specificat o etichetă de fişier nouă. 2 scriere citire. 5 acces interzis) 3DH Deschidere fişier existent (Open) se poate deschide orice fişier inclusiv cele ascunse. 4 prea multe fişiere deschise.Memorie DS:DX 9.2. primii biţi acces partajat) DS:DX =adresă şir ASCII cu numele fişierului urmat de 00H Ieşire AX conţine indicatorul logic (handle) sau cod de eroare (CF=1) 3EH Inchidere fişier Inchide fişierul al cărui indicator logic s-a dat în BX AH=3EH cod funcţie DOS închidere fişier BX =indicatorul logic al fişierului 3FH Citire dintr-un fişier (Read) indicat prin BX care conţine indicatorul alocat (handle). Intrare AH=3DH codul funcţiei DOS AL conţine codul de acces (0 citire permisă. la adresa de fişier indicată de pointer-ul de citire/scriere şi lungime în număr de 78 . Incrementare automată pointer citire/scriere cu lungimea citită.1 scriere permisă. 40H Scriere într-un fişier (Write) indicat prin BX. AH=3CH codul funcţiei de creare fişier nou DS:DX =adresă şir ASCII cu numele fişierului urmat de 00H CX conţine atributul fişierului 00 – fişier normal 01 – fişier read/only (protejat la scriere) 02 – fişier ascuns 04 – fişier sistem Ieşire dacă CF=0 atunci AX conţine indicatorul logic (handle) atribuit fişierului CF=1 operaţie eronată şi AX conţine codul erorii (3 nu s-a găsit calea. care conţine indicatorul alocat (handle). într-o zonă de memorie dată prin DS:DX de la adresa de fişier indicată de pointer-ul de citire/scriere şi lungime în număr de octeţi dată în CX. dintr-o zonă de memorie dată prin DS:DX.

========================================= . .CODE din program. UTILIZARE FISIERE PRIN IDENTIFICATOR LOGIC .2 – ascuns. Pointerul de scriere/citire se incrementează automat cu lungimea transferată după operaţie. Intrare AH = 3FH cod funcţie DOS de scriere în fişier BX = indicator logic fişier referit (handle) DS:DX =adresă zonă de memorie (buffer) CX =număr de octeţi transferaţi (lungime) Ieşire dacă CF=0 operaţie reuşită 41H Ştergerea unui fişier a cărui nume se dă ca text ASCII în DS:DX (inclusiv calea).LF şi ’$’ după textul introdus mov dx. precizând referinţa (adresa curentă. 9. Program de scriere si citire texte în fişier Prezentăm mai jos un exemplu de scriere şi citire rânduri de text într-un fişier exploatat cu indicator logic. După fiecare transfer pointerul de citire/scriere se actualizează cu lungimea transferată. AH=41H cod funcţie DOS ştergere fişier BX=indicator logic fişier referit (handle) 42H Poziţionare pointer citire/scriere (LSEEK) pentru fişierul asociat indicatorului logic (handle) dat în BX şi păstrat în FCB-ul alocat de sistem. 1 –read/only. 1 – setare atribute) DS:DX = adresă nume fişier ca text ASCII CX valoare atribute citite sau de setat (0 – normal. 20H arhiva). completare CR. Se observă modul de definire a numelui fişierului.3. adresa de receptie 79 . Se vor concepe alte programe care să utilizeze macroinstrucţiunile definite. Prin directiva INCLUDE fişierul de macroinstrucţiuni se copiază în secţiunea .offset sir1 . 4 sistem. ----------------------------------------cit_sir macro sir1 . AH=42H cod funcţie poziţionare pe fişier AL codul metodei de poziţionare 0 – faţă de începutul fişierului 1 – faţă de poziţia curentă 2 – faţă de sfârşitul fişierului BX = indicatorul logic al fişierului referit (handle) CX:DX =adresa relativă în fişier în octeţi a informaţiei ce se transferă 43H Citire/Setare atribute fişier permite schimbarea atributelor fişierului setate la creare sau pe parcurs. începutul sau sfârşitul fişierului). CITIRE SIR DE LA CONSOLA SI COMPLETARE LF SI $ . care pot fi plasate într-un fişier program separat pentru a putea fi utilizate şi din alte programe. AH=43H funcţie DOS setare atribute fişier AL = cod subfuncţie (0 – citire atribute. DEFINIRE MACROINSTRUCTIUNI FOLOSITE . La început se definesc macroinstrucţiunile utilizate la apelarea funcţiilor DOS. Dacă se omite discul sau calea se ia din directorul curent.octeţi dată în CX.

02h .handle . CF = 0 operatie corecta tip_err al .mov int xor mov mov mov mov mov int endm ah. functie afisare sir int 21h endm . DESCHIDERE FISIER EXISTENT .LF si CR int 21h mov dl.02h .0Ah 21h bh.10 sir1[bx+4].10 .offset sir2 . in BX lungime sir receptionat . adresa sir de afisat mov ah. AFISARE SIR TERMINAT CU $ PE ECRAN . adresa zona cu nume fisier mov al. eticheta locala in macro clc .10 ah. functie afisare un caracter . afisare mesaj de eroare mov dl.4Ch .'$' dl.sir1+1 sir1[bx+3]. anulare fanion CF mov ah. ----------------------------------------tip_sir macro sir2 mov dx. definire eticheta locala mov handle. ----------------------------------------op_fis macro nume1.09h . CF = 1 afisare eroare din AL cont label near . functie deschidere fisier mov dx.13 int 21h mov ah. rind nou . linie noua dupa receptie . AFISARE EROARE DUPA EXECUTIE MACRO . cod LF (linie noua) la sfirsit .nr . afişare numar eroare tip_sir err . salvare indicator logic din AX 80 .02h 21h .offset nume1 . terminare program int 21h endm . urmat de numar eroare or dl. mode de deschidere R/W int 21h jnc cont . ----------------------------------------tip_err macro nr .bh bl.3dh .ax .30h mov ah. indicator sfirsit sir . functie dos citire sir . nume si adresa indicator logic local cont . afisare un caracter int 21h mov dl.

lung . CF = 0 operatie corecta tip_err al . numar octeti cititi mov dx. ----------------------------------------cit_fis macro handle1. BX = indicator logic mov cx. functie citire fisier mov bx. adresa zona memorie int 21h jnc cont .handle1 . POZITIONARE POINTER DE CITIRE SCRERE IN FISIER . CITIRE SIR DE LUNGIME DATA DIN FISIER .lung . ----------------------------------------81 . la adresa disc data de pointerul de citire scriere . CF = 0 scriere corecta tip_err al . functie scriere in fisier mov dx. incarcare indicator logic int 21h jnc cont .-----------------------------------------scr_fis macro handle1.DX . adresa indicator logic local cont clc mov ah.buff . SCRIERE IN FISIER UN SIR DE CARACTERE .buff .-----------------------------------------cl_fis macro handle1 . CF = 1 afisare eroare din AL cont label near endm .lung. afisare eroare din AL cont label near endm .offset buff .3fh . INCHIDERE FISIER .handle1 .endm . CF = 0 citire corecta tip_err al .handle1 . handle. BX = indicator logic fisier int 21h jnc cont .lungime.tampon local cont clc mov ah. de la adresa data de pointerul de citire/scriere .offset buff . functie inchidere fisier mov bx. numar octeti transferati mov bx. adresa octet referitor la inceputul fisierului CX.40h .tampon local cont clc mov ah.3eh .lung. afisare eroare din AL cont label near endm . adresa zona memorie mov cx. handle.lungime.

lung2 local cont mov ah.10 cx handle.10.inc start: mov mov op_fis tip_sir mov push cit_sir scr_fis pop loop tip_sir lseek mov push cit_fis tip_sir pop loop cl_fis mov l1: l2: ax.10. pozitia curenta =1.10. afisare octeti cititi .'Continutul fisierului:'.model small .buf+2 cx l1 mes1 handle.0 .ciclu citire rinduri .data nume_fis db handle dw buf db mes db mes1 db err db 'C:\Stud\Pla\fis.15.stack 256 .13.tip .lseek macro handle.42h .handle . indicator logic fisier 50.10 cx buf handle.DX mov dx.ax nume_fis.0. mesaj dialog . ciclu citire de pe fisier .code includedisclogi.15.tip. sfirsit=2. int 21h jnc cont . adresa octet din fisier in CX.buf+2 buf+2 cx l2 handle ax. contor inregistrari citite . functie setare pointer cit/scr mov cx. PROGRAM PRINCIPAL . deschidere fisier .0 cx.10.========================= dosseg . pozitionare inceput fisier .50 dup (?) . citire din fisier 15 octeti . scriere rind in fisier .lung1 .4C00h . numar de rinduri citite .lung1. terminare program 82 . mesaj afisare fisier . zona tampon pentru dialog 'Introduceti 10 siruri de caractere:'. CF = 0 operatie reusita tip_err al . referinta inceput=0.0.13. numele fisierului 0 .@data ds.lung2 mov bx. inchidere fisier . citire rind tastatura .'$' 13. tiparire cod eroare din AL cont label near endm .0.'Eroare scr/cit fisier nr: $' . definiri macro lucru cu fisiere .'$' 13. BX = indicator logic fisier mov al.txt'.handle mes cx.

15.citire rand tastatura scr_fis handle.10 .0 .numele fisierului buf db 50. cx=lungime de transferat dosseg .handle .mesaj afisare fisier lseek handle.@data ds.mesaj dialog mov cx.scriere rand in fisier pop cx loop l1 .citire din fisier 15 octeti tip_sir buf+2 .10.15.model small .10.'eroare scriere/citire fisier nr:$' handle dw 0 .buf+2 .txt'.'$' err db 13.13.numar de randuri citite l1: push cx cit_sir buf .pozitionare inceput fisier mov cx.program de exploatare fiserere disc cu indicator logic .stack 256 .0.afisare octeti cititi 83 .ciclu citire randuri tip_sir mes1 . normal dupa citire ax indica numarul de octeti cititi .0. adresa de lansare .'$' mes1 db 13.inc .====================================================== .indicatorul sfarsit de fisier(eof) este dat de ax=0 .'continutul fisierului:'. bx=handle fisierului ds:dx=adresa buffer .10.fisierul cu numele fis.10.ax op_fis nume_fis.definiri macro lucru cu fisiere start: mov mov ax.inainte de executie operatie i/e: .buf+2 . sau se va introduce macro de creare fisier vid(ah=3ch) .deschidere fisier tip_sir mes .code include disclogic.zona dialog mes db 'introduceti 10 siruri de caractere:'.13.data nume_fis db 'fis.0 .indicator logic fisier .50 dup(?) .int end 21h start .0.contor inregistrari citite l2: push cx cit_fis handle.10 .txt se va crea vid din Norton Commander .====================================================== .

AFISARE EROARE DUPA EXECUTIE MACRO .13 int 21h mov ah.10 .4c00h .inchidere fisier mov ax.indicator sfarsit sir mov dl.offset sir1 .02h .10 .02h .cod lf(linie noua) la sfarsit mov sir1[bx+4].4ch .terminare program int 21h 84 .linie noua dupa receptie mov ah.=========================================== .10 .afisare mesaj eroare mov dl.============================================== cit_sir macro sir1 mov dx.inc .==================================== tip_err macro nr tip_sir err .adresa de lansare --------------------------------------Fisier disclogic.functie afisare un caracter int 21h endm .sir1+1 mov sir1[bx+3].CITIRE SIR DE LA CONSOLA SI COMPLETARE LF SI $ .adresa sir de testat mov ah.ciclu citire de pe fisier cl_fis handle .'$' .functie afisare sir int 21h endm .UTILIZARE FISIERE PRIN IDENTIFICATOR LOGIC .functie dos citire sir int 21h xor bh.09h .pop cx loop l2 .offset sir2 .========================================== tip_sir macro sir2 mov dx.bh .AFISARE SIR TERMINAT CU CARACTER PE ECRAN .=========================================== .adresa de receptie mov ah.urmat de numar eroare or dl.DEFINIRE MACROINSTRUCTIUNI FOLOSITE .in bx lungime sir receptionat mov bl.terminare program int 21h end start .30h mov ah.0ah .afisare un caracter int 21h mov dl.nr .rand nou LF si CR int 21h mov dl.

offset buff .nr octeti cititi mov dx.eticheta locala in macro clc .-----------------------------------------------cit_fis macro handle1.adresa zona memorie int 21h jnc cont .mod de deshidere R/W int 21h jnc cont .nume si adresa indicator logic local cont .endm .lung .ax .SCRIERE IN FISIER UN SIR DE CARACTERE 85 .definitie eticheta locala mov handle.buff local cont clc mov ah.INCHIDERE FISIER .adresa zona cu nume fisier mov al.dupa operatie daca cf=0 ax=lungime transferata .functie deschidere fisier mov dx.cf=1 afisare eroare din al cont label near .functie citire fisier mov bx.====================================== .salvare indicator logic din ax endm .offset nume1 .functie inchidere fisier mov bx.02h .handle1 .cf=0 operatie corecta tip_err al .============================ op_fis macro nume1.sfarsit fisier daca ax=0 .BX=indicator logic mov cx.anulare fanion CF mov ah.de la dresa data de pointerul de citire/scriere .lung.handle1 .==================== cl_fis macro handlel .afisare eroare cont label near endm .bx= indicator logic int 21h jnc cont .CF=0 operatie corecta tip_err al .CITIRE SIR DE LUNGIME DATA DIN FISIER .DESCHIDERE FISIER EXISTENT .CF=1 afisare eroare din AL cont label near endm .3eh .handle .3dh .CF=0 => corect tip_err al .3fh .adresa indicator logic local cont clc mov ah.

42h .handle1 .lung2 local cont mov ah.code st1: mov ax.lung .data sir1 db 'Sir egal cu 2' sir1l EQU $ .adresa octet referitor la inceputul fisierului cx.nr octeti transferati mov bx.la adresa disc data de pointerul de citire/scriere .functie scriere fisier mov dx.dx mov dx.tiparire cod eroare cont label near endm -----------------------------------------------------.tip.handle . E = '0' daca sir1 <> sir2 .functie setare pointer citire/scriere mov cx.---------------------------------------------------lseek macro handle.offset sir1 sir2 db 'Sir egal cu 2' db 'E : ' E db ? . E = '1' daca sir1 == sir2 .referinta inceput=0..lung1. Se compara doua siruri sir1 si sir2. @data mov ds.adresa octet din fisier in cx.CF=0 => corecta citirea tip_err al .BX=indicator logic fisier mov al.dx .CF=0 => operatie reusita tip_err al . .lung.stack 100 .sfarsit=1 pozcrt=2 int 21h jnc cont .40h .adresa zona mamorie mov cx. ax 86 .offset buff .model small .BX=indicator logic fisier int 21h jnc cont .lung1 .tip .lung2 mov bx.pozitionare pointer de citire/scriere in fisier .afisare eroare cont label near endm .buff local cont clc mov ah.-------------------------------------------------scr_fis macro handle1.

1 . returneaza valoarea calculata . N! = N * (N . nu exista egalitate egal: int 3 end st1 -----------------------------------. bx . se repeta pana se intalneste o diferenta . Procedura calcul factorial ( N! ) . daca ZF = 1 sirurile sunt egale . 1! = 1 retf factor1 endp .mov es. intrare . ax se modifica ! 87 . sir1l mov E. ax .N=1 mov ax.1)! retf fact1: mov bx.N! .N=N+1 imul bx .N (numarul) . ax cld mov si. salveaza registrele folosite si pregateste parametrii pentru procedura . offset sir2 mov cx. macro pentru apelul procedurii recursive . iesire . ax . '0' nop . offset sir1 mov di. se compara pe lungimea unui sir . se considera ca sunt egale . '1' repz cmpsb jz egal mov E. N! = N * (N . varianta (necesita stiva !) factor2 proc far cmp ax. 1 jle fact2 push ax dec ax call factor2 pop bx . N imul bx .1)! fact2: ret factor2 endp . Modifica bx ! factor1 proc far dec ax jz fact1 call factor1 inc bx .

ax fld x fld1 fld st fld st fld st ciclu: fmul st.00001 x dd 2. @data mov ds.factor macro N.data eps dd 0. st(1) fadd st(2). st(4) fdiv st. N call factor1 pop bx mov Nfact.code start: mov ax.program de calcul exp(x) .8087 . 4ch int 21h end start --------------------------------------.stack 256 .model small . st(2) fdecstp fcom eps . ax endm -----------------------------. se cauta sir2 in sir1 88 .st fincstp fadd st. .541 ex dd 0. fstsw ax fwait sahf jl gata jmp ciclu fld st(2) fst ex gata: mov ah. Nfact push bx mov ax.

l1 mov si. ds:pr1.adresa tabloului . offset sir1 mov mem. ax mov di. . di repe cmpsb .facultatea de calculatoare je found sub si. cx sub di. calcul medie elemente poz. byte ptr [si] repne scasb jne not_found push cx mov cx.nr. cx pop cx add cx. in loc de parametrii) 89 . es:pr1 l1 equ 26 l2 equ 4 sir1 db 'facultatea de calculatoare $' sir2 db 'dexy' mem dw 0 st1: mov ax.. . di mov cx. 0FFFFh finish: int 3 pr1 ends end st1 ----------------------------------. . l2 dec cx inc si mov ax. iesire (pe stiva. mem jmp finish not_found: mov ax. ax mov es. 1 jmp bucla found: sub ax. intrare (pe stiva) . neg. de elemente .pr1 segment assume cs:pr1. pr1 mov ds. offset sir2 bucla: mov al.

vnn. pozitive vnp dw ? . push dx . variabila locala pt. cx . el. negative vbp dw ? . el. ax .vat .vsn. pregatire pentru impartire (valoarea ax > 0 -> dx = 0) div m_z. parametrul nr.. vip dw ? . setare bp sub sp. el.vbp] .vnp.media elementelor pozitive . dx . constanta pentru acces la parametrii si variabile locale medie1proc far push bp mov bp. inc nr. nr. el. variabila locala pt. 0 mov m_z. suma el.adresa tablou med11: lodsw . 0 mov m_z. sp . inc nr.vsp.vsp. salt daca ax = 0 js med1n . salt daca ax < 0 inc m_z. ax . mov cx. salvare registre folosite push cx . se suprascrie al II-lea parametru cu media poz. alocare spatiu pentru variabile locale . si . pozitive add m_z.vsn. ax . 0 mov m_z.vnn . push si .vne . ax > 0. push ax .vnp . m_z. elemente vat dw ? . variabila locala pt. continuare mov ax. ax < 0.media elementelor negative . negative vnn dw ? . parametrul adresa tablou medie_s ends m_z EQU [bp . . . ax . suma el. . m_z. vne dw ? . 90 . ax = suma elementelor pozitive xor dx. vsn = vsn + ax med1z:loop med11 . vbp . calcul medie mov m_z. 0 .vne. in ax primul element or ax. m_z.vsp . . vcs dw ? .vnp . initializare variabile locale . mov m_z. nr. medie_s struc vsp dw ? .nr elemente mov si. pozitive vsn dw ? . verificare ax < 0 jz med1z . variabila locala pt. salt peste partea cu ax < 0 med1n: inc m_z. negative add m_z. vsp = vsp + ax jmp med1z .

offset X . media el.data X dw 20.lungimea totala a tabloului .vat. end add sp. adresa tabloului . 1 mov bx. cx (= cx / 2) . 1 .vsn . lungimea tabloului = 2 * nr elemente) . (fiecare element ocupa 2 octeti -> .mov ax. pregatire pentru impartire idiv m_z. 4c00h int 21h . intrare . ax = suma elementelor negative cwd . . pozitive .nr.stack 256 . media el. numarul de elemente . restaurare bp . iesire . cx . ax . negative . jg bb1 . de caractere din sir . calcul medie mov m_z. cx . 30. se suprascrie primul parametru cu media neg. 10. ax mov cx. sirul [bx] sortat bubble proc far cmp cx.nr. vbp pop bp retf medie1endp *****Program care foloseste ce-I mai sus . . bx .model small . Xl shr cx. -10. offset X push bx push cx call medie1 pop ax pop bx mov ax. pop ax pop si pop cx pop dx . de elemente .adresa sirului de sortat .asm st1: mov ax. Sortare sir folosind bubblesort . m_z.code include medie. terminare end st1 ------------------------------. apel procedura . refacere stare stiva . continuare daca sunt cel putin 2 caractere in sir 91 . @data mov ds. restaurare registre folosite .vnn . -20 Xl EQU $ . . .

. bucla interna de parcurgere a sirului cmp al. [si+1] jle bbok . care lucreaza cu numere reprezentate in virgula flotanta (VF). UTILIZAREA COPROCESORULUI MATEMATIC 12.inaintea instructiunilor 8x86. salvare contor bbl: mov si. bx . Microprocesoarele 80486 şi Pentium au integrat in ele si modulul deVF 80387 alaturi de un modulul binar 80386. MEMORIE CENTRALA 92 . [si+1] . sir neordonat pop bx pop cx pop dx pop di .schimbare) bbok: inc si loop bbli . salt daca [si] <= [si+1] xchg al. index folosit mov cx. 0 . se compara pe max cx-1 caractere mov dx. or di. salvarea registrelor folosite dec cx .. mov di. restaurare contor mov di.sir sortat) bbli: mov al. (1 .FADD.di .). pozitionare indicatori logici jnz bbl . corespunzatoare celor trei game ale microprocesoarelor INTEL 80x86. sint module procesor specializate pentru calcule matematice. cx . di = 1. (0 . care folosesc date rezultate in memorie din prelucrari in 8x87. Mnemonicele coprocesorului incep cu litera F (FLD. al .1 . El este o extindere a resurselor procesorului de baza 80x86. Coprocesorul asigura cresterea considerabila a vitezei de executie a operatiilor aritmetice. schimbarea valorilor [si] <-> [si+1] mov [si]. dx . restaurare registre retf bubble endp -----------------------bb1: 12. ca registre si set de instructiuni.1 Arhitectura coprocesorului 8x87 Coprocesoarele 8x87/80287/80387.retf push di push dx push cx push bx . [si] . Cele doua procesoare pot lucra in paralel. folosind in comun memoria centrala. calculul functiilor trigonometrice sau logaritmice si o crestere a preciziei de calcul (numarul de cifre semnificative). Pentru sincronizarea lor in program se va folosi instructiunea FWAIT. programul putind contine atit instructiuni de baza cit si in VF.

64-mantisa). Unitatea de comanda si control contine 5 registre (14 octeti). Fazele executiei unei instructiuni 8x87 sint: . care-i furnizeaza adresa instructiunii curente (IP-instr.ST(7) Registrele si caile interne ale coprocesorului VF sint de mare viteza si 80 biti (1-semn.Citire instructiune de catre 8x86 .Unitatea de executie a instructinilor in virgula flotanta . Coprocesorul 8x87 nu are instrucţiuni propri de salt.Calcul adresa operand in 8x86 .Unitatea de comanda si control a transferurilor de informatii . dar adresa se calculează în procesorul de bază 8x86. Ele pot fi memorate la adrese consecutive prin FSTENV (store environment) si ulterior incarcate prin FLDENV (load environment).15exponent.ST(1).stare si intrerupere . care sint aceeasi 11011 si se numesc ESCAPE..baza. pentru a putea fi testat de procesorul 8x86 in WAIT.adresa reala.Executie instructiune VF in 8x87 si memorare rezultat .masti de intrerupere . care pastreaza starea momentana a lui 8x87 (ENVIRONMENT). Cind lucreaza coprocesorul pune BUSY=1 (primul bit din status word).Comunicare adresa operand si cod instructiune spre 8x87 .pointer) si adresa operandului (OP-operand pointer) in forma reala. Coprocesorul nu are mecanism propriu de calcul al adreselor (segment. Sunt admise toate modurile de adresare.Anuntare procesor 8x86 ca s-a terminat executia Instructiunile de VF sint recunoscute dupa primii 5 biti din codul operatiei. acest calcul se face in 8x86.index). Coprocesorul 8x87 contine: .Registre generale de VF organizate ca stiva ST(0). +0 +2 +4 +6 +8 +10 +12 15 CONTROL WORD STATUS WORD TAG WORD INSTRUCTION POINTER OPERAND POINTER 0 -precizie. cod instructiune curenta .indicatori reg .Programe 8x86/87 Date 8x86/87 PROCESOR 8 x8 6 PROCESOR VF 8x87 Cele doua procesoare folosesc aceleasi magistrale de date si adresa (BUS)..adresa reala operand 93 .indicatori.

. care se pot memora cu FSTSW (store status word) pentru a fi analizate de 8x86. Toate datele primite din memorie se convertesc si se pastreaza in VF format lung (temporary). 15 0 INSTRUCTION POINTER -low (bitii 15-0) IP -high | 0 | OPERATION CODE 15 12 10 0 Registrul OPERAND POINTER contine pe 20 biti adresa reala (calculata de 8x86) a operandului din memorie utilizat in instructiunea curenta.Din memorie se pot incarca numere intregi binare.numere in zecimal codificat binar (BCD) de 18 cifre si numere codificate in VF.ST(1).indicatorii de conditii.Salvarea registrelor se face cu octetii mai putin semnificativi in fata si in ordinea ST(0). 94 .pentru precizie maxima (1semn. cind trebuie sa se faca salturi conditionate (8x87 nu are instructiuni de salt). 15 biţi 64 biţi S EXPONENT MANTISA R0 ST(6) R1 ST(7) R2 ST(0) <--TOP=2 R3 ST(1) ST(2) R7 79 63 0 ST(5) La un moment dat oricare registru poate fi virful stivei ST(0). iar urmatorul ST(1).Celelalte registre vor avea o adresa relativa fata de ST(0).ST(7).. Registrul INSTRUCTION POINTER pastreaza pe 20 biti adresa reala si codul instructiunii curente ( fara primii 5 biti 11011).se poate memora prin FSAVE si restaura prin FRSTORE. dupa registrele ENVIRONMENT. Registrul STATUS WORD contine: . Numarul registrului virf de stiva se gaseste memorat in zona TOP din STATUS WORD. Conversiile necesare se fac la citirea sau scrierea in memorie utilizind instructiuni specifice.Starea completa a coprocesorului cuprinde si cele 8 registre generale (stiva) de 10 octeti fiecare (14+8*10=94 octeti). 64. 15 0 OPERAND POINTER -low adress (bitii 15-0) OP high | 0 0 0 15 12 0 Registrele generale organizate ca stiva circulara are fiecare 80 biti.. Operatiile de incarcare decrementeaza TOP cu 1 si incarca in noul registru ST(0).mantisa sau "significand"). Operatiile de memorare cu "pop" memoreaza din ST(0) si incrementeaza TOP cu 1. pozitionati dupa efectuarea instructiilor de comparatie/test.15-exponent..

bitii care indica aparitia unor cereri intreruperi spre 8x86.Infinit Control 0 .rotunjire in sus 10 . sau datorate rezultatelor obtinute .Precizion Control .indicatori intreruperi datorate rezultatului P =1 .Precision Mask .intreruperea exceptie este mascata (implicit) Raspunsurile la fiecare exceptie mascata (masca = 1)sint: PM .Intrerupt Enable Mask .overflow prea mare (depasire superioara) Z =1 ..Rounding Control .impartire numar # 0 cu zero D =1 .nu face distinctie intre + si .infinit 1 .long real 11 .rotunjire in jos 11 .24 biti pentru mantisa .implicit = 1 (mascate) 0 .rezervat 10 .numar nenormalizat I =1 .ST(0) < sursa (echivalent cu S la 8x86) C3 =1 .short real 01 .precizie de lucru prescrisa(rotunjire) 00 .indica nr.indica rezultatul unei comparatii sau test C0 =1 .rezervat (bit 6) Mastile specifice intreruperilor pot avea valorile: 0 .intrerupere exceptie tratata prin procedura utilizator 1 ..face distinctie intre + si .ST(0) > sursa (echivalent cu Z la 8x86) TOP =0.intreruperile nemascate.cerere intrerupere la 8x86 (intrerupt request) P U O Z D I .53 biti .rezultat = 0 95 .Underflow Mask .infinit RC ..temporary real ( implicit ) IEM . registru virf de stiva IR =1 .furnizeaza rezultatul rotunjit UM .indicatorul registrului virf de stiva TOP 15 B 14 C3 13 10 9 TOP C2 C1 8 C0 7 IR 6 5 P 4 U 3 O 2 Z 1 D 0 I B =1 .toate intreruperile sint tratate standard de 8x87 x .invalid operation .denormalized .coprocesor 8x87 ocupat C3--C0 .0/0.7 .64 biti .zero divide .underflow -exponent prea mic (depasire inferioara) 0 =1 .stabileste modul de rotunjire 00 . infinit/infinit.nenumeric Intreruperea se poate anula cu FCLEX (clear 8x87). Registrul CONTROL WORD contine indicatori de stabilire precizie si masti de intrerupere: 15 rezervat 12 IC 11 RC 9 PC 7 IEM x 5 PM 4 UM 3 OM 2 ZM 1 0 DM IM IC .tratate prin procedura utilizator 1 .trunchiere PC .rotunjire la cel mai apropiat ( implicit ) 01 .precision -s-a pierdut un bit si rezultatul rotunjit U =1 .

continua calculul cu nr.In registrele interne se pastreaza datele numai in format VF de unde se pot memora in alte formate prin instructiuni specifice.define double-word ...+ sau . LONG INTEGER ( 64 biti ) 96 . In real mantisa este pozitiva si da precizia. In toate tipurile primul bit este considerat semn.2 Tipuri de date Sint admise 7 tipuri de date.este valoarea mantisei 1 < M < 2 EXP . TAG(1). Valoarea exponentului (EXP) se calculeaza: EXP = CAR .nenormalizat IM .continut special nenumeric.Denormalized .pentru SHORT REAL .valoare calculata exponent Tipurile intregi cu semn sint cele acceptate de procesorul 8x86 si de Macroasamblor prin directivele de definire date: DW .valoare zero de initializare 12.rezultatul este valoarea nenumerica a operandului (ex: radical din numar negativ) Registrul TAG WORD contine 8 grupe de 2 biti numite TAG(0).Invalid operation Mask .Overflow Mask .pt.pentru WORD INTEGER ( 16 biti ) DD .define word .Zero divide Mask -rezultat = numar maxim cu semn DM .3FFH . Bitii de exponent dau caracteristica (CAR). Fiecare TAG(I) indica continutul lui ST(I) : TAG(I) = 00 ..pentru TEMPORARY REAL Valoarea unui numar real .zero in ST(I) 10 .. iar semnul este al mantisei (S = 1 negativ).OM . Caracteristicile tipurilor admise sint date in tabelul urmator: Tip date Biti Cifre zec.infinit.. Specificarea adresei operandului se poate face in toate modurile admise de 8x86..valoare valida in ST(I) normalizata sau nu 01 .rezultat = numar maxim cu semn ZM .pt.define quad-word .anormal 11 .. care este pozitiva.N (reprezentat in virgula flotanta) se calculeaza dupa formula: N = M*2**EXP unde: M .zec nu SHORT REAL 32 6-7 24 biti 127 (8) LONG REAL 64 15-16 53 biti 1023 (11) TEMPORARY 80 19-20 64 biti 16383 (15) REAL *Exponentul este utilizat ca putere a lui 2. iar bitii din stinga sint cei mai semnificativi. care pot fi operanzi din memorie si care prin incarcare se convertesc in format intern Virgula Flotanta (VF) pe 80 biti numit Temporary Real.7FH .pentru LONG REAL .3FFFH .TAG(7) corespunzatoare celor 8 registre generale ST(0). iar in paranteza se da puterea corespunzatoare a lui 10 pentru domeniul maxim. care asigura si conversia. ST(1). care asigura calcularea adresei.ST(7). Precizie Exponent* WORD INTEGER 16 4-5 16 biti nu SHORT INTEGER 32 9 32 biti nu LONG INTEGER 64 18 64 biti nu PACKED DECIMAL 80 18 18 cif. SHORT INTEGER ( 32 biti ) DQ .

emulare .. 79 S 71 63 56 .... f22 f23 . avind 18 cifre zecimale..genereaza chemari de subprograme din biblioteca pentru mnemonice 8x87 intilnite Codurile instructiunilor 8x87 generate in modul /R pot fi executate fara a exista fizic coprocesorul daca se lanseaza inainte : EM87 /L Acesta incarca un emulator 8x87 rezident in memorie.. La terminarea programelor care utilizeaza mnemonici 8x87 emulatorul se elimina prin: 97 . . 0 f62 f63 TEMPORARY REAL 79 78 63 S E14....... /R ... Primul octet contine doar semnul pe primul bit. 15 7 * D17D16 D15D14 D13 .in mantisa 1 este implicit .. EXP < 1023 (3FFH) . D4 D3D2 Tipul este recunoscut de macroasamblor prin definitia: DT -define ten-byte in care valoarea se specifica in hexa 0 D1D0 Tipurile reale sint numere codificate in virgula flotanta unde reprezentarea se face prin mantisa pozitiva (significant). codificate fiecare pe 4 biti (doua pe octet).. E1 E0 1^f1 f2 f3 f14 ..genereaza cod real executabil pe 8x87 existent /E . Mantisa se trece intotdeauna intr-o forma normalizata 1 < M < 2 de forma: 1^ffffffff unde: ^ . el existind fizic numai la TEMPORARY REAL.......mantisa 15-16 cifre zec.. 52 sau 63) Bitul intreg este implicit dar nu exista in memorie pentru formatul SHORT si LONG.. caracteristica si semn... exponent LONG REAL 63 62 S E10 22 EO f1 f2 mantisa 51 E0 f1 f2 f3 0 f51 f52 0 .este punctul zecimal virtual f ...mantisa 6-7 cifre zecimale .Tipul PACKED DECIMAL utilizeaza 10 octeti si este un numar zecimal codificat binar cu semn (BCD)..3 Asamblarea programelor Pentru generare de cod pentru coprocesor Macroasamblorul se poate lansa in doua moduri MASM .mantisa 19-20 cifre zecimale 12. SHORT REAL 31 30 S E7 ..sint biti fractionari (23.. care se apeleaza prin intreruperile de exceptie instructiune inexistenta. declansate de codurile 8x87 din program.. EXP < 16383 (3FFFH) ....EXP < 127 (7FH) ......

386 .intreg pe 4 oct. stiva reg.pentru SHORT si LONG REAL.BCD load .integer store . Schimbul de date cu memoria este insotit de conversia lor in temporary real daca e cazul. Toate instructiunile de incarcare decrementeaza inainte stiva.53E+4 .EM87 /U .pentru 80287 .Nu exista instructiuni imediate.286P . Instructiunile de transfer 8x87 executa incarcarea(sau memorarea) datelor.memorare ST ca nr. Prezentam sintetic instructiunile din aceasta grupa: Transferuri de numere intregi: FILD intreg .286C . utilizabil de 8x87 (LONG) X4 dt 4530H .set instructiuni 80386 Pentru testarea programelor care utilizeaza coprocesorul. zecimal din memorie FBST decimal .zecimal FLD Transferuri de numere reale intre ST si memorie: real .temporary real (10 oct.8087 Daca se utilizeaza alte coprocesoare se vor da comenzile: .long real (8 oct.incarcare numar real din memorie in ST 98 . Pentru precizarea unei adrese de operand din memorie se pot folosi toate modurile de adresare.intreg pe 2 oct.0 . de tipurile precizate.descarcare emulator 8x87 din memorie Pentru ca macroasamblorul sa recunoasca mnemonicele 8087 in program. deoarece nu recunoaste setul de instructiuni al coprocesorului si se recomanda CODVUE. ST(0) se poate nota ST. utilizabil de 8x86 sau 8x87 X2 dd 4530 .) utilizabil de 8x87 X6 dq 4. OBSERVATIE In macroasamblor nu exista definitii de tipuri speciale de date pentru coprocesorul 8x87.387 .rotunjire la intreg a lui ST Transferuri de numere zecimale codificate binar: FBLD decimal .4 Instructiuni pentru transfer de date la 8x87 Coprocesorul 8x87 executa 69 instructiuni (72 la 80287).) utilizabil de 8x87 X5 dd 45. trebuie inainte sa se dea comanda: . 8x87 12. ele fiind recunoscute prin lungimea definita de instructiunile de VF ce le utilizeaza: X1 dw 4530 .integer load . depanatorul AFD nu poate fi folosit.30 . (pop) FRNDINT .idem FILD urmat de decrem. utilizabil de 80386 sau 8x87 X3 dq 4530 .set comun neprivilegiat 80286 .incarcare nr.intreg pe 8 oct.packed decimal (10 oct. Reg.set privilegiat 80286 .incarca din memorie in ST FIST intreg . sau ajustarea mantisei si exponentului.) direct utiliz.memorare ST ca intreg FILDP intreg .287 .short real (4 oct. sau intre registrele 8x87. din memorie in registrul ST(0). Pentru transferul datelor intre locatii de memorie se folosesc instructiunile 8x86 cunoscute.BCD store .daca se utilizeaza 80387 sau procesorul 80486 Pentru specificarea setului de instructiuni se utilizeaza: .) utilizabil de 8x87 X7 dt 4530.

stiva registre Transferuri intre ST si registrele stiva: FLD ST(I) . se depun in memorie sau AX de unde se pot depune in reg.copiaza ST in sus in stiva de registre FST ST(I) .FNSTCW.exp(ST) => ST . pozitionati dupa executia instructiunilor de VF..incrementare stack pointer Incarcari de constante in ST: Pentru a suplini lipsa incarcarilor imediate exista instructiuni care incarca in ST anumite constante.salvare ENVIRONMENT + reg.(pop) FXCH .memorare STATUS WORD in AX (la 80287) FCLEX .C0 se vor memora automat peste Z si S.FNSAVE.restaurare ENVIRONEMENT si reg.busy Prin instructiunea FSTSW indicatorii de conditii 8x87.FST real FSTP real . Instructiuni pentru registrele de stare FSTSW dest .constanta PI FLDL2E log in baza 2 din E => ST FLDL2T log in baza 2 din 10 => ST FLDLG2 log in baza 10 din 2 => ST FLDLN2 log natural din 2 => ST Pentru incarcarea altor valori de constante.incarca din memorie reg. 99 .incarca din memorie reg. ele se vor defini in memorie cu un tip recunoscut in VF si vor fi incarcate prin instructiunile corespunzatoare tipului. CONTROL WORD . FNRSTORE). uzuale pentru a realiza ramificari ale programului.ST -> ST(I) FSTP ST(I) .0 => ST . Reg. CONTROL WORD . Indicatorii C3 . ENVIRONMENT . => ST .constanta 1. des folosite in calculele matematice. Mentionam ca 8x87 nu are instructiuni proprii de salt. mantisa(ST) => ST(1) si push FDECSTP .sterge flag-uile exceptie.generale Toate unstructiunile din aceasta clasa includ un FWAIT pentru sincronizare cu 8x86.memoreaza reg.memorare ST la o adresa de memorie .14. FLAGS se poate incarca in AH prin LAHF.memorare reg..0 => ST . . FLDPI 3. ENVIRONMENT (14 octeti) . Valoarea acestor indicatori se poate testa prin instructiunile de salt conditionat (Jcond).decrementare stack pointer registre FINCSTP .idem ca FLD urmat de decrem. Ele au si forma fara FWAIT cind au prefixul FN (ex: FNSTSW. FLAGS al lui 8x86 prin SAHF (instructiune 8x86).. Incarcarea incepe cu decrement FLDZ 0.ST <=> ST(1) interschimb FXCH ST(I) .memorare STATUS WORD la o adresa de memorie FSTSW AX .generale (94oct) .intrerupere.ST(I) -> ST FLD ST . FSTCW FLDCW FSTENV FLDENV FSAVE FRSTORE dest sursa dest sursa dest sursa .ST -> ST(I) si incrementare stiva reg.ST <=> ST(I) FXTRACT .constanta zero in VF FLD1 1.

5.ST(I) => ST(I) -substract real reversed FSUBR ST(I). se adauga doar 3 instructiuni pentru control in mod protejat.ST => ST(I) FSUB real ST .ST => ST FSUBR real real . La 80287 fata de 8x87.nici o operatie FABS . ST > referinta (rezultat > 0) 0 1 ST > referinta (rezultat < 0) 1 0 ST = referinta (rezultat = 0) 1 1 -rezultat +infinit sau -infinit 100 .ST(I) FADD ST(I).Instructiuni aritmetice in VF Aceasta grupa cuprinde instructiuni puternice de calcul matematic.ST(I) ST(I) .real => ST -real din memorie FSUBP ST(I).indicatorii C3.ST(I) => ST(I) FSUBR ST.indic.(test ST) FXAM -examineaza ST si poz.0 => pozit.ST ST .ST(I) ST .ST ST(1) + ST => ST(1) -adunare registre ST + ST(I) => ST ST + ST(I) => ST(I) ST + real => ST -real din memorie ST + ST(I) => ST(I) -adunare urmata de incrementare stiva registre (pop) Scaderi real .12. FSUB ST.ST ST . functie de rezultat (valoarea operanzilor nu se shimba) astfel: C3(Z) C0(S) 0 0 pt.schimba semnul lui ST (change sign) FSUB ST(1) .ST FADD real FADDP ST(I).ST(I) => ST FSUB ST(I).indic.scadere reg.indic.ST(1) => pozitionare indicatori de conditie FCOM ST(I) ST . FWAIT .ST => ST -real din memorie FSUBRP ST(I).conditie FCOM real ST .ST ST(I) -ST => ST(I) -scadere si pop Scaderi reale inverse (reversed) FSUBR ST .ST(I) => pozit.ST ST(I) .real => pozit.real FCHS .C1. pentru care a fost conceput coprocesorul matematic.C0 pentru cazul unor rezultate anormale(depasiri inferioare sau superioare) Comparatia consta dintr-o scadere a operandului specificat din valoarea lui ST si pozitionarea indicatorilor de conditie.conditie FCOMP ST(I) ST .ST(I) => ST(I) -scadere si pop reg Comparatii numere reale FCOM ST .real FADD FADD ST.ST(I) -comparatie si apoi pop reg FCOMPP -compara ST cu ST(1) si apoi dubla incrementare(pop) FTST -compara ST cu 0 ST .ST => ST(1) .valoare absoluta din ST |ST| => ST Adunari real . Setul lui 80387 cuprinde citeva instructiuni in plus care vor fi indicate.asteapta terminarea unei instructiuni 8x87 FNOP .C2.

rezultatul in noul ST care este dupa pop in locul lui y FSCALE calculeaza f= ST*2**ST(1) => ST .intreg => pozitioneaza indicatorii FICOMP intreg comparatie ST cu intreg si pop reg FIMUL intreg ST*intreg => ST -inmultire cu intreg Operandul intreg.real ST(I)/ST => ST(I) ST/ST(I) => ST ST/real => ST -real din memorie ST(I)/ST => ST -impartire si pop ST/ST(1) => ST(1) -divide reversed ST/ST(I) => ST(I) ST(I)/ST => ST ST/real => ST -real din memorie ST(I)/ST => ST(I) -divide rev.unde x in ST si y in ST(1) . este citit din memorie. ST > 0 cos(ST) => ST . logaritmice si trigonometrice usuale: FPREM FSQRT FCOS FSIN FPTAN pentru ST/ST(1) da restul partial (modul) in ST radicalul din ST => ST pt. si pop FPATAN arctg(x/y) => ST .ST(I) ST*ST(I) => ST FMUL real ST*real => ST -real din memorie FMULP ST(I). convertit in VF (real) si utilizat in instructiune.calcul sin(x) numai 80387 tang(a) .Indicatorii C3--C0 fac parte din primul octet din STATUS WORD.real FMUL ST(I).calcul cos(x) numai 80387 sin(ST) => ST .intreg => ST FISUBR intreg intreg .ST(I) FDIV real FDIVP ST(I). in AX de unde se depun cu SAHF in reg FLAGS si se pot testa cu instructiuni de salt conditionat.ST ST(I)*ST => ST -inmultire si pop FDIV FDIV ST(I). se memoreaza cu FSTSW AX. Operatii de inmultire si impartire in VF FMUL ST(1)*ST => ST(1) -inmultire real . Operatii real .ST FDIV ST.ST => ST -substract reversed FICOM intreg ST .interpreteaza ST(1) ca intreg si il adauga la exponentul lui ST pentru a obtine inmultirea cu 2 la puterea N FYL2X calculeaza f= Y*log2(X) =>ST (peste Y dupa pop) 101 .ST FDIVR FDIVR ST(I).ST FDIVR ST. de orice lungime.intreg FIADD intreg ST + intreg => ST -intreg din memorie FISUB intreg ST .pentru 0 < a < PI/4 .ST ST(I)*ST => ST(I) FMUL ST.ST(I) FDIVR real FDIVRP ST(I)/ST Instructiuni speciale In aceasta grupa am cuprins instructiuni de calcul functii exponentiale.rezultatul sub forma x/y in ST si ST(1) ST(1)/ST => ST(1) -impartire real .

El va afisa pe ecran rezultatul adunarii a doua numere zecimale codificate binar Y3 = Y1 + Y2. intregi si zecimale codificate binar (BCD) pentru calcule matematice utizind coprocesorul 8x87.ex1f. Programul va trebui lansat din DOS sau CodeView.1 4050708h 30303030h 0 0 102 .. .ex1f /r .rezolvarea unei ecuatii de gradul 2.data 0000 1B2F5D40 x1 0004 33338340 x2 0008 08070504000000000000 y1 0012 30303030000000000000 y2 001C 00000000000000000000 y3 0026 24 db 0027 00000000 x3 dd dd dt dt dt '$' dd 3.00 6/9/93 23:29:14 Page 1-1 adresa cod generat etic.Se va scrie un program pentru una din problemele: .6 Exemple de programe cu instructiuni 8x87 Folosind instructiunile prezentate si exemplele de program se vor scrie programe. care sa utilizeze numere reale.se cere X>0 in ST si Y -real in ST(1) pt.X<rad(2)/2 (0. . 12. real s-au emulat cu EM87 /L.Se va asambla programul si pentru datele constante generate cu diferite lungimi se va studia modul de codificare si se vor calcula valorile in zecimal pentru numerele reale.VF reale ---------------------------------------------------------------Microsoft (R) Macro Assembler Version 5.456 4.se cere X>0 in ST si Y -real in ST(1) FYLN2XP1 calculeaza f= Y*log2(X+1) =>ST (peste Y dupa pop) .unde e este baza log.calculul unei integrale definite cu metoda trapezelor Prezentam mai jos listingul unui exemplu de program simplu in care se declara diferite tipuri de variabile si se executa citeva instructiuni.Se va studia modul de codificare a instructiunilor de VF .asm. Se va afisa 8754. . .75) F2XM1 calculeaza f= 2**X-1 =>ST -unde X in ST Aceasta functie permite calculul functiilor exponentiale pentru orice baza prin formulele cunoscute: 10**X = 2**X*log2(10) e**X = 2**X*log2(e) .extragerea radacinii patrate dupa formula iterativa: X(i)= [N/X(i-1)+X(i-1)]/2 . EM87 / l -incarcare emulator rezident in memorie MASM ex1f.model small 0100 . instructiuni .unde X(1)=N/2 . naturali Y**X = 2**X*log2(Y) Constantele logaritmice se incarca prin FLDL2T si FLDL2E.stack 256 * segment de date * 0000 .calcul sin(x) si cos(x) prin dezvoltare in serie.macroasamblare cu instr. Cele doua numere au fost alese incit rezultatul sa fie de "tip ASCII" pentru a putea fi afisat direct pentru verificare.

002B 0000803F 002F 0000A040

x4 x5

dd dd

1.0 5.0

* segment de cod cu specificare coprocesor * .8x87 0000 .code 0000 B8 ---- R st1: mov ax,@data 0003 8E D8 mov ds,ax 0005 9B D9 06 0000 R fld x1 000A 9B D8 06 0004 R fadd x2 000F 9B D9 16 0027 R fst x3 0014 9B DF 26 0008 R fbld y1 0019 9B DF 26 0012 R fbld y2 001E 9B D8 C1 fadd st,st(1) 0021 9B DF 36 001C R fbstp y3 * afisare text pe ecran * 0026 BA 001C R mov dx,offset y3 0029 B4 09 ah,9 002B CD 21 int 21h 002D B4 4C mov ah,4ch 002F CD 21 int 21h 0031 end st1 Microsoft (R) Macro Assembler Version 5.0 Segments and Groups: Name DGROUP .. . . . . . . . . . . _DATA . . . . . . . . . . STACK . . . . . . . . . . _TEXT . . . . . . . . . . . Symbols: Name ST1 . . . . . . . . . . . . X1 . . . . . . . . . . . . . X2 . . . . . . . . . . . . . X3 . . . . . . . . . . . . . X4 . . . . . . . . . . . . . X5 . . . . . . . . . . . . . Y1 . . . . . . . . . . . . . Y2 . . . . . . . . . . . . . Y3 . . . . . . . . . . . . . 6/9/93 23:29:14

mov

Length Align Combine Class GROUP 0033 WORD PUBLIC 'DATA' 0100 PARA STACK 'STACK' 0031 WORD PUBLIC 'CODE' Type L NEAR L DWORD L DWORD L DWORD L DWORD L DWORD L TBYTE L TBYTE L TBYTE Value Attr 0000 0000 0004 0027 002B 002F 0008 0012 001C _TEXT _DATA _DATA _DATA _DATA _DATA _DATA _DATA _DATA

@CODE . . . . . . . . . . . . . TEXT _TEXT @CODESIZE . . . . . . . . . . . TEXT 0 @DATASIZE . . . . . . . . . . . TEXT 0 103

@FILENAME . . . . . . . . . . . 30 Source Lines 30 Total Lines 23 Symbols

TEXT ex1f

50940 + 309892 Bytes symbol space free 0 Warning Errors 0 Severe Errors ------------------------------------------------------------------Se observa ca numerele zecimale Y1 si Y2 se aliniaza la stinga unde cifrele au si ponderea cea mai mare. Numerele X1 si X2 care sint reprezentate in VF (reale) au octetii inversati, incit exponentul si ponderile mai mari apar in dreapta. Variabila X3=0 are atit mantisa cit si exponentul 0. X4 = 1. are reprezentarea 00 00 80 3F care in registru va fi: 3F 80 00 00 Deoarece primul bit din octetul 2 este din exponent printr-o deplasare spre stinga obtinem: 7F 00 00 00 deci EXP = 7F - 7F = 0 Mantisa este aparent 0 dar contine un 1. care in SHORT REAL nu se reprezinta. Ea este pentru numerele normalizate: 1 =< Mantisa < 2 deci Mantisa = 1 pentru X4 Valoarea lui X4 va fi: X4 = M*2**EXP = 1.*2**0 = 1. Procedam la fel pentru X5 = 5. care e reprezentat 00 00 A0 40 In registru va fi 40 A0 00 00 si dupa o deplasare stinga devine: 81 40 00 00 avind deci EXP = 81 - 7F = 2 Mantisa este M = 1. + 4/16 + 0/256 = 1.25 X5 = M*2**EXP = 1.25*2**2=1.25*4 = 5. care e valoarea corecta Se observa ca pentru a simplificarea calculului mantisei lucram cu puterile negative a lui 16 si cu cifrele hexa din mantisă. Calculam si valoarea lui X2 = 4.1 care se reprezinta prin: 33 33 83 40 si devine dupa inversarea cifrelor 40 83 33 33 iar dupa o deplasare dreapta 81 06 66 66 .Rezulta exponentul: EXP = 81 - 7F = 2 iar mantisa: M = 1. + 0/16 + 6/(16*16) + 6/(256*16) + 6/(256*256) + ... X2 = 2**2 *M = 4*M = 4 + 24/256 + 24/(256*16) +..=4.09375+0.00586 X2 = 4.09961 cu o aproximatie sub destul de buna sub 1% desi am neglijat ultimele 3 cifre hexa din mantisa Program de calcul pentru functia exponentiala Calculam valoarea functiei exponentiale prin descompunerea in serie dupa formula: E**x = 1 + x/1! + x**2/2! x**3/3! + x**4/4! + .... Calculam suma iterativ S = S + T pina cind termenul T devine mai mic decit EPS = 0.0001 Un termen Ti il calculam dupa formula T = T*X/I 104

Variabilele folosite si valorile initiale sint: S - suma partiala, initial S = 1 T - valoarea termenului curent, initial T = 1 I - rangul termenului curent, initial I = 1 In dreapta programului se vede structura considerata pentru stiva de registre a coprocesorului in momentul initial. ; ----------------------------------------------; PROGRAM DE CALCUL EXP(X) ; -----------------------------------------------.MODEL SMALL .STACK 256 .80287 .DATA EPS DD 0.00001 ;precizie X DD 2.541 EX DD 0. ;valoare calculata ST-----> +0 T=1 .CODE +1 I=1 START: MOV AX,@DATA +2 S=1 MOV DS,AX +3 1 ; Fiecare incarcare de registru e precedata de +4 X decrem. stiva reg. +5 FLD X ; incarcare X real FLD1 ; incarcare constanta 1. FLD ST ; S=1 FLD ST ; I=1 FLD ST ; T=1 CICLU: FMUL ST,ST(4) ; T=T*X =>ST FDIV ST,ST(1) ; T=T*X/I FADD ST(2),ST ; S=S+T FINCSTP ; incrementare pointer reg. FADD ST,ST(2) ; I=I+1 FDECSTP ; refacere pointer reg. FCOM EPS ; T < EPS ? FSTSW AX ; salvare indicatori si test FWAIT ; asteptare terminare instr. VF SAHF ; memorare indicatori in reg. FLAGS JL GATA ; test S=1 (indicator C0) JMP CICLU FLD ST,ST(2) ; memorare rezultat FST EX GATA: MOV AH,4CH INT 21H ; iesire in DOS END START

12.7. Conversie numere din intreg in flotant

105

virgula pentru mantisa VF 127+23 . PROGRAM DE CONVERSIE INTREG REAL 106 . .Consideram un numar binar intreg pe 4 octeti (32 biti). spre stinga. care dupa chemarea subprogramului SNF4 obtine numarul in flotant in DX:AX si il memoreaza peste mantisa initiala (vezi programul alaturat). . Subprogramul SNF4 considera ca mantisa este nenormalizata. existind 2 cazuri: a) . care are virgula virtuala in dreapta.b. Deplasarile spre stinga sau dreapta ale mantisei. Dupa ce mantisa a fost normalizata. pina cind primul bit din octetul 2 al mantisei devine 1. Pastrind separat mantisa si caracteristica vom avea un numar in VF cu: M = N*2**(-23) si CAR = 127+23 = 150 -caracteristica initiala Cum numarul nostru in VF este in general nenormalizat. atunci conversia unui numar intreg in VF se reduce la o normalizare cu o caracteristica initiala CAR=150 Pentru exemplificare consideram numarul intreg N = 5 N = 00 00 00 05 si CAR = 127 + 23 = 150 = 96H Pentru normalizare sint necesare 21 deplasari spre stinga: M = 00 A0 00 00 si CAR = 150 . trebuie sa marim caracteristica cu 23. care devine N*2**(-23). utilizind o macroinstructiune NF4. b) . . ca o mantisa supraunitara cu o caracteristica CAR asociata: N = N*2**0 => EXP = 0 => CAR = EXP+127 = 127 Daca N este considerat o mantisa pentru reprezentarea VF short real. Numarul ce se normalizeaza va fi dat prin mantisa M1 si caracteristica C1 separate. pentru a nu modifica valoarea numarului. Ele vor fi incarcate in DX:AX si respectiv in BX de macroinstructiunea NF4.21 = 129 = 81H Prin suprimarea bitului 1 implicit rezulta: M = 00 20 00 00 Adaugind caracteristica obtinem numarul in flotant: NF = 40 A0 00 00 care reprezinta in flotant numarul intreg 5. ce se gaseste in registrele DX:AX se face combinind o deplasare a unui registru cu rotirea prin carry a celuilalt.caracteristica initiala numar intreg Consideram numarul pozitiv intreg N.Este ocupata zona caracteristicii (primul octet). pe care o vom defini si care apeleaza un subprogram SNF4. il vom supune unei normalizari.b.virgula intreg CAR . care il vom converti in virgula flotanta (VF) pe 4 octeti (SHORT REAL) Numar intreg 23c.Mantisa are zerouri pe primele pozitii dupa virgula si in acest caz se fac deplasari spre stinga si decrementari ale caracteristicii. Pentru a nu schimba valoarea numarului. atunci virgula va fi vazuta deplasata cu 23 c. Daca avem macroinstructiunea de normalizare NF4. caz in care se fac deplasari spre dreapta a mantisei si incrementari corespunzatoare ale caracteristicii. -------------------------------. primul bit care este 1 implicit se sterge si mantisa se concateneaza cu caracteristica. N .

stinga mantisa shl ax.1 . normalizare prin depl dreaapta mantisa si increm.m1 . caract. nr in vf cx1 dw 127+23 . salvare registre mov ax. si mantisa PUSHA . pe 2 octeti CALL SNF4 . --------------------------snf4 PROC near . dreapta DX:AX shr dx. sterge bit 1 din mantisa (implicit=1) 107 . selectie bit1 cmp cl. car =car+1 si depl. bit1 din octet2 mantisa and cl.c1 . caracteristica implicita . Definitie macro pt normalizare vf nf4 MACRO c1.dx . car=car-1 si depl. test octet1 din mant =0 jz c2 .ax .CF <.stack 100 .AX rcl dx.7fh .data x dd 51420 . Concatenare CAR cu mantisa normalizata c3: and dl.dl . stinga mantisa si decrem. nr intreg xf dd 51420. .intrare mantisa 4 oct in DX:AX si caract in BX .model small . normalizare prin depl. CAR c2: mov cl. --------------------------------. --------------------------.287 dosseg .code . CAR c11: cmp dh.0 . verif.iesire nr in vf pe 4 oct in DX:AX .word ptr m1+2 mov bx. stinga inc bx .word ptr m1 . subprogram normalizare mov word ptr m1.. terminare normalizare dec bx .1 . DX <. .1 jmp c2 . memorare nr. peste mantisa initiala POPA ENDM . mantisa pe 4 octeti mov dx. Subprogram normalizare VF .80h jz c3 . normalizat mov word ptr m1+2. DX -> CF -> AX rcr ax. octet1=0 depl. caract.80h .1 jmp c11 .286c . .

Exponentul specifica nr.virgula va trebui mutata spre stinga si numarul va fi < 1. 8c. c) EXP > 31 .caracteristica Valoarea numarului in VF este: NF = M*2**EXP Pentru a avea deplasari numai intr-un singur sens. de pozitii indicate de exponent ( EXP = CAR-127 ).flotant. concatenare CAR si mantisa .virgula se va deplasa cu 31 c.b.b.b. deci intregul rezultat va fi N = 0.1 or dh. chiar peste virgula corespunzatoare numerelor intregi. Vom avea urmatoarele cazuri: a) EXP = 31 . conversie intreg real .numar intreg CAR . Algoritmul va fi invers decit la conversia intreg . iar restul fiind biti ce dau zecimale. si completam 1 implicit pe primul bit.) 108 . program principal conversie intreg flotant .shl dx. Vom considera numarul intreg rezultat dupa mutarea virgulei mantisei (care se gaseste acum dupa primul bit). spre dreapta.b.x . rezultind depasire (numar cu mai mult de 32 c. Mantisa va reprezenta chiar numarul intreg.ax .b.@data mov ds. deplasam initial mantisa la stinga cu 8 c. Mantisa va furniza cifrele semnificative ale numarului ( 6-7 la short real).bl shr dx.1 ret snf4 ENDP . iar caracteristica va da ordinul de marime. -----------------------------st1: mov ax. 23c. b) EXP < 0 . cif: nf4 cx1. spre dreapta cu nr. end st1 --------------------------------------------------- 12.virgula mantisa vf ' -virgula pt. -----------------------------.virgula trebuie mutata cu mai mult de 31 pozitii spre dreapta. de cifre binare intregi ale numarului.8. MANTISA '. Conversia numerelor din VF in intreg Si in acest caz separam caracteristica (CAR) de mantisa (M). care se pierd in cazul numerelor intregi.

iesire DX:AX numar intreg convertit . -------------------------------------------SCFI PROC NEAR mov bx. Subprogram conversie flotant . ------------------------------------.dx .intreg MACRO N.data mdep db 10.dx . nr. chemare subpr. verificare NF=0 or bx. numar intreg si flotant pusha . si va trebui adusa pe ultima pozitie din dreapta.intrare DX:AX numar flotant .word ptr nf CALL SCFI . . numar in VF x dd 0 . . NF > 0 109 . flotant pe 4 oct. numar intreg de referinta . flotant -intreg mov word ptr n+2. Aceasta se realizeaza cu 31 .456 care in hexa este NF = 40 5D 2F 1B CAR = 40H => EXP = CAR .'Depasire!! Nr.b. numar convertit intreg xr dd 51420 . --------------------------------------. PROGRAM DE CONVERSIE FLOTANT .NF .ax jnz c1 .13.model small . salvare registre mov dx.INTREG . conv. word ptr nf+2 . ------------------------------------------.virgula se va deplasa spre dreapta cu mai putin de 31 c.287 dosseg . CFI Definitie macro pentru conversie pozitiv flotant .EXP deplasari spre dreapta.b. Vom exemplifica algoritmul pe numarul NF = 3.7FH = 1 M = 00 5D 2F 1B .stack 100 . corespunzatoare numerelor intregi.intreg .286c . in VF prea mare $' xf dd 51420. si completare 1 implicit: M = DD 2F 1B 00 Pentru transformarea in numar intreg sint necesare 31 .ax ENDM .EXP = 31 .mantisa Dupa deplasarea stinga cu 8 c. memorare numar intreg mov word ptr n.d) 0 =< EXP < 31 . .1 = 30 deplasari spre dreapta si rezulta: N = 00 00 00 03 restul bitilor fractionari s-au pierdut .7FH = 80H . in DX:AX mov ax.

EXP = CAR-127 cmp bh.ax .1 loop d8 or dh.ax .31 . EXP < 31 mov dx.1 . EXP >31 . 0 =< EXP < 31 sub cl.1 .1 . ------------------------------------------ST1: mov ax. comparare EXP cu 0 jns c5 . NF = 0 => N = NF mov bx. bx = CAR shl bx.31 .CF <.xf .0 . Program principal conversie flotant intreg .0 c6: shr dx. 0 =< EXP < 31 xor ax. DX <. CL = 31-EXP nr. EXP<0 => N=0 mov dx.ax RET c5: mov cl.127 . DX -> CF -> AX loop c6 RET SCFI ENDP . conversie X -> XF .deplasari dreapta mov ch.9 int 21h RET c4: cmp bh. conv: CFI x. int 3 . terminare END ST1 -----------------------------------------------------------------c1: 110 .1 .RET . ------------------------------------------. 31-EXP deplasari dreapta mantisa rcr ax. EXP = 31 => N=NF nu se fac deplasari c3: js c4 .offset mdep .bh .AX rcl dx. comparare EXP cu 31 jnz c3 RET . 8 depl. stinga mantisa d8: shl ax.mesaj depasire mov ah.80h . bh = CAR mov cx.8 . fortare bit implicit 1 mantisa sub bh.dx .@data mov ds.