Sunteți pe pagina 1din 26

1.

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 8 AL BL CL DL 0 Acumulator Baze reg. Counter reg. Data reg.

15

0 Stack pointer Baze pointer Source index Destination index

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

0 Code segment Data segment Stack segment Extra segment

0 Instruction pointer Flag register

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


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

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

250 MOV AX,DS :[150]

MOV BX,ES :[40] Segment date locale DS=2000 000

150 Z=350 Segment date extern (comune) ES=5000 000 40 X=333 Segment de stiva .. .

- adresa absoluta 2000+150=2150

- adresa absoluta 5000+40=5040

SS=7500

Contine toate stivele folosite in program

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)
Tablou X +SI

COD instr.

Adresa relativa tablou X

X1

X2 X3

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 COD COD COD COD - instructiune pe un octet adr.rel operand2 adr.rel Mod r/m MOV AL,BL

-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 X[SI],5230

deplasament operand2 - instr 6 octeti MOV

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

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 reg - 3cb codul registrului sursa utilizat r/m - 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]

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 001 010 011 100 101 110 111 PUSHA w=1 w=0 Registre reg. pe 16cb reg. pe 8cb reg pe 32cb segment AX AL EAX ES 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 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 5

2. INSTRUCIUNI ARITMETICE SI LOGICE


2.1. Instruciuni de mutare
Instruciunile de mutare realizeaz transferul datelor intre registre, intre registre i memorie, intre registre i stiva. Transferurile se pot executa intre registre de aceeai lungime, iar la transferul intre registre i memorie lungimea este dat de registrul folosit. Instruciunile de mutare nu modific indicatorii de condiie. Toate mutrile se pot face pe 1,2,4 sau 8 octei. Mutrile sunt de forma:

MOV
reg,reg reg,const mem, const reg,mem mem,reg mem,mem

destinaie, surs

- unde ca argumente putem avea combinaiile:

- transfer intre registre pe 1, 2, 4 octei - ncrcare imediata constanta intr-un registru - ncrcare imediata constanta intr-o adresa de memorie - ncrcare coninut adres de memorie ntr-un registru - memorare coninut registru ntr-o locaie de memorie - !! este o combinaie interzis fiindc nu pot fi doua adrese n instruciune

Prin mem vom nelege o locaie de memorie specificat prin orice mod de adresare (direct, indirect, indexat). La indexare se pot folosi numai registrele SI si DI, iar la adresarea cu baz se pot folosi numai BX i BP. La toate adresrile se folosete un registru de segment implicit sau explicit. Registrele segment implicite sunt: CS - pentru instruciunile de salt n program DS - pentru toate datele utilizate SS - pentru adresarea stivei prin SP (Stack Pointer) sau cnd baza este BP. Exemple: MOV MOV MOV MOV MOV MOV MOV CL,DH - reg-reg pe 1 octet unde orice combinaie este posibil SI,DX - reg-reg pe 2 octeti aproape orice combinaie este posibil EDX,EBX - reg-reg pe 4 octeti BP,3420 - ncrcare imediata constanta intr-un registru pe 2 octei ECX,3420 - ncrcare imediata constanta intr-un registru pe 4 octei b/[4200],54 - ncrcare imediata const. intr-o adresa de mem. pe 1 octet w/[4200],54 - ncrcare imediata const. intr-o adresa de mem. pe 2 octei In memorie constanta 0054 se va memora pe cei 2 octei inversai 5400. Inversarea se produce la orice memorare de registru si la orice citire din memorie. MOV BX,[3450] - ncrcare coninut adres de memorie intr-un reg. pe 2 oct. MOV EBX[3450] - ncrcare coninut adres de memorie intr-un reg pe 4 oct. MOV [2400],DS - memorare coninut registru ntr-o locaie de memorie MOV X,DX - memorare coninut reg. ntr-o locaie de memorie in ASM MOV [BX],DX - memorare coninut reg. ntr-o locaie de memorie indirect MOV DX,X[SI] - ncrcare reg. din memorie cu adres indexata din tabel X MOV CX,[BX+SI+5]- ncrcare reg. din memorie cu adresa indirecta si indexata

Cnd nu se poate da implicit prin registru lungimea n AFD se precizeaz explicit prin: b/ - byte (1 octet) i w/ - word(2octei). n limbajul de asamblare (ASM sauTASM) lungimea explicit a operanzilor se d prin: MOV byte ptr[BP+5],25 - ncrcare imediata in memorie pe 1 octet MOV word ptr[BP+5],25 - ncrcare imediata in memorie pe 2 octei (word) MOV dword ptr[BP+5],25 - ncrcare imediata in memorie pe 4 octet (double word) MOV qword ptr[BP+5],25 - ncrcare imediata in memorie pe 8 octet (quadword) MOV tbyte ptr[BP+5],25 - ncrcare imediata in memorie 10 octei(ten byte la VF)

XCHG

operand1,operand2 (XChange) - Instruciune de interschimbare operand1 cu operand2 Pentru operand1 si operand 2 se pstreaz toate posibilitile de la instruciunea MOV. Ex: MOV AX,DX - se schimba coninutul registrelor AX cu DX MOV BX,X - se schimba coninutul registrelor AX cu variabila X Instruciunea NOP este echivalent cu XCHG AX,AX
Adresarea stivei (PUSH i POP) Stiva este o zon de memorie adresat prin registrul SP care indic elementul din vrful stivei (top). In stiv se ia din vrful stivei si apoi se incrementeaz SP. Cnd se pune n stiv nti se decrementeaz SP i dup aceea se memoreaz valoarea. PUSH reg16 - pune n stiv un registru pe 16 bii (PUSH BX) POP reg16 - ncarc din stiv un registru pe 16 bii (POP BX) PUSH reg32 - pune n stiv un registru pe 32 bii (PUSH EBX) POP reg32 - ncarc din stiv un registru pe 32 bii (POP EBX) PUSH mem - pune n stiv coninutul unei locaii de memorie pe 16 bii Este foarte util la transmiterea parametrilor spre subprograme (PUSH X). PUSH constanta - pune n stiv o constant pe 16 bii PUSHA - pune n stiv toate registrele pe 16 bii (AX;BX;CX,...) POPA - ncarc toate registrele pe 16 bii din stiv (starea programului) PUSHAD - pune n stiv toate registrele pe 32 bii (EAX;EBX;ECX,...) POPAD - ncarc toate registrele pe 32 bii din stiv PUSHF - pune n stiva registrul FLAGS (indicatorii de condiie) POPF - ncarc di stiv registrul FLAGS PUSHFD - pune n stiva registrul EFLAGS POPFD - ncarc di stiv registrul FLAGS STIVA 0 PUSH BX SP=SP-2 si BX [SP] POP BX [SP] BX si SP=SP+2 Top vrful stivei

