Sei sulla pagina 1di 18
Formatul general (extern) al instructiunilor Instructiunile microprocesoarelor 18086/I8088, scrise in limbaj de asamblare, au formatul tipic acestor limbaje, constituit din mai multe cimpuri: Operand!, Operand2 Mnemonica codului Operand [; Comentariu} ( Bticheta:) ae unde parantezele drepte [_ } aratd cd elementele incluse pot apare sau nu in mod facultativ, iar acoladele { } indic& faptul cd numai un element din cele scrise pe vertical poate apare intr-o instructiune data. Campul Eticheta este optional, iar cfnd apare este un identificator c&ruia i se asociaz adresa primului octet al instructiunii respective. Mnemonica codului de operatie este numele simbolic al instructiunii sau al unui grup de instructiuni; apare obligatoriu in orice instructiune Campul operanzi poate contine doi operanzi, unul sau niciunul, in functie de tipul instructiunii, Cand exists doi operanzi, primul este operandul destinatie, iar cel de-al doilea, operandul surs’. Operanzii identificd datele asupra cirora actioneaz& instructiunea, modul de adresare si alte informatii auxiliare. Campul Comentariu este optional, Acesta serveste pentru cresterea inteligibilitatii programului, La asamblare, textul comentariului este ignorat de catre asamblor. Exemple: mov bx, 7a2h ; Incarca registrul BX cu valoarea 7a2h alfa: mov beta (bx][di], al __; Transfer octetul din AL la adresa OFFSET beta + BX + ; DI in segmentul de date asociat variabilei beta xchg bl, cl ; Interschimba continutul registrelor BL si CL popf ; Reface din stiva confinutul registrului de flaguri F Mentiondm cd pentru realizarea programelor scrise in limbaj de asamblare, se pot utiliza mediile de dezvoltare MASM gi TASM, care pun la dispozitia utilizatorului o serie de directive din care, aici, mentionam numai directivele pentru definirea tipurilor de date asupra c&rora actioneaz instructiunile. Macroasamblorul MASM, respectiv TASM opereaz cu urmatoarele tipuri de date: BYTE (1 octet), WORD (2 octeti), DWORD (4 octeti), QWORD (8 octeti) si TBYTE (10 octeti). De asemenea se utilizeaza tipurile NEAR pentru etichete din segmentul curent si FAR pentra etichete din alte segmente. « Pentru definirea constantelor se utilizeazi directiva EQU (EQUate) al carei format este: nume EQU operand unde nume este numele ce se atribuie operandului operand care poate fi o constant, un nume simbolic definit anterior, o expresie sau un sir constant. Expresia este o concatenare de simboluri (operatori gi operanzi) care pot fi: = Constante numerice, incep intotdeauna cu o cifré si pot fi intregi sau reale. In cazul constantelor intregi, reprezentarea se poate face in baza 2, 8, 10 sau 16, indicarea bazei realizéndu-se respectiv prin sufixele B, Q, D, H (sau literele mici corespunztoare). Daca indicarea bazei lipseste, atunci se considera in mod implicit ca baza este 10. = Constante alfanumerice, siruri de caractere scrise intre ghilimele sau intre apostrofuri. Pentru fiecare caracter dintr-un sir alfanumeric de caractere, valoarea corespunzatoare este codul ASCII al caracterului respectiv. Exemple: ANA EQU 0c2h Fl ANY EQU ANA i char EQU ‘A’ ; char are valoarea 2041h charl EQU ‘al25 ; charl are valoarea 61313235h Este permisa in continuare scrierea unor instructiuni care s& foloseasca aceste nume: mov al, ANA and al, ANY mov x, char Observatie: Numele utilizate in EQU nu pot fi redefinite - Operatori aritmetici: +, -, *, /, MOD; ~ Operatori de deplasare: SHR, SHL; ~ Operatori logici: NOT, AND, OR, XOR: ~ Operatori relationali: EQ, NE, LT, LE, GT, GE; - Operatori de conversie de tip: PTR, SHORT, LOW, HIGH, SEG, OFFSET, LENGTH, SIZE, MASK. Expresiile utilizate pentru initializarea datelor sunt expresii care pot fi evaluate in momentul asamblarii programului, * Pentru definirea si initializarea variabilelor, directivele utilizate sunt: DB (Define Byte), DW (Define Word), DD (Define Doubleword), DQ (Define Quadword), DT (Define Tenbytes). La asamblare, pentru o variabila, se alocd una sau mai multe locatii de memorie conform tipului variabilei. In cadrul definirii se poate face, in mod facultativ, si initializarea variabilei, Formatul general al directivei este: ae lista operanzi , (mume_variabila] {DB | DW|DD|DQ|DT} | 6, pup (lisa sperma) } [; comentariu) unde: nume_variabila este numele prin care pot fi referite datele definite. Acest nume are asociat un tip si o valoare. Tipul rezultd din tipul datei, iar valoarea este adresa la care se va gasi in memorie, in timpul executiei programului, primul octet rezervat pentru data referit’ cu numele respectiv, Limbajul de asamblare utilizeaz nume rezervate care nu pot fi utilizate ca etichete sau variabile. Numele rezervate sunt: mnemonicele instructiunilor si pseudoinstructiunilor, numele operatorilor, numele registrelor si caracterele $ si ? lista operanzi reprezint’ lista unor constante, simboluri sau expresii separate prin virguld, cu ale caror valori se vor initializa zonele de date rezervate pentru declaratia respectiva. ‘factor este un numar care indic& de cite ori se repeta lista de operanzi care urmeaz in paranteze. in particular, drept operand poate fi folosit si caracterul ? care indic& faptul c& zona de date corespunzatoare este rezervata, dar nu $i initializata. Operatorul DUP indicd generarea repetata de factor ori a listei de operanzi ce apare intre parantezele de dupa cuvantul DUP. Precizim ca datele de tip adresa ce pot fi definite si prin directivele DW (adresa relativa) si DD (pointer) sunt memorate inversat, adic& la adresa mai mica - octetul mai putin semnificativ al valorii, respectiv la adresa mai mare - octetul mai semnificativ al valorii. Exemple: Nume_var Dir —_Listit operanzi Rezultat (in cod hexazecimal) DATA DB __ 10,5, 13h, -5,"A’ ; 0A 05 13 FB 41 DATA_W DW 100,100h,-5,“AB’ —;_-— 64.00 0001 FBFF 4241 DATA_D DD 5*20,0FCFBh,’BA’ ; — 64000000 FBFC 0000 41 420000 7 DB 200 DUP (1) 5 Defineste 200 octeti initializati cu 1 DB 50 DUP(I,0) 3 Defineste 100 octet initializati cu 1,0,1,0, ... ARRAY] DB 2 DUP(0,1,2,2) ; _Defineste 8 octeti initializati cu 0,1,2,_,0,1,2,_ 2-9 jalizare se face cu caracterul 2, ca in exemplul: ALFA DB 2,2,? ; Se rezervi 3 octeti incepand cu adresa ALFA. ARRAY2 DB 100 DUP (2) ; Se rezervi 100 octeti neinitializati incepand cu \dresa ARRAY2 BETA DW 2,0AAn ; Operatoral DUP poate fi utilizat si imbricat ca in exemplele: DB 2 DUP 3 DUP (1)) ; Defineste 6 octeti initializati cu 1 ARRAY3 DB 2 DUP (0,2 DUP (1,2), 0,3) ; Se va genera de 2 ori seeventa 0,1,2,1,2,0,3 Observaii: 2) Exist& instructiuni care opereazi atat pe cuvant, eat si pe octet. Acest lucru rezulta fie din modul de adresare, ca in instructiunile urmatoare: mov ax, [bx] ; Se incarea registrul AX cu cuvantul de la adresa DS*16+BX mov al, [bx] ; Se incarca registrul AL cu octetul de la adresa DS*16+BX fie din modul de definire al datei, ca in instructiunile urmatoare: VAR DB 5Sh_ ; inc VAR ; Se incrementeaz octetul de la adresa DS*16+OFFSET VAR in cazul instructiunii ine [bx], asamblorul nu poate deduce daca instructiunea opereaz pe octet sau pe cuvant, Pentru aceasta trebuie explicitat tipul datei, astfel: inc BYTE PTR [bx] _ ; Se incrementeazi octetul de la adresa [bx] ine WORD PTR [bx] _; Se incrementeaza cuvantul de la adresa [bx] unde s-a utilizat operatorul PTR pentru a preciza tipul datei. De fapt operatorul PTR se utilizeazi pentru a specifica tipul unei date (variabile) sau pentru a modifica temporar tipul unei date (variabile) sau distanta unei etichete. b) Pentru a deosebi modul de adresare intrasegment direct de intersegment direct se utilizeazi constructiile: imp FAR PTR etich_indep _ ; Salt intersegment la instructiunea cu eticheta etich_indep jmp NEAR PTR etich_aprop _; Salt intrasegment la instructiunea cu eticheta etich_aprop Distinctia intre modurile de salt intrasegment indirect si intersegment indirect se face in functie de tipul operandului ce apare in instructiunea de salt si anume: operand tip cuvant insemneazi salt intrasegment, iar operand pointer (cuvant dublu) insemneazi salt intersegment. Exemplu: jmp WORDPTR [bx] _ ; Salt intrasegment la instructiunea cu adresa dati de CS*16+BX. jmp DWORD PTR [bx] _; Salt intersegment la instructiunea cu adresa data de pointerul 3 (dublul cuvant) aflat la adresa DS*16+BX Descrierea setului de instructiuni ale microprocesoarelor 18086/18088 Pentru prezentarea setului de instructiuni ale microprocesoarelor 18086/18088. utilizim urmatoarele notatii Numele registrelor din UCP 18086/18088 : * AX, BX, CX, DX + registre generale de 16 biti; «AH, AL, BH, BL, CH, CL, DH, DL + registre generale de 8 bi © SP, BP, SI, DI = registre de 16 biti; «CS, DS, SS, ES - registre de segment; « F (PSW) =x x x x OF DF IF TF | SF ZF x AF x PF x CF - registrul de flaguri. Referiri generale: Z * A-acumulator (AX sau AL sau AH, functie de context); ‘© R-registru oarecare de uz general:R, - registru de 8 bifi, Ry, ~ registru de 16 biti 2-10 ‘© M- operand din memorie: M,, Mj, Myy unde indicele 8, 16, 32 precizeazi lungimea in biti pentru operanzi cu 1, 2, respectiv 4 octeti; * SR - registru segment oarecare: CS, DS, SS, ES; — * nume_reg - continutul numeric al registrului indicat de nume (surs& sau destinatie); + DATA - operand numeric imediat: DATA, DATA,, - operand numeric pe 8, respectiv 16 biti * DEPL - deplasament (offset) de adresi: DEPL,, DEPL,, - deplasament pe 8, respevtiv 16 biti; * (EA) - octetul cu adresa de offset egal cu EA; * (EA +1, EA) - cuvantul cu adresa de offset egal cu EA; + (nume_reg ) - octetul adresat indirect prin registrul de 16 biti indicat; * (nume_reg + 1, nume_reg ) - cuvantul adresat indirect prin registrul indicat; * SRC - notatie generala pentru o sursi de date: DATA, DATA, My, My» (EA), (EA+1, EA), nume_reg, (nume_reg), (nume_reg + 1, nume_teg ); * DST - notatie general pentru o destinatie a datelor: M,, M,,, (EA), (EA+1, EA), nume_reg, (nume_reg), (nume_reg + 1, nume_reg ); + EA - adresa efectiva; FA - adresa fizica, 1, Instructiuni pentru transferul datelor {in aceasta categorie se incadreaz’ urmatoarele tipuri de instructiuni: instructiuni de transfer de tip “clasic", instructiuni pentru incarcarea adreselor si instructiuni pentru transferul valorilor indicatorilor de conditie. 1°. Instructiuni de transfer de tip "clasic" in categoria instructiunilor de transfer de tip “clasic" se incadreaza urmatoarele instructiuni: mov DST, SRC push SRC pop DST xchg DST, SRC xlat a) Bfectul instructiunii MOV este de a transfera valoarea desemnati de sursa SRC la destinatia DST. Operanzii instructiunii MOV pot avea lungimea de 8 sau 16 biti gi acestia pot fi: registre generale, registre segment, registre pointer si index, confinutul unor locafii de memorie sau date imediate. in urma executiei operatiei MOV se modifici numai continutul operandului destinatie, continutul operandului sursé riméndnd nemodificat. De asemenea, instructiunea MOV nu afecteazd indicatorii de conditie. Formele admise de instructiunea MOV sunt: mov RR, Fl mov Ryu Rig mov SR,Ry 3 Continutul unui registru de 16 biti se transfera intr-un ; registru segment (SR nu poate fi CS) mov R,, SR 3 Rig<- SR mov R,, DATA, mov Mg, DATA, mov Ry, DATA, mov M,, DATA, 3My i mov R,,M, 5k, mov M,R, iM, mov RiypMy i mov MwRy ; mov SR, My 3 SR<--M,, ; (SR nu poate fi CS) 2-11 mov M,,SR 5M,,<-SR Observatii: a. Nu este permis executia unei instructiuni MOV de forma: ; mov SR, DATA, ; incarca un registru segment cu un operand imediat. b. Nu se pot transfera direct date intre doua locatii de memorie sau intre doud registre segment. Exemple de utilizare a instructiunilor MOV tdata SEGMENT ; Segmentul de date euvintl dw Offffh cuvint2 dw Of0fh octet] db 55h t_data ENDS ; Sfargitul segmentului de date stiva| SEGMENT STACK ; Segmentul de stiva DB 256 DUP (?) ; Defineste spatiul stiva s_data EQU $ ; Defineste varful stivei stiva ENDS ; Sfargitul segmentului de stiva code SEGMENT ; Numele segmentului de cod ASSUME cs: code, ds: t_data, ss: stiva ; Asignarea segmentelor START: ; Modulul principal incepe de la locatia START mov ax, t_data ; Adresa lui t_data in AX mov ds, ax mov ax, stiva mov 88, ax ; Adresa lui stack in AX mov sp, OFFSET s_data ; Stabileste SP 3 Transfer imediat de date in registre mov ax, Offffh mov bl, ’0° ; Codul ASCII pe 8 biti al lui 0 trece in reg. BL ; Transfer registra - registru (16 biti) mov bx, ax mov cx, bx mov dx, cx ; Transfer registru - registru (8 biti) mov al, 0 ; Data 0 trece in registral AL mov bl, al mov cl, bl mov di, cl ; Transfer registru - memorie mov ax, cuvintl mov dl, BYTE PTR cuvint2 ; Transfer din memorie cu adresare indirecta mov bx, OFFSET octet! mov al, [bx] ; Transfer memorie - memorie (trebuie utilizat un registru in doua etape) mov bx, cuvint2 ; Unmatoarele 4 instructiuni interschimba intre ele mov ax, cuvint! ; continutul celor doa cuvinte din memorie mov cuvint2, ax mov cuvintl, bx mov cx, SIZE cuvint! ; Continutul locatiei cuvantl trece in reg. AX ; Adresa de offset a variabilei octet! trece in reg. BX ; Marimea operandului (CX = 2) mov ah, 4ch ; Revenire in MS-DOS int 21h code ENDS ; Sfargitul segmentului de cod ; Sfarsitul programului 2-12 end START b) Instructiunile PUSH si POP sunt instructiuni de lucru cu stiva. Stiva este 0 zond speciala de memorie in care se memoreazi date in ordinea inversi folosirii acestora (este o memorie de tip LIFO). O astfel de situatie apare de exemplu in cazul salvarii gi refacerii contorillor din buclele incuibate. BUCLAI BUCLA2 BUCLA3 STIVA | | sp-4 [~ ARB2 Call BUCLA2 Call BUCLA3 sp-2 [~ ARBI ARBI ARB2 ‘SP | RET | RET Accesul la aceasté zona se face printr-un registru special numit indicator (pointer) de stiva SP care este gestionat de procesor prin mecanisme hardware. in lucrul cu stiva sunt permise doua operatii: operatia de depunere in stiva: PUSH gi operatia de extragere din stiva: POP. Adresa ultimului element depus in stiva se afla totdeauna memorati in SP si se numeste varful stivei. La microprocesoarele 18086/18088, adresa fizici a varfului stivei este dati de perechea SS:SP. Continutul lui SS 4 limita inferioari a stivei, numindu-se baza stivei. Stiva poate fi considerati ca ocupand zona de memorie limitata inferior de SS*16,, si superior de SS*16,, + valoarea initiala a registrului SP _ Baza stivei: SS*16 a Daca urmeazi 0 operatic PUSH aici se depune ———>f (Valoarea registrului SP [Ulimul octet depus he SP scade dupa o operatie PUSH) acti urmezii 0 operatie POP de aici se extrage (Valoarea registrului SP cregte dupa o operatie POP) SS*16 + valoarea initialé a registrului SP J] Adrese mari Instructiunea: PUSH SRC j SP <— SP-2, (SP + 1, SP) <~ SRC transfera in varful stivei cuvéntul precizat prin operandul SRC. Se poate utiliza sub forma: push R,, _ ; Salveaza pe stiva continutul unui registru de 16 biti, Ry, push M., _ ; Salveaza pe stiva confinutul locatiei de memorie avand adresa relativa ; precizata in instructiune push SR; Salveaza pe stiva continutul unui registru segment La fiecare salvare pe stiv8, indicatorul SP se decrementeaza cu 2 2-13 Instructiunea: POP DST ; DST <.-- (SP + 1, SP), SP <--- SP +2 reface din varful stivei cuvantul precizat in operandul DST. Se poate utiliza sub forma: pop Rj, —_; Reface din stiva continutul unui registru de 16 biti, Ry, pop M,, _ ; Reface din stiva continutul locatiei de memorie avand adresa relativa 3 precizata in instructiune pop SR _; Reface din stiva continutul unui registra segment (SR nu poate fi CS) La fiecare extragere din stiva, indicatorul SP se incrementeaza cu 2. Observatie: Se poate executa o instructiune push cs; Salvare registru segment de cod dar nu se poate executa o instructiune pop cs. incarcarea registrului CS prin intermediul stivei se poate face numai executénd o instructiune de reintoarcere dintr-o procedura in context FAR. Accesul la informatiile memorate in stiva se poate face si far descarcarea stivei, utilizind adresarea bazati in felul urmator: 5 Secventa de memorare informatii in stiva mov bp, sp ; Se precizeaza "baza stivei" push ax ;SP=SP-2 push bx. ;SP=SP-4 push cx ;SP=SP-6 3 Seovent& de acces la informatiile memorate in stiva mov ax, (bp-2] _; Prima informatie introdusa in stiva mov bx, [bp-4] _; A doua informatie introdusa in stiva mov cx, [bp-6] _; Ultima informatie introdusi in stiva add sp,6 Se descarca stiva ©) Instructiunea XCHG DST, SRC are ca efect interschimbarea continutului sursei cu cel al destinafiei, Instructiunea poate fi folosita sub forma: XCHG Ry Ry :R, < XCHG Ry, My i < XCHG Rio Re 3Ry< XCHG Ris Mie iRy< Observatie: Nu se pot utiliza drept operatori registrele de segment. Exemplu: Interschimbarea continutului a doi operanzi din memorie op si op2 se poate face prin secventa: mov R,opl xchg R, op2 mov opl,R unde R este un registru pe 8 sau 16 biti, functie de lungimea operanzilor. 4) Instructiunea XLAT (Translate Byte to AL) translateazA (converteste) valoarea registrului AL, adic& o inlocuieste cu un octet dintr-un tabel a c&rui adres de inceput se aflé in registrul BX. Indexul in acest tabel este toomai valoarea lui AL ( AL <-- [BX + AL}) Exemple: 1, Sa considera urmatoarea codificare pentru cifrele zecimale de la 0 la 9 (codul 2 din 5 folosit in telefonie): 0-> 1 1000 5-->0 1010 1-> 00011 601100 2-14 2--> 00101 7--> 10001 3-> 00110 8-> 10010 4->0 1001 9--> 10100 S& presupunem cA dorim si convertim cifra 6 intr-un cod instructiunile: ; a mov bx, OFFSET TABEL ; Se plaseaza in BX adresa de inceput a tabelei cu codurile "2 3 din 5" "2 din 5", Programul trebuie s& confina jin AL se va gisi codul cifrei 6, adic& 00001 100b entru ca instructiunile s& fie executate este necesar ca TABEL (tabelul de conversie) 8 se afle in segmentul de date curent, 2. Conversia unei valori numerice cuprinsi intre 0 si 15 in cifrele hexazecimale corespunzatoare, se poate face prin: tabel DB *0123456789abcdef” mov bx, OFFSET tabel mov al, I] xlat ; In registrul AL se va depune cifra hexazecimala b 2 Instructiuni pentru incdrcarea adreselor Exist patru instructiuni pentru inc&rcarea adresei unui operand (nume, variabil&, expresie): MOV R,,, OFFSET operand LEA Ry, operand 3 LEA - Load Effective Address LDS R,,, operand ; LDS - Load Data Segment register LES R,,, operand ; LES - Load Extra Segment register a) Ca efect al executiei instructiunii: lea__R,,, operand se incarca in registrul R,,, adresa relativa (efectiva) a operandului plasat in segmentul curent de date care apare in instructiune. Aceastd instructiune este mai puternic& dec&t instructiunea mov R,, OFFSET operand deoarece permite si utilizarea unor registre de baza si index in formarea adresei. Exemple: nume DB 100 lea -bx,mume Incarci BX cu adresa de offset a operandului nume ‘Accasta instructiune este echivalent& cu instructiunea: mov bx, OFFSET nume Instructiunea: mov ax, OFFSET table{si] nu conduce la un rezultat corect, pe cénd instructiunea: lea ax, table{si] are ca efect incircarea in AX a offsetului operandului table + si, b) Ca efect al executiei instructiunilor: Ids R,g operand ; R,, <-- (EA+,EA); DS <-- (EA+3,EA+2) les R,y operand; R,, <~ (EA+1,EA); ES <- (EA+3,EA+2) se incarca in registrul DS, respectiv ES si in registrul R,, specificat in instructiune adresa aflata in memorie la adresa efectiva EA a operandului referit in instructiune. Cei patru octeti aflati in memorie la aceasté adres sunt interpretafi ca o adres de tip pointer. Astfel, valoarea continutd in 2-15 primii doi octeti (componenta de offset) se incarcd in registrul R,,, iar valoarea con{inuti in urmitorii doi octeti (componenta de segment) se incarcii in registrul DS, respectiv ES. F°. Instructiuni pentru transferul valorilor indicatorilor de conditie a) _LAHE ; Load AH from Flags Incarc in registrul AH octetul inferior al registrului F = (Fhigh Flow), E Fhigh Flow 7 x |x |x |x [or] pr] | rel se|ze | x | arl x | pr] x | oF} Flees) astfel: AH <—— | sF|ZF | x | AF| x | PF| x | CF] Flow ») SAHF ; Store AH in Flags {incarcd in octetul inferior al registrului F, registrul AH , astfel: Flow { sF| zr] x | ar| x | pF| x | cr] <— an c) Instruetiunea PUSHF (PUSH Flags) salveaza in stiva valorile indicatorilor de conditie: SP <—- SP -2; (SP + 1) <-- Fhigh, (SP ) <—- Flow. 4) Instructiunea POPF (POP Flags) reface din stiva valorile indicatorilor de conditie: Flow <-- (SP), Fhigh <--- (SP + 1); SP <-- SP +2. Observatie: \nsteuctiunile LAHF si PUSHF nu afecteaza indicatorii de conditie, iar instructiunea SAHF nu afecteaza flagurile TF, IF, DF si OF. 2. Instructiuni pentru pozitionarea indicatorilor de conditie in aceasta categorie se incadreaza instructiunile: CLC ; Clear Carry Flag (CF=0) STC ; Set Carry Flag (CF=1) cmc ; Complement Carry Flag (CF = CF) sTD ; Set Direction Flag (DF=1) cLD ; Clear Direction Flag (DF=0) STI ; Set Interrupt Flag (IF = 1); Activeaza sistemul de intreruperi CLI ; Clear Interrupt Flag (IF = 0); Dezactiveaza sistemu! de intreruperi 3. Grupul instructiunilor aritmetice 3.1. Aritmetica binard 3.1.1. Adunarea si scdderea binaré Instructiunile pentru adunarea gi scdderea binard sunt urmitoarele: ADD DST,SRC ; (DST) <--- (DST) + (SRC) ADC DST, SRC SUB DST, SRC SBB DST,SRC Pentru instructiunile ADD si ADC sunt permise urmatoarele tipuri de operanzi: addjadc RyRy jR, <-R, +R, [+CF addjade Ry My i add|ade My Ry add|ade Ry Ry ik add | ade Ris Mio i addjade Mi Rig ; add|adc —-R,, DATA, + ee addjadc = -M,,DATA, ; i t ee Ry, DATA, F addjade Ry, lier addjadc = My,DATA, ; Indicatorii afectati sunt: AF, CF, PF, SF, ZF, OF Observatii: . a. Pentru instructiunile SUB (SUBtract) si SBB SuBtract with Borrow) sunt permise aceleasi tipuri de operanzi ca si la instructiunile ADD si ADC (ADd with Carry); | b. Operatiile se executa cu operanzi pe 8 sau 16 biti, cu sau fark semn. Cei doi operanzi trebuie si aib& aceeasi dimensiune (acelasi tip). Numerele fra semn sunt interpretate in notatie binara directa, iar numerele cu semn, in complement fata de 2. | ©. Instructiunile ADD si SUB se utilizeaz’ pentru efectuarea calculelor cu operanzi in simpl& precizie, adicd cu operanzi reprezentati pe céte un cuvéint. Exemplu: Daci operanzii x, y, z sunt in simpli precizie, urm&toarea secventi de instruetiuni calculeaza valoarea x+y+100-2 si depune rezultatul in w: mov ax, x add ax, y add ax, 100 sub ax,z mov w, ax * Daca pentru reprezentarea operanzilor se utilizeaz mai multe cuvinte spunem c& avem o Teprezentare multipla precizie. Pentru efectuarea de calcule multipli precizie se utilizeazd instructiunile ADC si SBB. Exemplu: Secventa de instructiuni corespunzatoare adunarii a dou’ numere serise in dubla precizie, plasate la adresele n1_dp si n2_dp, cu depunerea rezultatului la adresa n3_dp este: ni_dp DD — 12345678h n2_dp DD —98765432h rez DD ? cle mov ax, WORDPTR nl_dp — ; AX <~c.mps. cuvant al lui nl_dp add ax, WORDPTR n2_dp — ; AX<-~- AX +c.mp.s. cuvéint al lui n2_dp mov WORD PTR rez, ax ;¢mop.s, cuvant al rezultatului se depune la adresa rez mov ax, WORDPTR nl_dp+2_ ; AX <- cms. cuvant al lui DPI ade ax, WORD PTR n2_dp#2_ ; AX <-- AX + cms, cuvant al lui DP2 mov rez+2, ax 3 €m.s. cuvant al rezultatului se depune la adresa rez in cazul operanzilor cu semn, se pot efectua si operatii aritmetice mixte cu numere de precizii diferite. Pentru aceasta se vor utiliza instructiuni pentru extinderea semnului operandului. 3.1.2, Instructiuni pentru extinderea semnului operandului Pentru “ajustarea" lungimii operanzilor (cu semn) se utilizeaz’ dou’ instructiuni pentru extinderea semnului operandului, astfel: a) cBw ; Convert Byte to Word Realizeaz& conversia octetului cu semn continut in registrul AL, in cuvantul cu semn continut in registrul AX prin extinderea bitului de semn al registrului AL la toti biti registrului AH, astfel: dac’ AL, = 0, atunci AH = 00h, iar daca AL, = 1, atunci AH = ffh. 2-17 Exemplu: Se doreste adunarea unui m teprezentat pe 16 biti plasat urmitorul set de instructiuni: jumar reprezentat pe 8 bifi plasat la adresa nl cu un numér la adresa n2, cu depunerea rezultatului la adresa rez. Se poate utiliza nl DB 45 mn DW 150 rez DW ? mov al, ni cbw ;Se converteste octetul la cuvant add ax,n2 mov rez, ax b) _ CWD 3 Convert Word to Double word Realizeaza conversia cuvantului cu semn continut in registrul AX, in dublul-cuvant cu semn confinut in registrele (DX, AX) prin extinderea bitului de semn al registrului AX la tofi bitii registrului DX, astfel: dack AX,, = 0, atunci DX = 0000h, iar dact AX,,= 1, atunci DX = ffffh. Observatie: Instructiunile CBW si CWD nu afecteaza indicatorii de conditie. Exemplu: Urmatoarea seeventi de program aduna un numar plasat in registral BX reprezentat in simpl& precizie cu un numir in dubla precizie plasat la adresa d_p. Rezultatul se depune la adresa rez: dp DD 12345678h rez DD ? cle 3CF=0 mov bx, 0ABCDh mov ax, bx 3 owd ; Se converteste cuvantul la dublu_cuvant add ax, WORD PTR d_p mov WORD PTR rez, ax ade dx, WORD PTR d_p+2 mov WORD PTR rez+2, dx 3.1.2, Alte instructiuni ce au legaturé cu adunarea si scdderea binard a) Instructiuni de incrementare si decrementare INC DST; INCrement (DST) <--- (DST) + 1 Se aduna | 1a continutul singurului operand, rezultatul depunindu-se inapoi in operand. DEC DST; DECrement (DST) <-—- (DST) - 1 Se scade | din continutul singurului operand, rezultatul depunndu-se inapoi in operand. Forme de utilizare: ine | dec R___; Se incrementeazi | decrementeaza continutul registrului general R j unde R poate fi R, sau Ri, inc|dec M —_ ; Se incrementeaza | decrementeaza continutul locatiei de memorie } adresata prin M, unde M poate fi M, sau My, Indicatorii afectati sunt: AF, PF, SF, ZF, OF. Exemple: inc cx ine mem_byte{bx] ine alpha[bx][si] dec cx 2-18 dec al dec BYTE PTR VAR dec WORDPTR VAR Observatii: a) Instructiunile INC si DEC nu afecteaza flagul CF; b) Instructiunile INC si DEC se executi modulo valoarea lui R sau M. De exemplu, daca AL = Offh si se executa inc AL, atunci dupa executia instructiunii, AL = 00h. Dac& BX = 0000h si se executa dec BX, atunci dupa executia instructiunii, BX = Offfth. b) Instructiuni de negare NEG DST ; NEGate DST <-- - (DST) = (DST), Schimba semnul operandului DST, sau, altfel spus realizeaza complementarea aritmetica a acestuia. Forme de utilizare: neg R__ ; Se schimba semnul continutului registrului general R, unde R poate fi Ry ; sau Ri, neg M__; Se schimba semnul continutului locatiei de memorie adresat& prin M, unde ;M poate fi M, sau M,,, Exemple: neg al _; Presupundnd c& AL = -1 adic 11111111b, instructiunea neg al, va inscrie 3 in AL valoarea +1, adic’ 00000001 neg BYTEPTR VAR ©) Instructiuni de comparare CMP DST, SRC ; CoMPare (ST) - (SRC) Se compara, prin scidere, continutul operandului sursi cu continutul operandului destinatie, fara modificarea operanzilor gi fara depunerea rezultatului, dar cu pozitionarea corect4 a indicatorilor de conditie. Sunt posibile urmatoarele forme de utilizare: cmp RyRy ; Se compara continutul a doua registre generale de 8 biti emp Ry Rig ; Se compara continutul a dowd registre generale de 16 biti emp Ry, M, ; Se compara continutul unui registru general de 8 biti cu continutul ; unei locatii de memorie adresata prin M, emp RM, —_; Se compara confinutul unui registru general de 16 bifi cu continutul 5 unei locatii de memorie emp R,DATA, _; Se compara confinutul unui registra de 8 biti cu un operad imediat 5 pe 8 bifi cmp Ry, DATA, 5 cmp M,,DATA, ; cmp My, DATA, 5 Indicatorii afectati sunt: AF, CF, PF, SF, ZF, OF. Observatie: Instructiunnea CMP este urmati, de obicei, de o instructiune de salt conditionat, care testeaza bistabilii de conditie pentru a verifica daca relatia din condifia testat’ a fost satisPacuta. Starea bistabililor de conditie trebuie interpretata diferit, dupa cum ceea ce se compara sunt numere fara semn, sau numere cu semn. Astfel, dacd numerele sunt fara semn: CF=0 si ZF=0, daci. (DST) > (SRC) CF=0 si Zi daci. (DST) =(SRC) CF=1 gi Z ac’. (DST) < (SRC) Pentru numere cu semn: SF=OF, daca (DST) > (SRC) ZF=1, daci (DST) = (SRC) 2-19 Bremple: cmp bree, “st ©m OFFh, daca impartirea se face pe octet; - cétul > OFFFFh, daca impartirea se face pe cuvant. ~ Pentru instructiunea IDIV SRC, depisirea apare cAnd: - ctul > 07Fh, daca impirtirea se face pe octet; - catul > O7FFFh, daca impartirea se face pe cuvant, Exemplu: Fie: AX = 400h = 1024,, in ambele reprezentari (cu semn gi fair semn) 180,o in reprezentare fara semn 760 in reprezentare cu semn Instructiunea DIV BL ne conduce la : AL = 0Sh (catul); AH = 7Ch = 124, (restul); Instructiunea IDIV BL ne conduce la : AL = OF3h = -13,, (cAtul); AH = 24h = 36,, (restul). Instructiunile de inmultire si impartire sunt cele mai lente instructiuni executate de microprocesoarele 18086/18088. Din acest motiv, ori de cate ori este posibil, este de preferat inlocuirea acestor operatii prin secvente echivalente care s& foloseasc numai operafii de adunare gi de deplasare. BL =0B4h= 2-21 3.2. Aritmetica BCD 32.1, Aritmetica BCD impachetats Reprezentarea in cod BCD es a i a fiectrei cifre zecimale Se a) DAA 3 Decimal Adjust after Addition ee . : hstructiunea realizeazé corectia zecimali a rezultatului objinut, in registrul AL, dup adunarea a doi operanzi in format BCD impa: i \hetat, it en AL. Conia nasa ipachetat, Rezultatul corect (in format BCD impachetat) Sad tatului se face in functie de valoarea bistabilelor de conditie AF si CF, Daca’ (AL,;)>9 sau AF = |, atunci { (AL) <--- (AL) +6 AF <1 } Daci (AL,,)>9 sau CF = I, atunci { (AL) <--- (AL) + 60h CF<. } b) DAS ; Decimal Adjust after Subtraction Instructiunea realizeazd corectia zecimali a rezultatului obtinut, in registrul AL, dup’ so&iderea a doi operanzi in format BCD impachetat, Rezultatul corect (in format BCD impachetat) raméne in AL. Corectia rezultatului se face in functie de valoarea bistabilelor de conditie AF si CF, astfel: Dacd (AL,;)>9 sau AF = 1, atunci { (AL) <-- (AL) -6 AF <= 1 } Dacd (AL,,)>9 sau CF = 1, atunei { (AL) <-- (AL) - 60h CF < } Observatie. in aritmetica BCD impachetaté nu se pot executa direct operatii de inmultire gi ‘impirtire. Exemple: - Reprezentare in cod BCD 0001 1010 i Numarul 26,)= { Oin binar 0010 0110 in cod BCD a) Adunare in format BCD al) 34 =0011 | 0100 + 25 = 0010/0101 59 6 101 | 1001 + }000 | 0110 (corectiay 65=0101| 1111 (AF =0) 2-22 Rezultatul 59 este cel corect deoarece dupa adunarea cifrei 6, indicatorul AF = 0. 22) 34 = 0011 |0100 + 29 = 0010 | 1001 5? 0101/1101 + 6 = 0000 | 0110 (corectia) 10/0011 (AF=1) oe Rezultatul 63 este corect deoarece dupa adunarea cifrei 6, indicatorul AF b) Scaidere in format BCD bl) 5= 0000/0101 (AF =0) Rezultatul 5 este corect deoarece dupa scaiderea cifrei 6, indicatorul AF = 0. 2) 34 = 0011 | 0100 - 30= 0011 | 0000 4= 0000/0100 (AF = 0) Rezultatul 4 obtinut anterior este corect deoarece dupa scaderea cifrei 6, indicatorul AF = I. ©) Fie BCD1 si BCD2 dows numere ce contin cate 4 cifte zecimale reprezentate in cod BCD. Unmitoarea seeventé calculeaz’ BCD + BCD? si depune rezultatul in BCD3. (Reamintim c& cifra zecimala m.p.s. se memoreaza la adresa cea mai mica), mov al, BYTE PTR BCDI add al, BYTE PTR BCD2 mov BYTE PTR BCD3, al mov al, BYTE PTR BCDI+1 adc al, BYTE PTR BCD2+1 daa mov BYTE PTR BCD3+1, al 3.2.2, Anitmetica BCD neimpachetaté © alti reprezentare a numerelor decét cea binari si in cod BCD impachetat este reprezentarea in cod BCD neimpachetat (despachetat), contindnd numai o ciffa pe octet, Ciffd este Continuta in cei mai pufin semnificativi 4 biti ai octetului, restul bifilor neinfluentind valoarea numérului reprezentat. Cel mai uzual exemplu de reprezentare in cod BCD nefmpachetat este codul ASCII in care, pentru reprezentarea cifrelor, cei mai semnificativi 4 biti au valoarea 0011b. La efectuarca operatiilor de adunare, sctidere, inmultire si impartire cu operanzi in format BCD despachetat (in cod ASCII) sunt necesare urmatoarele corectii, astfel: a) AAA ; ASCII Adjust after Addition 2-23 Instructiunea realizeaza corectia rezultatului obtinut, in registrul AL, dupa {ia Zecimala a rezultatului objinut, in registrul 7 t BCD neimy ; oeimpacheat este depuis in registele Affe mpachea Rezultatul corect, in format BCD Daci (AL,3)>9 sau AF = 1, atunci (AL) +6 (AH) +1 } (AL) <--- (AL) AND OFh ») AAS ; ASCII Adjust after Subtraction Instructiunea realizeaza corectia zecimalé a rezultatului obtinut, in registrul AL, dupa ScAderea a doi operanzi in format BCD neimpachetat. Rezultatul corect, in format’ BCD neimpachetat este depus in registrele AH si AL, astfel: Dack (AL,;)>9 sau AF = 1, atunci { (AL) <--- (AL) -6 (AH) <--- (AH)-1 AF <1 CF <1 (AL) + ° AAM ; ASCII Adjust after Multiplication Instructiunea realizeaz& corectia zecimala a rezultatului obtinut, in registrul AL, dupa inmulfirea a doi operanzi in format BCD neimpachetat. inmultirea se face cu MUL, iar rezultatul corect, in format BCD neimpachetat este depus in registrele AH si AL, astfel: (AL) AND OFh (AH) <-- (AL)/ 10 (AL) <— (AL) MOD 10 Exemplu: = mov al,7 mov 1,9 mul bh ; in AX se va obtine valoare 003Fh aam 3 In AX se va obine valoare 0603 (rezultat corect) 4) AAD j ASCII Adjust before Division Instructiunea realizeaza corectia zecimala a deimpartitului inaintea imprtirii a doi operanzi in format BCD neimpachetat. impartirea se face cu DIV, rezultatul din AL corectat, in format BCD neimpachetat fiind depus in registrele AH si AL, astfel: (AL) <-- (AH) * 10 (AL) (AH) <-- 0 Exemplu: Urmatoarea secventa de program calculeazi expresia UP1+UP2-UP3, numerele find reprezentate pe cate 2 cifre zecimale in aritmetica BCD neimpachetata, rezultatul depunandu-se in registrul DX mov al, BYTE PTR UPI ;C.m.ps. ciffd a lui UPI in AL add al, BYTE PTR UP2 5 Camps. cifra a ui UP1+UP2 in AL aaa ; Corectie BCD mov di, al ;C.mps, cifré a lui UP1+UP2 in DL mov al, BYTE PTR UPI+1 ; C.m.s. cifrd a lui UPI in AL ade al, BYTE PTR UP2+1 —; C.ms. cifrtia lui UP1+UP2 in AL aaa ; Corectie BCD 2-24 xehg al, di. 3 C.m.p.s. cifra a lai UP1+UP2 in AL 3 C.m.s. cifré a lui UP1+UP2 in DL sub al, BYTE PTR UP3 ji aas 3 C.m.p.s. cifra a lui UP1+UP2-UP3 in AL xchg al,dl 3 C.m.s. cifra a lui UP1+UP2 in AL ; C.m.p.s. cifra a lui UP1+UP2-UP3 in DL sbb al, BYTEPTR UP3+1 : aas 3 C.m.s. cifré a lui UP1+UP2-UP3 in AL mov dh, al ;C.m.s. cifré a lui UP1+UP2-UP3 in DH Deoarece se lucreaza implicit cu registrul AL, se observa cd la fiecare pas se trateazA cate 0 singura cifras

Potrebbero piacerti anche