AAA AAA - ASCII Adjust for Addition ajustare ASCII pentru adunare Operatie: Daca cei mai putin semnificativi 4 biti a lui AL sint mai mari decit 9 sau daca carry auxiliar este 1, atunci aduna 6 la AL si 1 la AH. AF si CF sint actualizati. if ((AL) & 0FH) > 9 or (AF)= 1 then (AL)=(AL)+6 (AH)=(AH)+1 (AF)=1 (CF)=(AF) (AL)=(AL) & 0FH Codificare: 00110111 Timp: 4 ceasuri Indicatori afectati: AF, CF nedefiniti: OF, PF, SF, ZF Descriere: AAA realizeaza o corectie a rezultatului in AL adunind doi operanzi zecimali neimpachetati, producind o suma zecimala neimpachetata. AAD AAD - ASCII Adjust for Division ajustare ASCII pentru impartire Operare: octetul semnificativ a lui AH este inmultit cu 10 si adunat la AL. (AL)=(AH)*0AH+(AL) (AH)=0 Codificare: 11010101|00001010 Timp: 60 ceasuri Indicatori afectati: PF,SF ,ZF nedefiniti: AF, CF, OF Descriere: AAD realizeaza o ajustare pentru impartitorul din AL inaintea unei instructiuni de impartire a doi operanzi zecimali neimpachetati, astfel ca rezultatul va fi un cit zecimal neimpachetat. AAM AAM - ASCII Adjust for Multiply ajustare ASCII pentru inmultire Operatie: Continutul lui AH este inlocuit de rezultatul impartirii lui AL cu 10. Apoi continultul lui AL este inlocuit de restul acestei impartiri. (AH)=(AL)/0AH (AL)=(AL)%0AH Codificare: 11010100|00001010 Timp: 83 ceasuri Indicatori afectati: PF, SF, ZF nedefiniti: AF, CF, OF Descriere: AAM realizeaza o corectie a rezultatului in AX dupa inmultirea a doi operanzi zecimali neimpachetati, producind un produs zecimal neimpachetat. AAS AAS - ASCII Adjust for Subtraction ajustare ASCII pentru scadere Operatie: Daca jumatatea mai putin semnificativa a lui AL este mai mica de 9 sau daca (AF)=1 atunci se scade 6 din AL si 1 din AH. Indicatorii (AF) si (CF) devin 1. Vechea valoare a lui AL este inlocuita de un octet in care jumatatea superioara este 0 iar jumatatea inferioara este un numar creiat de scaderea anterioara. if ((AL)&0FH)>9 or (AF)=1 then (AL)=(AL)-6 (AH)=(AH)-1 (AF)=1 (CF)=(AF) (AL)=(AL&0FH Codificare: 00111111 Timp: 4 ceasuri Indicatori afectati: AF, CF nedefiniti: OF, PF, SF, ZF Descriere: AAS realizeaza o corectie a rezultatului in registru AL in urma scaderii a doi operanzi zecimali, producind o diferenta zecimala neimpachetata. ADC ADC-ADd with Carry aduna cu carry Operatie: Suma celor doi operanzi si a lui carry este memorata in operandul destinatie (stinga). if (CF)=1 THEN (DEST)=(LSRC)+(RSRC)+1 else (DEST)=(LSRC)+(RSRC) Codificare: operand in memorie sau registru cu operand in registru 000100dw|mod reg r/m if d=1 then LSRC=REG,RSRC=EA,DEST=REG else LSRC=EA,RSRC=REG,DEST=EA Timp: ceasuri (a) registru la registru 3 (b) memorie la registru 9+EA (c) registru la memorie 16+EA Exemple: (a) ADC DI, BX (b) ADC DX, MEM_WORD (c) ADC BETA[SI], DI operand imediat la acumulator 0001010w| data |data(daca w= 1) if w=0 then LSRC=AL,RSRC=data,DEST=AL else LSRC=AX,RSRC=data,DEST=AX timp: 4 ceasuri Exemplu: ADC AL, 3 operand imediat la memorie sau in registru: 100000sw|mod 011 r/m| data | data (daca sw=01) LRSC=EA,RSRC=data,DEST=EA Timp: (a) imediat la memorie 17+EA (b) imediat la registru 4 Exemple: (a) ADC BETA[SI], 4 (B) ADC CX, 432 Daca se aduna imediat un octet la un octet din registru sau memorie atunci octetul este extins la 16 biti. Pentru aceasta situatie octetul de instructiune este 83h. Indicatori afectati: AF, CF, OF, PF, SF, ZF Descriere: ADC aduna doi operanzi la care adauga si valoarea lui carry OBSERVATIE: In paginile anterioare ale acestui manual s-a explicat ce inseamna mod, reg, r/m, EA, DEST, si alte notatii. Exista deasemenea tabele care arata codificarea modurilor de adresare sau a registrelor. In cele mai multe cazuri reg este un cimp de trei biti valabil pentru orice registru exceptie registre de segment. Instructiunile care se refera direct la registre de segment folosesc un cimp de doi biti. Toate referintele la memorie folosesc implicit in constructia adreselor un registru de segment. Cu exceptia I/O si intreruperilor, alegerea registrului de segment depinde de expresia de tip adresa din linia sursa a programului scris in limbaj de asamblare si de directiva ASSUME care se aplica acestei linii. De cite ori o expresie de tip adresa include un nume de variabila, nume folosit pentru adresarea unei locatii de memorie ce contine date, octetul MODM va fi urmat de 2 octeti dau deplasamentul de adresa de baza a segmentului. ADD ADD - ADDition adunare Operatie: Suma celor doi operanzi este memorata in operandul destinatie (stinga) (DEST)=(LSRC)+(RSRC) Codificare: Operand in registru sau memorie cu operand in registru 000000 d w| mod reg r/m if d=0 then LSRC=REG,RSRC=EA,DEST=REG else LSRC=EA,RSRC=REG,DEST=EA Timp: ceasuri (a) registru la registru 3 (b) memorie la registru 9+EA (c) registru la memorie 16+EA Exemple: (a) ADD DI, SI (b) ADD AX, BETA[SI] (c) ADD MEM_BYTE, BH Operand imediat la acumulator: 0000010w| data | data (daca w=1) if w=0 then LSRC=AL,RSRC=data,DEST=AL else LSRC=AX,RSRC=data,DEST=AX Timp: 4 ceasuri Exemplu: ADD AL, 3 Operand imediat la memorie sau registru: 100000 s w | mod 000 r/m | data | data (daca s:w=01) LRSC=EA,RSRC=data,DEST=EA Timp: (a) imediat la memorie 17+EA (b) imediat la registru 4 Exemple: (a) ADD MEM_WORD, 48 ADD GAMMA[DI], IMM_84 (b) ADD DX, 1776 Daca data imediata de adunat este octet atunci acest octet este extins la 16 biti iar codul instructiunii este 83h. Indicatori afectati: AF, CF, OF, PF, SF, ZF Descriere: ADD realizeaza adunarea a doi operanzi sursa si pune rezultatul in destinatie. AND AND - logic AND si logic Operatie: Se realizeaza si logic intre cei doi operanzi, rezultatul va avea 1 in pozitiile in care ambii operanzi au 1, restul fiind 0. Rezultatul este memorat la operandul din stinga. Carry si overflow sint pusi pe 0. (DEST)=(LSRC)&(RSRC) (CF)=0 (OF)=0 Codificare: Operand in memorie sau registru cu operand registru: 001000 d w | mod reg r/m if d=1 then LSRC=REG,RSRC=EA,DEST=REG else LSRC=EA,RSRC=REG,DEST=EA Timp: ceasuri (a) registru la registru 3 (b) memorie la registru 9+EA (c) registru la memorie 16+EA Exemple: (a) AND AX, BX (b) AND DH, ALPHA (c) AND ALPHA, AX Operand imediat la acumulator: 0010010w | data |data (daca w=1) if w=0 then LSRC=AL,RSRC=data,DEST=AL else LSRC=AX,RSRC=data,DEST=AX Timp: 4 ceasuri Exemplu: AND AL, 7AH Operand imediat la memorie sau registru: 1000000w|mod 100 r/m | data | data (daca w=1) LSRC=EA,RSRC=data,DEST=EA Timp: (a) imediat la registru 4 (b) imediat la memorie 17+EA Exemple: (a) AND BL, 10011110B (b) AND MEM_WORD, 7A46H Indicatori afectati: CF, OF, PF, SF, ZF nedefiniti: AF Descriere: AND realizeaza conjunctia logica intre operanzi intorcind rezultatul in destinatie. CALL CALL - CALL a procedure apel de procedura Operatie: Daca este un apel intersegment, stiva este decrementata cu 2 si continutul lui CS este salvat in ea. CS va fi initializat cu al doilea cuvint al dublului cuvint de adresare. Apoi se salveaza in stiva, in acelasi mod, si continutul lui IP. Ultimul pas este de a inlocui continutul lui IP cu offset-ul adresei de destinatie, adica offset-ul primei instructiuni din procedura. Un apel intrasegment are numai pasii 2, 3 si 4. 1) (SP)=(SP)-2 ((SP)+1:(SP))=(CS) (CS)=SEG 2) (SP)=(SP)-2 3) ((SP)+1:(SP))=(IP) 4) (IP)=DEST Codificare: In cadrul aceluiasi segment sau grup: 11101000| disp_low | dips_high DEST=(IP)+disp Timp: 13 + EA ceasuri Exemple: CALL NEAR_LABEL Intersegment direct: 10011010| offset-low | offset-high | seg-low | seg-high DEST=offset,SEG=seg Timp: 20 ceasuri Exemple: CALL FAR_PROC Intersegment indirect: 11111111| mod 011 r/m (DEST)=(EA),SEG=(EA+2) Timp: 29+EA Ceasuri Exemple: CALL DWORD PTR [BX] CALL DWORD PTR VAR[SI] CALL MEM_DOUBLE Indirect in acelasi segment sau grup: 11111111| mod 010 r/m DEST=(EA) Timp: 11 ceasuri Exemple: CALL WORD PTR [BX] CALL BX CALL WORD PTR VAR[BP][SI] Indicatori afectati: niciunul Descriere: CALL salveaza adresa curenta a lui IP si transfera controlul unei proceduri. Apelurile si salturile directe se pot face numai la etichete, relative la CS si nu la variabile. Aceste etichete sint implicit de tip NEAR. Pentru a fi de tip FAR acest lucru trebuie declarat explicit intr-o instructiune de declarare. Dupa cum s-a aratat in exemple, operatorul PTR este utilizat pentru a indica intentia de utilizare a unor variabile (cuvint pentru cele de tip NEAR, dublu cuvint pentru FAR). Apelurile indirecte care folosesc registre de tip cuvint sint necesar a fi de tip NEAR. Registrul segment utilizat implicit in apelurile indirecte prin registre este DS, daca se specifica explicit se poate utiliza si BP. Registrul segment implicit este utilizat pentru a construi adresa care contine offset-ul (si segmentul, daca este un apel lung) tintei apelului. Daca se utilizeaza BP, registrul segment folosit este SS. Totusi, daca se specifica explicit: CALL WORD PTR ES:[BP][DI] atunci registrul segment astfel specificat este folosit (aici ES). Registrul segment implicit pentru apelurile indirecte prin variabile sau expresii de tip adresa este determinat de expresia liniei sursa si din aplicarea directivei ASSUME. Cind se transfera controlul cu CALL, se impune si RETurn. Cu CALL indirect trebuie avut grija ca tipul lui CALL sa fie asemanator cu cel al lui RET. CBW CBW - Convert Byte to Word converteste octet la cuvint Operatie: Daca AL e mai mic decit 80h, atunci AH devine 0. Altfel, AH este setat la 0ffh. Este echivalent cu a replica bitul 7 a lui AL la AH. Codificare: 10011000 Timp: 2 ceasuri Exemple: CBW Indicatori afectati: niciunul Descriere: CBW realizeaza o extensie de semn a lui AL in AH. CLC CLC - CLear Carry flag sterge indicatorul carry Operatie: Indicatorul carry este pus la zero. (CF)=0 Codificare: 11111000 Timp: 2 ceasuri Exemple: CLC Indicatori afectati: CF Descriere: CLC sterge CF. CLD CLD - CLear Direction flag sterge indicatorul directie Operatie: Indicatorul directie este pus la zero. (DF)=0 Codificare: 11111100 Timp: 2 ceasuri Exemple: CLD Indicatori afectati: DF Descriere: CLD sterge DF, cauzind la operatiile pe siruri sa auto- incrementeze pointerii de operatie. CLI CLI - CLear Interrupt flag sterge indicatorul intrerupere Operatie: Indicatorul intrerupere este sters. (IF)=0 Codificare:11111010 Timp: 2 ceasuri Exemple: CLI Indicatori afectati: IF Descriere: CLI sterge IF, dezactivind intreruperile externe care apar pe linia INTR a lui 8086 (cele mascabile). CMC CMC - CoMplement Carry flag complementeaza indicatorul carry Operatie: Daca carry este 0, el devine 1; daca este 1 devine 0. if (CF)=0 then (CF)=1 else (CF)=0 Codificare: 11110101 Timp: 2 ceasuri Exemple: CMC Indicatori afectati: CF Descriere: CMC complementeaza CF. CMP CMP - CoMPare two operands compara doi operanzi Operatie: Operandul sursa (stinga) este scazut din operandul destinatie (dreapta). Indicatorii dint afectati dar operanzii nu. (LSRC)-(RSCR) Codificare: operand din memorie sau registru cu operand registru: 001110dw| mod reg r/m if d=1 then LSRC=REG,RSRC=EA else LSRC=EA,RSRC=REG Timp(ceasuri): (a) registru cu registru 3 (b) memorie cu registru 9+EA (c) registru cu memorie 9+EA Exemple: (a) CMP AX, DX (b) CMP ALPHA[DI], DX (c) CMP AX, GAMMA[BP][SI] operand imediat cu acumulator: 0011110W| data | data if w=1 if w=0 then LSRC=AL,RSRC=data else LSRC=AX,RSRC=data Timp: 4 ceasuri Exemple: CMP AL, 6 CMP ,999 sau CMP AX, 999 operand imediat cu operand din memorie sau registru: 100000sw| mod 111 r/m| data | data (daca s:w=01) LSRC=EA,RSRC=data Timp: (a) imediat cu registru 4 (b) imediat cu memorie 17+EA Exemple: (a) CMP BH, 7 (b) CMP [BX][DI], 6ACEH Daca un octet imediat trebuie comparat cu un cuvint din registru sau memorie atunci octetul este extins pe 16 biti, iar codul operatiei este 83h. Indicatori afectati: AF, CF, OF, PF, SF, ZF Descriere: CMP realizeaza o scadere a doi operanzi determinind afectarea indicatorilor dar nu intoarce rezultatul. CMPSB/CMPSW/CMPS CMPS - CoMPare byte String, compare word string compara sir de octet,compara sir de cuvint Operatie: Operandul din dreapta, utilizind DI ca registru index este scazut din operandul din dreapta, care utilizeaza registrul SI ca index. Sint afectati numai indicatorii. DI si SI sint incrementate daca indicatorul de directie este 0, si decrementate daca este 1. Incrementul este 1 pentru sir de octeti, si 2 pentru cel de cuvinte. (LSRC)-(RSRC) if (DF)=0 then (SI)=(SI)+DELTA (DI)=(DI)+DELTA else (SI)=(SI)-DELTA (DI)=(DI)-DELTA Codificare: 0010011W if w=0 then LSRC=(SI),RSRC=(DI),DELTA=1 else LSRC=(SI)+1:(SI),(RSRC)=(DI)+1:(DI),DELTA=2 Timp: 22 ceasuri Exemple: MOV SI, OFFSET STRING1 MOV DI, OFFSET STRING2 CMPS STRING1, STRING2 Numele operanzilor din instructiunea CMPS sint utilizate numai de asamblor pentru a verifica tipul si accesul utilizind registrele curente de segment. CMPS foloseste numai SI si DI pentru a puncta locatiile ce sint comparate. Indicatori afectati: AF, CF, OF, PF, SF, ZF Descriere: CMPS scade octetul adresat de DI din cel adresat de SI si afecteaza indicatorii dar nu intoarce rezultatele. Este un mod de a compara doua siruri. Se poate determina dupa al citelea element al sirurilor elementele sint neegale, stabilind o ordine. Se observa ca operandul indexat de DI este cel din dreapta si ca el este adresat utilizind numai ES - acesta clauza nu poate fi inlocuita. CWD CWD - Convert Word to Doubleword converteste cuvint la dublucuvint Operatie: Cel mai semnificativ bit din AX este replicat in DX. if (AX)<8000H then (DX)=0 else (DX)=0ffffh Codificare: 10011001 Timp: 5 ceasuri Exemple: CWD Indicatori afectati: niciunul Descriere: CWD realizeaza o extensie de semn a lui AX in DX. DAA DAA - Decimal Adjust for Addition ajustare zecimala pentru adunare Operatie: Daca cei mai putin semnificativi (4) biti a lui AL sint mai mari decit 9 sau daca carry auxiliar este 1, atunci aduna 6 la AL si AF devine 1. Daca AL este mai mare decit 9FH sau carry este 1 atunci aduna 60h la AL si seteaza CF. if (AL)&0FH>9 or (AF)=1 then (AL)=(AL)+6 (AF)=1 if (AL)>9FH or (CF)=1 then (AL)=(AL)+60H (CF)=1 Codificare: 10100111 Timp: 4 ceasuri Exemple: DAA Indicatori afectati: AF, CF, PF, SF, ZF nedefiniti: OF Descriere: DAA realizeaza o corectie a rezultatului adunarii a doi operanzi zecimali impachetati, producind o suma zecimala impachetata. DAS DAS - Decimal Adjust for Subtraction ajustare zecimala pentru scadere Operatie: Daca cei mai putin semnificativi (4) biti alui AL sint mai mari decit 9 sau daca carry auxiliar este 1, atunci scade 6 din AL si AF devine 1. Daca AL este mai mare decit 9FH sau carry este 1 atunci scade 60h din AL si seteaza CF. if (AL)&0FH>9 or (AF)=1 then (AL)=(AL)-6 (AF)=1 if (AL)>9FH or (CF)=1 then (AL)=(AL)-60H (CF)=1 Codificare: 00100111 Timp: 4 ceasuri Exemple: DAS Indicatori afectati: AF, CF, PF, SF, ZF nedefiniti: OF Descriere: DAS realizeaza o corectie a rezultatului scaderii a doi operanzi zecimali impachetati, producind o diferenta zecimala impachetata. DEC DEC - DECrement destination by one decrementeaza destinatia cu unu Operatie: Operandul specificat este redus cu 1. Codificare: operand registru: 01001 reg DEST=REG Timp: 2 ceasuri Exemple: DEC DI DEC AX operand registru sau memorie: 1111111w|mod 001 r/m DEST=EA Timp: registru 2 memorie 15+EA Exemple: DEC BL DEC MEM-WORD DEC MEM[BX][SI] Indicatori afectati:AF, OF, PF, SF, ZF Descriere: DEC realizeaza o scadere cu unu a operandului pe care il si intoarce. DIV DIV - DIVision, unsigned impartire, fara semn Operatie: Daca rezultatul impartirii e o valoare care nu poate fi pastrata in registrul corespunzator, se genereaza o intrerupere de nivel 0. Indicatorii sint pusi in stiva, IF si TF devin 0, CS este de asemenea pus in stiva, fiind apoi umplut cu valoarea de la adresa 2. Si IP curent este salvat si apoi incarcat cu valoarea de la adresa 0. Aceasta secventa include un apel lung la rutina de intreruperi ale carui segment si offset sint memorate la locatiile 2 si 0. Daca rezultatul incape atunci citul este memorat in AL sau AX (pentru operatii pe cuvint) si respectiv restul in AH sau DX. notatii: QUO-cit REM-rest DIVR-divizor (temp)=(NUMR) if (temp)/(DIVR)>MAX then (QUO),(REM) nedefiniti (SP)=(SP)-2 ((SP)+1:(SP))=indicatori (IF)=0 (TF)=0 (SP)=(SP)-2 ((SP)+1:(SP))=(CS) (CS)=(2) (SP)=(SP)-2 (IP)=(0) else (QUO)=(temp)/(DIVR) (REM)=(temp)%(DIVR) Codificare: 1111011w|mod 110 r/m (a) if w=0 then NUMR=AX,DIVR=EA,QUO=AL,REM=AH,MAX=ffh (b) else NUMR=DX:AX,DIVR=EA,QUO=AX,REM=DX,MAX=ffffh Timp: ceasuri 8biti 90+EA 16biti 155+EA Exemple: (a1) divid cuvint cu octet MOV AX, NUMERATOR_WORD DIV DIVISOR_BYTE ;citul va fi in AL, restul in AH (a2) divid octet cu octet MOV AX, NUMERATOR_WORD CBW DIV DIVISOR_BYTE ;citul in AL, restul in AH (b1) divid dublu cuvint prin cuvint MOV DX, NUMERATOR_HI_WORD MOV AX, NUMERATOR_LO_WORD DIV DIVISOR_WORD ;cit in AX rest in DX (b2) divid cuvint prin cuvint MOV AX, NUMERATOR_WORD CWD DIV DIVISOR_WORD ;citul in AX,restul in DX Orice operand din exemple poate fi orice variabila sau expresie de tip adresa, atit de lunga dupa cum este si tipul ei. Indicatori afectati: rezultatele indicatorilor nu sint valide Descriere: DIV realizeaza o impartire fara semn a unui operand de lungime dubla, continul in AL si AH pentru operatia pe 8 biti si in AX si DX pentru operatia pe 16 biti de catre operandul DIVR. Se intoarce un cit de tip octet in AL sau AX si un rest de lungime octet in AH sau DX. Daca citul este mai mare decit MAX (impartire prin 0) atunci QUO si REM sint nedefinite si se genereaza o intrerupere de nivel 0. Indicatorii sint nedefiniti, iar citurile neintregi sint trunchiate la intregi. ESC ESC - ESCape Operatie: if mod<>11 then data bus=(EA) if mod=11, no operation. Codificare: 11011 x | mod x r/m Timp: 7+EA ceasuri Exemple: ESC EXTERNAL-OPCODE, ADDRESS Indicatori afectati: niciunul Descriere: Instructiunea ESC furnizeaza un mecanism prin care alte procesoare pot primi instructiuni de la 8086 si utilizeaza modul de adresare a lui 8086. Procesorul 8086 nu are alta operatie pentru ESC decit de a accesa un operand din memorie si de a-l plasa pe magistrala. HLT HLT - HaLT Operatie: nici una Codificare: 11110100 Timp: 2 ceasuri Exemple: HLT Indicatori afectati: nici unul Descriere: Instructiunea HLT determina procesorul 8086 sa intre in starea halt. Starea halt este stearsa prin intrerupere externa valida sau reset. IDIV IDIV - Integer DIVision, signed impartire intreaga, cu semn Operatie: Daca rezultatul impartirii e o valoare care nu poate fi pastrata in registrul corespunzator, se genereaza o intrerupere de nivel 0. Indicatorii sint pusi in stiva, IF si TF devin 0, CS este de asemenea pus in stiva,fiind apoi umplut cu valoarea de la adresa 2. Si IP curent este salvat si apoi incarcat cu valoarea de la adresa 0. Aceasta secventa include un apel lung la rutina de intreruperi ale carui segment si offset sint memorate la locatiile 2 si 0. Daca rezultatul incape atunci citul este memorat in AL sau AX (pentru operatii pe cuvint) si respectiv restul in AH sau DX. notatii: QUO-cit REM-rest DIVR-divizor (temp)=(NUMR) if (temp)/(DIVR)>MAX and (temp)/(DIVR)>0 or (temp)/(DIVR)<0 and (temp)/(DIVR)<0-MAX-1 then (QUO),(REM) nedefiniti (SP)=(SP)-2 ((SP)+1:(SP))=indicatori (IF)=0 (TF)=0 (SP)=(SP)-2 ((SP)+1:(SP))=(CS) (CS)=(2) (SP)=(SP)-2 (IP)=(0) else (QUO)=(temp)/(DIVR) (REM)=(temp)%(DIVR) Codificare: 1111011w|mod 111 r/m (a) if w=0 then NUMR=AX,DIVR=EA,QUO=AL,REM=AH,MAX=7fh (b) else NUMR=DX:AX,DIVR=EA,QUO=AX,REM=DX,MAX=7fffh Timp: ceasuri 8biti 112+EA 16biti 177+EA Exemple: (a) MOV AX, NUMERATOR_WORD[BX] IDIV DIVISOR_BYTE[BX] (b) MOV DX, NUM_HI_WORD MOV AX, NUM_LO_WORD IDIV DIVISOR_WORD[SI] Indicatori afectati: AF, CF, OF, PF, SF, ZF dar sint toti nedefiniti Descriere: IDIV realizeaza o impartire cu semn a unui operand de lungime dubla, continul in AL si AH pentru operatia pe 8 biti si in AX si DX pentru operatia pe 16 biti de catre operandul DIVR. Se intoarce un cit de tip octet in AL sau AX si un rest de lungime octet in AH sau DX. Daca citul este pozitiv si mai mare decit MAX (impartire prin 0) sau negativ si mai mic decit (0-MAX-1) atunci QUO si REM sint nedefinite si se genereaza o intrerupere de nivel 0. Indicatorii sint nedefiniti, iar citurile neintregi sint trun- chiate la intregi. IMUL IMUL - Integer MULtiply accumulator by register-or-memory, signed - inmultire intreaga intre acumulator si registru sau memorie, cu semn Operatie: Acumulatorul (AL pentru octet, AX pentru cuvint) este inmultit prin operandul specificat. Daca jumatatea superioara a rezultatului este extensia de semn a jumatatii inferioare, indicatorii carry si overflow sint stersi, altfel sint 1. (DEST)=(LSRC)*(RSRC) if (EXT)=extensie-semn(LOW) then (CF)=0 else (CF)=1; (OF)=(CF) Codificare: 1111011w| mod 101 r/m (a) if w=0 then LSRC=AL,RSRC=EA,DEST=AX,EXT=AH,LOW=AL (b) else LSRC=AX,RSRC=EA,DEST=DX:AX,EXT=DX,LOW=AX Timp: ceasuri 8biti 90+EA 16biti 144+EA Exemple: (a) MOV AX, LSRC_BYTE IMUL RSRC_BYTE ;REZULTAT IN AX (b1) MOV AX, LSRC_WORD IMUL RSRC_WORD ;in DX jumatatea semnificativa, AX cealalta (b2) inmultirea unui octet cu un cuvint MOV AL, MUL_BYTE CBW IMUL RSRC_WORD Observatie: Orice operand de memorie din exemple poate fi o expresie de tip adresa indexata al carui tip trebuie sa fie corect. De exemplu, LSRC_BYTE poate fi ARRAY[SI] daca ARRAY este de tip BYTE. Indicatori afectati: CF, OF nedefiniti: AF, PF, SF, ZF Descriere: IMUL realizeaza o inmultire cu semn a acumulatorului (AL sau AX) si a operandului sursa, intorcind un rezultat de lungime dubla in acumulator si extensia sa (AL si AH pentru 8 biti, AX si DX pentru 16 biti). CF si OF sint setati daca jumatatea superioara a rezultatului nu este extensie de semn a jumatatii inferioare. IN IN - INput byte or input word input de octet sau input de cuvint Operatie: Continutul acumulatorului este inlocuit de continutul portului desemnat. (DEST)=(SRC) Codificare: port fix: 1110010w| port if w=0 then SRC=port,DEST=AL else SRC=port+1:port,DEST=AX Timp: 10 ceasuri Exemple: IN AX, WORD_PORT IN AL, BYTE_PORT ;destinatia pentru input trebuie sa fie AX sau AL, si trebuie specificata cu scopul comunicarii asamblorului a tipului intrarii. Numele portului trebuie sa fie o valoare imediata intre 0 si 255 sau numele registrului DX care trebuie umplut mai devreme cu locatia portului. port variabil: 1110110w if w=0 then SRC=(DX),DEST=AL else SRC=(DX)+1:(DX),DEST=AX Timp: 8 ceasuri Exemple: IN AX, DX IN AL, DX Indicatori afectati: nici unul Descriere: IN transfera un octet (cuvint) de la un port de intrare in registrul AL (AX). Portul e specificat ca o data imediata sau in registrul DX. INC INC - INCrement destination by one incrementeaza destinatia cu unu Operatie: Operandul specificat este adunat cu 1. Nu se genereaza carry. Codificare: operand registru: 01000 reg DEST=REG Timp: 2 ceasuri Exemple: INC DI INC AX operand registru sau memorie: 1111111w|mod 000 r/m DEST=EA Timp: (a) registru 2 (b) memorie 15+EA Exemple: INC BL INC MEM-WORD INC MEM[BX][SI] Indicatori afectati: AF, OF, PF, SF, ZF Descriere: INC realizeaza o adunare cu unu a operandului pe care il si intoarce ca rezultat. INT INT - INTerrupt intrerupere Operatie: Pointer-ul de stiva este decrementat cu 2 si indicatorii sint salvati in stiva. Indicatorii de intrerupere si capcana sint pusi la 0, din nou SP e decrementat 2 iar continutul lui CS este salvat. CS este umplut cu partea semnificativa a vectorului de intreruperi(dublu cuvint), deci cu segmentul de baza al rutinei de intreruperi pentru acest tip de intreruperi. SP este din nou decrementat cu doi, de data asta se salveaza IP in stiva. IP va fi umplut cu cuvintul mai putin semnificativ al vectorului de intreruperi, localizat la adresa absoluta TYPE*4. Astfel se completeaza un apel intersegment la procedura care prelucreaza acest tip de intrerupere (vezi PUSHF, INTO, IRET). (SP)=(SP)-2 ((SP)+1:(SP))=indicatori (IF)=0 (TF)=0 (SP)=(SP)-2 ((SP)+1:(SP))=(CS) (CS)=(TYPE*4+2) (SP)=(SP)-2 ((SP)+1:(SP))=(IP) (IP)=(TYPE*4) Codificare: 1100110v| tip daca v=1 (a) if v=0 then TYPE=3 (b) else TYPE=tip Timp: 52 ceasuri Exemple: (a) INT 3 (b) INT 2 INT 67 OBSERVATIE: operandul trebuie sa fie o data imediata nu o referinta la un registru sau memorie Indicatori afectati: IF, TF Descriere: INT salveaza starea programului si transfera controlul cu un apel indirect unui vector de intrerupere (din cele 256). INTO INTO - INTerrupt if Overflow intrerupere daca exista overflow Operatie: Daca exista overflow pointer-ul de stiva este decrementat cu 2 si indicatorii sint salvati in stiva. Indicatorii de intrerupere si capcana sint pusi la 0, din nou SP e decrementat 2 iar continutul lui CS este salvat. CS este umplut cu partea semnificativa a vectorului de intreruperi (dublu cuvint), deci cu segmentul de baza al rutinei de intreruperi pentru tipul 4 de intreruperi. SP este din nou decrementat cu doi, de data asta se salveaza IP in stiva. IP va fi umplut cu cuvintul mai putin semnificativ al vectorului de intreruperi, localizat la adresa absoluta 16(10h). Astfel se completeaza un apel intersegment la procedura care prelucreaza acest tip de intrerupere (vezi INT, IRET, PUSHF). if (OF)=1 then (SP)=(SP)-2 ((SP)+1:(SP))=indicatori (IF)=0 (TF)=0 (SP)=(SP)-2 ((SP)+1:(SP))=(CS) (CS)=(12h) (SP)=(SP)-2 ((SP)+1:(SP))=(IP) (IP)=(10h) Codificare: 11001110 Timp: 52 ceasuri Exemple: INTO Indicatori afectati: nici unul Descriere: INTO salveaza starea programului si transfera controlul cu un apel indirect vectorului de intrerupere de la locatia 4. Daca OF este 0 nu are loc nici o operatie. IRET IRET - Interrupt RETurn intoarcere din intrerupere Operatie: In IP este incarcat cuvintul din virful stivei. Ca urmare, pointer-ul de stiva este incrementat cu 2, si cuvintul din virful stivei este introdus in CS. Astfel se intoarce controlul in punctul in care a fost intilnita intreruperea. SP este din nou incrementat cu 2 si se refac indicatorii cu cuvintul din virful stivei. SP se incrementeaza din nou. Codificare: 11001111 Timp: 24 ceasuri Exemple: IRET Indicatori afectati: toti Descriere: IRET transfera controlul adresei de intoarcere salvata la o operatie anterioara de intrerupere, reface deasemenea indicatorii.