SP N

BX Alpha Y

- (Load Effectiv Adress) - Instruciunea calculeaz adresa relativa si o memoreaz in registru utilizat. Ex: LEA AX,[BX+SI+15] - adresa operandului este memorata in AX

LEA reg,adresa

Este echivalenta cu: MOV AX,offset adresa offset = adresa relativa calculata La coprocesor nu exista dispozitiv de calcul al adresei si se poate folosi LEA

LDS reg16,dwpointer LES reg16,dwpointer

- reg16=offset adresa DS= adresa segment

ncarc registrul segment DS sau ES si registrul general de la o adresa de 4 octei unde se gsete adresa relativa a operandului si adresa segmentului din care face parte. Se folosete la comunicarea intre segmente pentru pregtirea registrelor de segment. dwpointer ofsset Adresa SI Adresa segment DS sauES LDS SI,dwpointer

2.2. Instruciuni aritmetice i logice


Instruciunile aritmetice i logice pot fi executate pe 1,2 sau 4 octei i sunt de forma: Adunare Adunare cu carry Scdere Scdere cu mprumut (borow) SI logic pe bit SAU SAU Exclusiv Comparaie (scadere) Comparaie cu SI ADD ADC SUB SBB AND OR XOR CMP TEST

dest,sursa

reg,reg reg,mem mem,reg reg,const mem,const

Lungime 1, 2 sau 4 octei

Toate instruciunile aritmetice i logice po ziioneaz indicatorii de condiie funcie de valoarea rezultatului. Rezultatul poate fi si in memorie Z=1 rez=0 sau operanzii sunt egali la comparaie S=1 rez<0 S=0 si Z=0 rez>0 - NU zero si NU negativ C=1 transport din rangul cel mai semnificativ. La instruciunile logice C=0 O=1 rezultatul depete capacitatea P=1 numrul biilor de 1 din rezultat este par Instruciunile logice se fac bit cu bit iar indicatorii se poziioneaz funcie de ntregul rezultat. Pentru a selecta un bit sau un grup de bii din rezultat se folosete o masc. C=1 nu nseamn depire. Depirea poate aprea la adunarea numerelor de acelai semn i S difer de acest semn. La adunarea numerelor negative apare obligatoriu C=1 fr a fi depire. 1001 1100 1000 1000 1000 AND Rez1 Masca Rez # 0 + 35 42 - E1 24 1 16 66 C=1 nu depasire + 75 4E + 77 14 - EC 62 S=1 Depasire transfer spre S 1101+ -3 1111 -1 11100 -4 C=1 si nu depas.

Rez>0

Rez<0

Comparaia CMP dest,sursa face scdere dest -sursa fr a modifica dest, dar cu poziionarea indicatorilor funcie de rezultatul scderii. S=0 dest > sursa S=1 dest < sursa Z=1 dest=sursa Comparaia TEST dest,sursa face un SI logic intre biii din dest i surs fr a modifica dest, dar cu poziionarea indicatorilor funcie de rezultat. Z=1 toi bitii din rezultat sunt 0, Z=0 cel puin un bit din rezultat este 1 (S nu are sens) Indicatorii de condiie se pot modifica prin program: Instruciune CLC STC CMC CLD STD Operaie C=0 C=1 C= ~C D=0 D=1 Observaii 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)

CLI STI LAHF SAHF

I=0 I=1 AH=Flag Flag=AH

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)

Instruciunile LAHF i SAHF sunt folosite pentru a prelua indicatorii de condiie din coprocesor i ai testa in procesor folosind instruciunile de salt condiionat JZ. Reamintim c nu exista instruciuni de salt la coprocesor. Instruciuni cu un operand sunt de tip logic sau aritmetic: NOT NEG DEC INC - complementare operand fa de 1 - complement operand fa de 2 (negativ) - decrementare operand - incrementare operand

Reg Mem

Operand pe 1, 2, 4 sau 8bii

2.3. Operaii n zecimal codificat binar (BCD) sau A SCII


Calculele zecimale se fac n binar pe un octet, utiliznd obligatoriu registrul AL i sunt urmate de o corecie zecimal. Coreciile zecimale nu au argumente i folosesc informaii din indicatorii de condiie C i AC (auxiliar carry). AAA DAA AAS DAS AAM AAD Ajustare pentru Adunare ASCII Ajustare pentru Adunare BCD (Binary Coded Decimal) Ajustare pentru scdere ASCII Ajustare pentru scdere BCD Ajustare pentru nmulire ASCII Ajustare pentru mprire ASCII (divide)

Corecia const n a aduna 6 la cifrele hexa ale rezultatului care depesc 10. Vom exemplifica pentru DAA si AAA DAA operanzi BCD Rezultat binar Corecie +auxcarry Rezultat zecimal AAA operanzi 34+ ASCII 38 6C corecie 6 Foreaz 0 si C=1 02 + 30 Rezultat ASCII afiabil 32

54 + 78 CC + 66 32

Program 1 de adunare pe 16 bii a elementelor a dou tablouri X i Y i memorarea rezultatului n Z. Vom considera 8 elemente ntr-un tablou i tablourile plasate la adresele hexa X la DS:0, Y la DS:10 i Z la DS:20. Z(I)=X(I)+Y(I) DS:0 0 2 SI 4 6 .. 0C 0E X X(1) X(2) X(3) DS:10 0 2 SI 4 6 .. 0C 0E Y Y(1) Y(2) Y(3) DS:20 0 2 SI 4 6 .. 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 terminm cu INT 3. Selectnd zona de memorie DS:0, DS:10 i DS:20 vom introduce manual valorile pentru elementele tabelelor X i Y. Vom lansa n execuie programul de la adresa 100 i vom verifica valorile obinute n tabloul Z de la adresa DS:20. Adresa 100 MOV 103 MOV 106 MOV 109 ADD 10C MOV 10F ADD 112 LOOP 114 INT ; index I=1 registrul de segment implicit este DS ; contor pentru cicluri (numr de elemente tablou) ;AX=X(I) ;AX=X(I)+Y(I) ; memorare rezultat la Z(I) ; incrementare index pentru rndul urmtor(I=I+1) ; salt pentru CX # 0 i face CX=CX-1 ; terminare program si revenire in AFD

SI,0 CX,8 AX,[SI+0] AX,[SI+10] [SI+20],AX SI,2 106 3

Pogram 2 de adunare a doua numere zecimale BCD sau ASCII de lungime 8 octei. Adunarea se va face din dreapta spre stnga octet cu octet. Se memoreaz in Carry transportul dintre ranguri si aduna la fiecare rang si carry cu ADC ( iniial C=0). Programul permite operaii pe orice lungime, modificnd numrul de octei (CX)

DS:0 DS:10 DS:20

X .. Y Z 31 33 35

SI 35 39 34

+
..

=
..

100 101 104 107 10A 10D 10E 110 113 114 116 119 C2:

CLC ; C=0 - primul rang nu exista transport MOV SI,7 ; SI poziionat pe ultimul octet MOV CX,8 ; numr de cicluri ( numr octei) MOV AL,[SI+0] ; X(i) ADC AL,[SI+10] ; AX=X(i)+Y(i) AAA ; sau DAA corecie zecimala ; OR AL,30 ; corecie ASCII modifica carry MOV [SI+20],AL ; memoreaz cifra rezultat in Z(i) DEC SI ; cifra urmtoare LOOP 107 ; MOV SI,0 ; corecie ASCII pentru afiare MOV CX,8 ; numr de cicluri (octei) ADD b/[SI+20],30 ; corecie ASCII cifra Z(i) INC SI LOOP C2 INT 3 ; terminare program

2.4. Instruciuni de nmulire si mprire


Operaiile aritmetice sunt definite n dispozitivul aritmetic pentru numere subunitare, dar pentru adunare i scdere sunt valabile i pentru numerele binare ntregi. Considerm 2 numere ntregi A i B pentru care facem o adunare pe 16 bii. 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 obinem rezultatul corect in ntreg (A+B) trebuie ca rezultatul sa-l nmulim cu 2**15 deplasam virgule cu 15 cifre binare spre dreapta. (A+B)=(A+B)*(2**-15)*2**15 15 S 2 1 0 Virgula zecimala pt nr. ntreg Virgula zecimala pentru nr. subunitar

Operaiile de nmulire i mprire se pot face cu operanzi pe 1,2 sau 4 octei. Sunt instrucii cu un singur operand, denmulitul/dempritul este implicit n registrul acumulator (Al, AX, EAX), iar cellalt operand poate fi ntr-un registru sau n memorie. MUL IMUL Operand pe 1,2,4 oct. AX=AL * operand DX:AX=AX*operand EDX:EAX=EAX*operand - nmulire fr semn - nmulire de ntregi cu semn

Rezultatul nmulirii este de lungime dubl fa de operanzi i se obine pentru operanzi pe 16bii n DX i AX n prelungire. La nmulire numerele se consider subunitare i niciodat nu poate apare depire. La IMUL (nmulire de ntregi cu semn) se face o corecie de deplasare spre dreapta a rezultatului cu o poziie binar. Numerele sunt vzute 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 poziii spre dreapta, deci n faa ultimei cifre binare. Rezultatul obinut trebuie mprit la 2, care echivaleaz cu o deplasare dreapta cu un bit. IMUL AX Op16 Rez 32cb 15 S S 31 S 0 X - numr ntreg n AX (X*(2**-15) X * Y numr ntreg pe 16bi (Y*(2**-15) Y = 0 0 Rezultat X*Y pe 32 bii n DX i AX X* Y AX (X*Y)*2**-30 necesare 30 depl.dreapta DX Virgula ca nr.zecimal - virgula ca numr ntreg

Imprtirea presupune ca dempritul este n registrul acumulator (AX, DX:AX sau EDX:EAX) mpritorul este ntr-un registru sau memorie. DIV IDIV AX / operand8 AL ct, AH -rest pe 1,2,4 oct. DX:AX / operand16 (mpritor) AX-ct, DX -rest EDX:EAX / operand32 operand - nprire fr semn - nprire de ntregi cu semn

La mprire trebuie s avem dempritul < mpritorul vzute ca numere subunitare fiindc rezultatul trebuie s fie subunitar. n caz contrar avem depire. In figur vzut ca subunitar 4250 < 35 i nu apare depire . Restul are semnul dempritului. IDIV DX:AX Op16 Rez 16bii 1 5 S S 3 1 S 0 X / Y = 4250 X - numr ntreg n AX (X*(2**-30) 35 0 Ct AX nr.zecimal Rezultat X/Y pe 16 bii n DX -rest i AX ct - virgula ca numr ntreg Y numr ntreg pe 16bi (Y*(2**-15)

Rest DX Virgula ca

La mprire numrul din AX trebuie extins spre stnga n DX, prin copierea bitului de semn. Operaia se face prin intruciunile: CBW - Convert Byte to Word - extindere AL pe AX CWD - Convert Word to Double word - extindere AX pe DX:AX CDQ - Convert Double word to Quad word - extindere EAX peEDX:EAX Exist i instruciuni de extindere cu Zero MOVZX sau cu Semn MOVSX prin mutare: MOVSX CX,BL MOVZX EAX,CX MOV AX,4520 CWD - extindere pe DX:AX IDIV CX - Ct n AX i Rest n DX Exemplu de calcul expresie: E=(A*B+C)/(A+B) unde A,B,C sunt numere ntregi 16 bii MOV AX,A IMUL word ptr B ; rezultatul A*B n DX:AX ADD AX,C ; se aduna C la AX tiind ca rezultatele nu depesc 2 octei(16biti) MOV BX,A ADD BX,B ; BX=A+B CWD ; extensie AX pe DX pentru mprire IDIV BX cat in AX=AX/BX restul in DX MOV CAT,AX ; memorare cat MOV REST,DX ; memorare rest

2.5. Instruciuni de deplasare


Instruciunile de deplasare se fac numai n registre pe 1,2 sau 4 octei. Deplasrile pot fi: - spre stnga sau spre dreapta - logice sau aritmetice - deschise sau circulare (Rotate) Deplasarea se face cu un numr de bii (1-32) dat n registrul CL sau n instruciune. SAL SHL SAR SHR ROL ROR RCL RCR Shift Aritmetic Left - deplasare deschis Shift (logic) Left Shift Aritmetic Right Shift (logic) Right Rotate (logic)Left - deplasare circular Rotate (logic) Right Rotate (logic)Left whith Carry Rotate (logic) Right whith Carry 2

Reg,1 Reg,n Reg,CL

Deplasrile aritmetice - spre stnga se consider nmuliri cu 2**N i pot da depire - spre dreapta se consider mpriri cu 2**N La toate deplasrile bii care ies din registru trec prin Carry. Prezentm n figurile de mai jos modul de efectuare a operaiilor de deplasare: SAL Shift Aritmetic Left 0 SHL Shift Left

ROL Rotate Left

RCL Rotate Left whith Carry

S 0 C SHR Shift logicRight

S Se recopiaz semnul S

C SAR Shift Aritmetic Right

C ROR Rotate 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 mai multor bii dac sunt pe 1 se poate face prin secvena: MOV AX,X AND AX,0C0H CMP AX,0C0H JZ OK - masca ce indic primi 2 bii - verifica dac rezultatul este egal cu masca - cei 2 bii sunt pe 1

Dac trebuie verificai biii care sunt pe 0 se face nainte complementarea lui X (NOT). Testarea unui bit se face i prin instruciunea TEST care face AND ntre cei 2 operanzi, poziioneaz indicatorii de condiie, fr a modifica operandul destinaie. Se poate folosi instruciunea imediat cu masca bitului testat: TEST JNZ TEST JNZ AX,02H bit2 X,4000H etX2

; bitul 2 din dreapta este 1 ; verific bitul 2 din stnga lui X ; bitul este 1 3

Testarea unui bit se poate face la procesoarele pe 32 de bii cu instruciuni speciale: BT - testeaz bitul indicat i l memoreaz n C (carry) BTC - testeaz bitul indicat i l complementeaz (Bit Complement) BTR - testeaz bitul indicat i l pune pe zero (Bit Reset) BTS - testeaz bitul indicat i l pune pe 1 (Bit Set) BT JC AX,4 ; verifica bitul 4 din AX i il trece n C (carry) bit4 ; salt pentru bit4=1

3. LIMBAJUL DE ASAMBLARE
Limbajele de asamblare permit scrierea programelor folosind: mnemonici pentru instruciunile procesorului i coprocesorului, directive pentru descrierea datelor directive pentru controlul programului (segmentare, module, proceduri) funcii DOS apelate prin ntreruperi macroinstruciuni definite de utilizator Pentru procesoarele Intel se folosesc curent asambloarele: MASM (MacroAssembler) de la Microsoft mpreun cu editorul de legturi LINK TASM (TurboAssembler) de la Borland

3.1. Asamblarea programelor


Programul surs scris n limbaj de asamblare va avea extensia .ASM i trebuie s treac prin mai multe faze pentru a fi transformat n program executabil direct (Prog.EXE). Include Prog.asm surs ASAMBLOR Prog.obj obiect Bibl.lib Mod.obj LINK EDITOR Prog.map Date Prog.exe executabil EX2BIN Rezultate

Prog.lst Fisier listing

Prog.com

Asamblorul prelucreaz un fiier text surs (Prog.asm), scris cu un editor de texte i genereaz un modul obiect (Prog.obj) care conine instruciuni i date ce sunt plasate de la adresa 000. Se mai genereaz i un fiier listing al programului compilat (Prog.lst). Programul surs poate face referire prin directiva INCLUDE i la alte fiiere surs (subprograme), care vor fi nglobate prin copiere n programul surs. Modulele obiect nu sunt executabile, dar pot fi depuse in biblioteci (Bibl.lib). LINK EDITORUL prelucreaz modulele obiect obinute prin compilare (asamblare) i alte module obiect din biblioteci. Din asamblarea lor rezult un program executabil ( Prog.exe), n care adresele modulelor i adresele relative din instruciuni sunt recalculate i se face legtura ntre modulele care fac apel la alt modul (subprograme). Adresele din instruciuni se recalculeaz relativ la nceputul segmentului innd cont d e adresa modulului n segment. Un program poate conine mai multe segmente. Adresele simbolice definite n alt modul trebuie date ca EXTRN, iar cele care sun referite din exterior declarate cu PUBLIC. Asamblorul va genera cte un tabel cu etichetele referite n exterior (EXTRN) i unul cu etichetele care pot fi referite din exterior (PUBLIC), n care se specific adresa lor din modul. Tabelele de definiii externe i referine externe se pstreaz n modulele obiect i vor fi folosite de linkeditor pentru rezolvarea referinelor externe prin completarea adreselelor care fac referire la etichete din alte module. n fiierul Prog.map se gsesc noile adrese ale modulelor i ale etichetelor definite ca externe. Programul executabil (Prog.exe) poate fi lansat ca o comand DOS, care prelucreaz datele i se obin rezultatele. Prin programul EX2BIN se poate obine o variant Prog.com a programului. 4

0 0

Module .obj Pr1.obj

0 Pr1.exe

Simbol c1 k alfa

32 jmp c1 n1 0 Pr2.obj 20 c1 mov ax,bx n2 0 Pr3.obj

Referine ExternePr1 Adr.unde Adresa real e utilizat 32,67,89 20+n1 170,230 60,540

n1 Definiii Simbol c1

n1+n2

externe Adr.unde e definit 20

Pr2

n n3

3.2. Scrierea programelor surs


Linia de program surs n limbaj de asamblare are structura: Eticheta: cod_instr directiva arg1,arg2 arg1,arg2,arg3,.... ; comentariu ; comentariu

Exemplu: C1: MOV AX,[BX+SI+20] ; - ncarc reg.AX cu un element X(I) ...... X DW 3490,43,780,4000,500 ; iniializare elemente tablou X Tipuri de constante B binare H hexazecimale O octale D zecimal

0111011B 0BA56H 6573Q 4586D sau 7500

; MOV CX,0FFH ; MOV SI,342Q ; implicit numerele se consider zecimale

Directive pentru definire date: DB Define Byte ; definire pe un octet DW Define Word ; definire pe 2octei DD Define Double word ; definire pe 4 octei DQ Define Quadword ; definire pe 8 octei DT Define Ten Byte ; definire pe 4 octei EQU constanta ; da etichetei valoarea constantei ORG adresa ; foreaz contorul de amplasare la adresa specificat ALIGN n ; unde n=1,2,4,8,16 aliniere contor amplasare la multiplu INCLUDE fisier.asm ; copiaz n acel loc o secven de program (subprogram) Exemple: A1 DB A2 DW A21 DW A4 DD A41 DD A7 DW P1 EQU 12,0,0ACH,345Q,041H,TREN rapid 9542,0DE89H,20,0,TR A1,A2 ; se genereaz adresele relative a lui A1 i A2 54,89589BAH A1,A2 ; adresele relative a lui A1 i A2 cu adresa segmentului 20 DUP(20h) 16 ; eticheta P1 echivalat cu 16 (adres port) 5

CR

MOV DX,P1 ; DX=16 EQU 0DH ; Cod ASCII CR

Directive de control program NAME nume_modul ; d numele modulului compilat Un modul poate fi o procedur care e cuprins ntre: nume_proc PROC near sau far ; inceput de procedur .......... RET [n] ; ieire din procedur cu eliberare stiv nume_proc ENDP ; sfrit de procedur END start ; directiva de sfri de asamblare care d adresa de lansare program Atenie END se pune dup ultimul modul din program. PUBLIC var1,var2,.. ; declarare variabile ca definiii externe EXTRN simbol1:tip1, simbol2:tip2,.. ; declarare referine externe spre alte module Unde tip este byte, word, dword, qword pentru date specificnd lungimea - near i far pentru etichete apelate prin Jump sau Call Tipul permite asamblorului s genereze instruciuni pe lungimi corecte. Menionm c n limbaj de asamblare nu exist tipuri ntregi, reale, logice, caracter ca n alte limbaje. E2 LABEL far sau near ; definire explicit et ichete locale (near) sau externe (far), care se pot apela din exterior. 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],[combinare],[clasa] .... nume_seg ENDS align - page - segmentul ncepe la multiplu de 256 - para - multiplu de 16 (paragraf) - word - multiplu de 2 - byte - multiplu de 1 Combinarea cu alte segmente: - none -implicit - public - common - segmente care se ncarc n paralel n aceeai zon de memorie - memory -segmente tratate mpreun de editor i plasate la sfritul memoriei - AT adresa - specific adresa la care se ncarc segmentul - stack - segment definit ca stiv i tratat ca public ( bazat cu SS) ASSUME CS:seg1,DS:seg2,ES:seg3,SS:seg4 precizeaz registrele segment utilizate la adr esarea datelor din fiecare segment. Programul urmtor conine un singur segment mixt code+date+stiva. ; ---------------------------------------------------Lab3_0.doc ; Scadere doua numere zecimale codificate binar ; de lungime n Z=X-Y ; considerate ca tablouri ; --------------------------------------------------pr1 segment assume cs:pr1,ds:pr1,ss:pr1 ; exist un singur segment mixt st1: mov ax,pr1 ; initializare registre segment mov ds,ax 6

mov ss,ax mov sp,offset stiva ; iniializare pointer stiva mov cx,8 ; numar cifre zecimale mov si,7 ; index ultima cifra e1: mov al,x[si] sbb al,y[si] ; X(I) - Y(I) das ; corectie zecimala pt.scadere mov z[si],al ; memorare octet rezultat dec si ; index octet urmator loop e1 ; ciclu pina CX > 0 int 3 ; revenire in afd (terminare) ; zona memorie pentru date ; ------------------------------------x db 32h,13h,33h,72h,29h,46h,51h,29h ; descazut y db 29h,14h,66h,75h,19h,83h,25h,11h ; scazator z db 8 dup(0) ; rezultat ; Zona pentru stiva ; ------------------------------------db 256 dup(?) ; rezervare spaiu stiva stiva equ $ ; vrful initial al stivei - $ este adresa curenta contor amplasare pr1 ends end st1 ; adresa lansare program Dac programul conine numai cte un segment de fiecare t ip se poate simplifica scrirea specificnd unde ncepe segmentulde code .CODEde date DATA i stiv .STACK. Rezervarea spaiului pentru stiv se face pe lungimea dat i automat se ncarc reg.SS. Modulul de date se numete implicit @DATA referit pentru ncrcare registru segment DS. 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. ; ---------------------------------------------------Lab3_1.doc ; Programul numara bitii de 1 din fiecare element ; al tabloului X si memoreaza numarul de biti ; in elementele tabloului NX ; --------------------------------------------------Dosseg ; mod DOS de tratare segmente .model small ; model pe cu segmente de 64Ko .stack 256 ; rezervare 256 octeti pentru stiva ; Segmentul de date ; ------------------------------------.data X dw 7676h,9541h,5463h,2234h,0FFEEh NX db 5 dup(0) ; nr biti elemente tab X N equ 5 ; numar elemente tablou X ; Segmentul de code al programului ; ------------------------------------.code st1: mov ax,@data ; initializare registrul segment de date DS mov ds,ax ; mov si,0 ; index in tabloul X mov di,0 ; index in tabloul NX mov dh,N ; nr. elemente tablou ; Ciclu pentru numarare biti element X(I) c1: mov ax,X[si] ; incarcare element X(I) 7

c2:

c3:

mov shl jnc inc loop add inc dec jnz int end

cx,16 ax,1 c3 NX[di] c2 si,2 di dh c1 3 st1

; numar ranguri binare ; deplasare stinga cu un rang ; bitul este zero ; bitul este 1 ; urmatorul rang ; urmatorul elment din X(I) ; verificare sfirsit tablou X ; terminare program ; adresa lansare program

4. INSTRUCIUNI DE CONTROL AL PROGRAMULUI


4.1. Instruciuni de salt
Programul execut calcule i funcie de rezultate le obinute, se poate ramifica utiliznd instruciunile de salt condiionat i necondiionat. Dup fiecare instruciune aritmetic sau logic, funcie de valoarea rezultatului se poziioneaz indicatorii de condiie, care pot fi testai de instruciunile de salt condiionat. Trebuie menionat c instruciunile de mutare i cele de salt nu modific indicatorii . Salt necondiionat JMP (Jump) Saltul const n memorarea adresei de destinaie a saltului n reg. IP (Instruction Pointer). Exist 3 tipuri de salt necondiionat direct: Short Jmp - salt scurt cu +127 pn la -127 fa de IP (instruciunea curent) Cod instr Deplasament Short Jmp deplasament pe 1 octet EB -50 IP=IP-50 JMP short etich1 Near Jmp - salt n segmentul curent cu -32K pn la +32K fa de IP

Cod instr Deplasament Near Jmp deplasament pe 2 octet E9 25400 IP=IP+25400 Far Jmp - salt n afara segmentului curent i trebuie modificat IP i reg. CS JMP etich2 Cod Deplas. in segm Reg CS EA 4200 Adresa segment IP=4200 CS=adresa segment Far Jmp deplasament pe 4 octei

Saltul de tip far (ndeprtat) se face ntre segmente i se modifica att IP ct i registrul de segment CS n care se ncarc adresa segmentului care conine eticheta destinaie. S1 SEGMENT EXTRN ...... JMP ..... SEGMENT PUBLIC LABEL - definire et5 ca etichet extern - salt n segmentul S2 care conine eticheta et5 - definire eticheta et5 ca definiie extern - definire eticheta et5

et5:FAR far ptr et5

S2 Et5

et5 FAR

Salturi indirecte prin registre La salturile indirecte adresa la care se face saltul se specific ntr -un registru. Adresa poate sa s se refere la un tabel de adrese de salt care pot fi selectate prin modificarea dinamic a registrului folosind indexarea. JMP BX - adresa de salt este coninut n BX MOV BX,offset et6 JMP BX - adresa etichetei et6 se ncarc n BX - salt la eticheta et6 din segment (near) 1

JMP word ptr [BX] JMP dword [BX] MOV ADD JMP ..... MOV ADD JMP ..... Tadr1: DW DW DW Tadr2: DD DD DD

- BX conine adresa unei tabele de adrese de salt - tabela de adrese de salt este de tip FAR(CS:IP)

BX,offset Tadr1 - ncarc n BX adresa unei tabele de adrese de salt BX,SI - adun poziia adresei de salt dorite din tabel(* 2 ) word ptr [BX] - salt la adresa et1, et2 sau et3 locale BX,offset Tadr2 - n BX adresa unei tabele de adrese de salt de tip FAR BX,4 - adun poziia adresei de salt dorite din tabel( *4) dword ptr [BX] - salt la adresa et6 din alt segment - tabel de etichete locale in segment pe 16 bii(near)

et1 et2 et3 et5 et6 et1

........ - tabel de etichete de tip FAR pe 32 bii(near) ce conin i adresa segmentului - chiar dac este etichet local este pe 4 octei

In exemplul de mai sus s-au generat 2 tabele cu adrese de salt. Tabela Tadr1 conine adrese locale n segment generate pe 16 bii (NEAR) ce vor fi ncrcate n IP, iar Tadr2 conine adrese de tip FAR generate pe 4 octei care conin adresa relativ n segment (deplasament) i adresa segmentului din care face parte eticheta i care va fi ncrcat n registru CS. Eticheta et1 care este local , n Tadr1 se genereaz pe 2 octei iar n Tadr2 se genereaz pe 4 octei fiindc face parte dintr-un tabel de adrese de tip FAR. In registru BX s-a ncrcat tabela de adrese locale pe 16 bii Tadr1 i n registrul SI adresa relativ a unei adrese de salt din tabel ca multiplu de 2. La JMP word ptr [BX] se sare la una din adresele et1,et2 sau et3. Prin word ptr se precizeaz c adresele de salt sunt pe 2 octei i valoare se ncarc n registru IP. La JMP far ptr [BX] se apeleaz o adres din tabela Tadr2 i primi 2 octei se ncarc n IP iar urmtorii 2 n CS.

4.2. Salturi condiionate


Instruciunile de salt sunt de tip SHORT (+127 la -127) sau NEAR ( procesoa-rele pe 32 de bii) i pot referi etichete numai din segmentul curent. Ele nu pot referi etichete din alt segment. Forma general a instruciunii este: Jcond eticheta - dac condiia este ndeplinit salt la eticheta specificat

Instruciunile aritmetice i logice poziioneaz indicatorii de condiie funcie de valoarea rezultatului , care pot fi testai de instruciunile de salt condiionat. La instruciunile de comparare se va ine cont ca se face o scdere dest - sursa. Rez < 0 S=1 Rez >0 S=0 si Z=0 Rez=0 Z=1 Transport C=1 Paritate para P=1 - numrul biilor de 1 este par Depire O=1 Prezentm mai jos principalele mnemonice pentru instruciunile de salt condiionat: Instruciunea Condiie Comentarii 2

testat S=1 Salt la Rez<0 Jump on Sign/Low JS sau JL Salt la Rez>=0 Jump No Sign/Greater or Equal JNS sau JGE S=0 Z=1 Salt la Rez=0 Jump if Zero/Equal JZ sau JE Salt Rez # 0 Jump if Not Zero/Equal JNZ sau JNE Z=0 S=0 si Z=o Salt la Rez>0 Jump Greater JG S=1 or Z=1 Rez<=0 Jump if Low or Equal JLE C=1 Salt la transport Jump on Carry JC C=0 Salt la Nu transpot Jump if Not Carry JNC C=0 si Z=0 Salt la mai mare Jump if Above (comp. fara semn) JA C=0 Salt la mai mare/egal Jump if Above or Equal JAE C=1 Salt la mai mic Jump if Below JB C=1 or Z=1 Salt la mai mic/egal Jump if Below or Equal JBE P=1 Salt la paritate para Jump Parity Even JP sau JPE Salt la paritate impara Jump Not Parity/ Parity Odd JNP sau JPO P=0 O=1 Salt la depasire Jump if Overflow JO O=0 Salt la Nu depasire Jump if Not Overflow JNO CX=0 Salt la CX=0 Jump if CX=0 JCXZ ECX=0 Salt la ECX=0 Jump if ECX=0 JECXZ CX # 0 Salt pentru CX # 0 CX=CX-1 si Jump pentru CX#0 LOOP Salturile JA, JAE, JB si JBE se refera la comparaii unde elementele sun fr semn. Instruciunile SETcond memoreaz 1 la adresa daca se ndeplinete condiia testat: SETS adresa pune 01H la adresa daca S=1 Salturi pentru control cicluri LOOP adr ; CX=CX-1 i salt dac CX # 0 LOOPZ adr ; CX=CX-1 i salt dac Z=1 i CX # 0 LOOPE ; ieire pentru CX=0 sau Z=0 LOOPNZ LOOPNE adr ; CX=CX-1 i salt dac Z=0 i CX # 0 ; ieire pentru CX=0 sau Z=1

4.3. Proceduri
Programarea modular presupune utilizarea subprogramelor, care asigur o dezvoltare ulterioar simpl a programului i o depanare uoar. O procedur este o secven de instruciuni care execut un algoritm pe baza unei descrieri formale. Avantajul procedurilor este c ele sunt reutilizabile. In limbaj de asamblare exist proceduri (nu exist funcii), definite cu directiva PROC i terminate cu ENDP. Revenirea din procedur n programul chemtor se face cu instruciunea RET. Chemarea unei proceduri se face cu instruciunea CALL. Parametrii procedurii se plaseaz naintea chemrii n registre, intr-o zon de memorie sau n stiv. La scrierea procedurii se stabilete modul de transmitere a parametrilor. Parametrii pot fi transmii prin valoare sau prin adres. Tehnicile de transmitere a parametrilor spre subprograme se vor discuta n capitolul 4. Vom exemplifica cu utilizarea unei proceduri care face media a 2 numere ntregi X i Z care se plaseaz n registrele AX i BX. Rezultatul se obine la ieirea din procedur n AX i se va plasa la revenirea n programul principal n variabila Z. DOSSEG .MODEL SMALL .STACK 100H .DATA X DW 2540 Y DW 15417 Z DW 0 ; Z=(X+Y)/2 rezultat C2 DW 2 ; constanta 2 3

.CODE ; Pregtire parametrii... ST1: MOV AX,X ; primul parametru MOV BX,Y ; parametru 2 CALL Pmed ; chemare subpr. Adr.de revenire n stiv (Top stiva=IP) MOV Z,AX ; memorare rezultat ... Pmed PROC NEAR ; procedur local (near) ADD AX,BX ; AX= X+Y CWD ; se putea SHR AX,1 IDIV C2 ; AX=(X+Y)/2 RET ; revenire n program la adresa de revenire din stiv (IP=Top stiv) Pmed ENDP ; sfrit procedur END ST1 La chemarea unui subprogram prin CALL, se pune adresa de revenire (IP) n stiv i se sare la prima instruciune din procedur (IP=offset Pmed). In procedur se execut secvena de instruciuni pn la instruciunea RET, care ncarc n IP adresa din vrful stivei revenind la instruciunea urmtoare dup CALL. Instruciunea CALL se deosebete de JMP doar c depune n stiv registru de instruciuni IP, care va fi utilizat de RET pentru a reveni n program i a continua cu instruciunea urmtoare. La chemarea unei proceduri de tip FAR, care poate fi n alt segment, instruciunea CALL are adresa pe 4 octei i depune n stiv att IP ct i CS i ncarc din adresa instruciunii noile valori pentru IP i CS. O procedur de tip FAR se deosebete de una de tip NEAR doar prin faptul c instruciunea RET incarc din stiv att adresa de revenire n IP ct i adresa segmentului n CS. Se recomand ca procedurile s fie globale (de tip FAR) pentru a putea fi pstrate n orice segment i s poat fi apelate din oricare segment de program. Instruciunea RET are codul C3H pentru proceduri de tip NEAR i CBH pentru cele de tip FAR. CALL .... Pmed PROC .... RET far ptr Pmed ; pune n stiv IP i CS FAR ; incarc din stiv IP i CS

Near CALL - pune n stiv IP - salt n segmentul curent cu -32K pn la +32K fa de IP Cod instr Deplasament CALL 25400 IP=IP+25400

Near CALL deplasament pe 2 octet

Far CALL - pune n stiv IP i CS - salt n afara segmentului curent i trebuie modificat IP i reg. CS Cod Deplas. in segm Reg CS CALL 4200 Adresa segment IP=4200 CS=adresa segment Far CALL deplasament pe 4 octei

Ca i la JMP se pot face apeluri de proceduri indirect prin registre: CALL BX ; adresa procedurii este n BX CALL word ptr [BX] ; n BX adresa unei tabele de adrese de proceduri locale CALL dword ptr[BX] ; n BX adresa unei tabele de adrese de proceduri globale 4

4.4. Exemple de programe


4.4.1. Conversia din zecimal n binar Dispozitivele periferice ale calculatorului(tastatur, ecran, imprimant) sunt proiectate s lucreze cu iruri de caractere codificate n ASCII. Numerele se introduc ca ir de cifre zecimale codificate n ASCII avnd codurile 30, 31h, 32h, 33h,...39h pentru 0, 1, 2, 3,...9. Pentru a putea face calcule n dispozitivul aritmetic, care lucreaz n binar, irul de cifre trebuie convertit. Numrul 14257 introdus de la consol este un ir ASCII reprezentat sub forma: Adresa sir Cifre max DX 0A Nr.cifre 05 SI 31 34 32 35 37 BX adresa nceput numr zecimal

Lum pe rnd cifrele i eliminm primi 4 bii (3 din fa) i obinem valoarea lor n binar. Calculul numrului binar corespunztor l facem iterativ folosind valoarea cifrele codificate n binar astfel: N=1*10000+4*1000+2*100+5*10+7 Se poate calcula iterativ fr a folosi puterile lui 10 dup algoritmul N=0 N=((((0+1)*10+4)*10+2)*10+5)*10+7 Programul prezentat mai jos citete de la tastatur un numr ASCII de maxim 5 cifre ASCII ( reprezentabil pe 2 octei) memorat la adresa Z1 i apeleaz o procedur de conversie care funcioneaz dup acest algoritm. Funcia DOS de afiare mesaj are codul 9 (09H) care se pune n AH i cere adresa mesajului n DX. Mesajul de afiat se va termina obligatoriu cu $. Funcia DOS de citire mesaj de la tastatur are codul 10 (0AH), care se pune n AH i cere adresa irului de recepionat n DX. Zona ce recepioneaz irul (Z1) are n primul octet numrul de octei maxim ateptai, iar n octetul 2 numrul de octei recepionai (irul se termin cu enter). La chemarea procedurii de conversie CZB n BX se ncarc adresa primului caracter din irul de cifre zecimale i n CX numrul de cifre zecimale. Rezultatul va fi returnat n registrul AX ; -------------------------------------; Conversie zecimal ASCII - binar 2 octeti ; -------------------------------------.286c dosseg .model small .stack 100 .data ; numar zecimal ASCII introdus de la tastatura z1 db 10,0,10 dup (30h),10,13,'$' ; nr zecimal zece dw 10 n db 0 ; numar cifre zecimale dw 17394 ; pentru verificare rezultat bin dw 0 ; numar binar rezultat m1 db 13,10,'Introduceti un numar de 5 cifre:',13,10,'$' .code st1: mov ax,@data mov ds,ax mov dx,offset m1 ; afisare mesaj dialog mov ah,9 int 21h 5

mov dx,offset z1 ; adresa numar zecimal mov ah,10 ; asteptare numar int 21h mov bx,offset z1+2 ; adresa prima cifra mov cx,0 mov cl,z1+1 ; numar de cifre numar zecimal call czb ; procedura conversie zec-bin mov bin,ax ; memorare numar binar int 3 ; ----------------------------------------; Procedura conversie zecimal ASCII -binar 2 octeti ; - intrare BX = adresa numar zecimal, CX = numar cifre zecimale ; - iesire AX = numar binar ; ----------------------------------------czb proc xor ax,ax ; AX = 0 mov si,ax ; index prima cifra mov n,cl ; numar cifre zecimale c3: mov cl,[bx+si] ; incarcare cifra ASCII and cl,0fh ; anulare primii 4 biti mul zece ; N = N*10 add ax,cx ; N = N*10 + cifra inc si ; urmatoarea cifra dec n jnz c3 ret czb endp end st1 4.4.2. Conversie binar-zecimal ASCII Considerm un numr binar N pe 16 bii care trebuie afiat pe monitor n ASCII. Conversia n zecimal se face n procedura CBZ, mprind repetat numrul cu 10 i reinem resturile mpriri i din DX, care se memoreaz ntr-o zon ZEC din dreapta spre stnga. Ieirea din ciclu se face cnd ctul mpririi din registrul AX este zero. La intrarea n procedur se verific dac numrul este negativ, caz n care se complementeaz i se poziioneaz un indicator (CH=1). nainte de ieirea din procedur se verific indicatorul i dac numrul a fost negativ i se pune un n fa, iar dac a fost pozitiv se pune un +. La chemarea procedurii se ncarc n AX numrul binar ce trebuie convertit, n B X adresa zonei ZEC unde se va pune irul zecimal i n SI poziia ultimului octet n ir. La revenirea din procedur se afieaz rezultatul cu functia DOS avnd codul 9. Se putea utiliza numai SI care s conin adresa ultimului octet din ir MOV SI,offset zec+5

.286c ; -------------------------------------dosseg ; Conversie binar - zecimal ASCII .model small ; -------------------------------------.data ; numarul zecimal ASCII rezultat se afiseaza zec db 6 dup (20h),10,13,'$' ; rezultat zecimal zece dw 10 n db 0 bin dw -17394 ; numar binar de convertit m1 db 13,10,'Numarul in zecimal este:',13,10,'$' 6

st1:

.code mov mov mov mov int mov mov mov call mov mov int mov int

ax,@data ds,ax dx,offset m1 ah,9 21h si,6-1 bx,offset zec ax,bin cbz dx,offset zec ah,09h 21h ah,4Ch 21h

; afisare mesaj de dialog

; index ultima cifra zecimala ; adresa zona numar zecimal ; numar binar ; conversie binar zecimal ; afisare rezultat conversie ; terminare program iesire in DOS

; Procedura conversie binar - zecimal ASCII ; - intrare AX = numar binar BX = adresa zona pt numar zecimal ; SI = index ultima cifra zecimala cbz proc xor cx,cx ; CX = 0 or ax,ax ; pozitionare indicatori jge d1 ; numar pozitiv mov ch,1 ; indicator numar negativ neg ax ; valoare absoluta d1: mov dx,0 ; pregatire impartire div zece ; bin/10 CIT in AX or dl,30h ; corectie ASCII REST din DL mov byte ptr [bx+si],dl ; memorare cifra zecimala dec si ; index cifra urmatoare or ax,ax ; verificare CIT = 0 jnz d1 ; ciclu daca AX > 0 mov byte ptr [bx+si],'+' ; semn implicit or ch,ch ; verificare indicator negativ jz sf mov byte ptr [bx+si],'-' ; semn negativ sf: ret cbz endp end st1 4.4.3. Program nmulire dou numere zecimale ASCII .286c Dosseg .model small .data ;--------------------------------------; Utilizare subprograme de conversie ; Calcul c = a*b de la tastatura ; --------------------------------------

; In z1 se transfera numerele zecimale ASCII z1 db 10,0,10 dup (30h),10,13,'$' zece dw 10 n db 0 m1 db 13,10,'Introduceti ' a db 10,13,'a: $' b db 10,13,'b: $' abin dw 0 ; numere binare 7

bbin cbin czec zec

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