Sunteți pe pagina 1din 22
SETUL INSTRUCTIUNILOR DE BAZA Instructiuni pentru mutarea datelor Aceste instructiuni previid metode pentru mutarea octetilor si cuvintelor intre memorie gi registrele de baza. Instructiuni pentru mutarea datelor cu scop-general MOV (Move) - transfera un octet sau un cuvant din operandul sursa in operandul destinatie. Instructiunea MOV este folositoare pentru a transfera din memorie intr- lun registru, din registru in memorie, intre registre, imediat in registra sau imediat in memorie. Transferurile memorie-memorie si registru segment-registru segment nu sunt permise ‘MOV DSAX Se inlocuieste continutul registrulut DS cu continutul registrului AX XCHG (Exchange) - schimba intre ele continuturile a doi operanzi. Aceasta instructitune inlocuieste trei instructiuni de tipul MOV. Nu necesita 0 locatie de memorie temporara pentru a salva conjinutul unui operand in timp ce il vom incarca pe celalalt. Instructiunea XCHG poate schimba doi operanzi de tip octet sau doi operanzi de tip cuvant, dar nu un octet cu un cudnt. Operandii pentru instructiunea XCHG pot fi doua registre operand sau un registra operand cu un operand memorie. XCHG BX, WORDOPRND Schimba continutul registrului BX cu continutul cuvantului din ‘memorie identificat prin eticheta WORDOPRND. Instruefiuni de manipulare a stivet PUSH - decrementeaza indicatorul de stiva (SP) cu doi si apoi transfer& un cuvant din operandul sursa in varful stivei indicat de SP. Adresa Limita SS mai mare I J op a crema sp-2 Adresa maimics 7 : Inaine de upd PUSH PUSH SP (Stack Pointer) punctcaza intotdeauna ultimul cuvant intodus in stiva. PUSH este adesea folosita pentru a plasa pe stiva parametri inainte de apelul unei subrutine; este de asemenea mijlocul de bazi de a stoca variabile temporare pe stiva. Instructiunea PUSH cu operanzi memorie, imediati si registru (inclusiv registrele segment), PUSH WORDOPRND Transferd 0 valoare de 16 biti din memorie aflata ta adresa data de eticheta WORDOPRND ta locatia de memorie ce reprezintd varful curent al stivei (transferut de octeti nu este permis). PUSHA (Push All Registers) ~ salveaza continutul a opt registre generale pe stivd, Aceasta instructiune simplifica apelurile de subrutine prin reducerea numarului de instructiuni solicitate pentru a retine continutul registrelor generale spre a putea fi folosite apoi de subrutina. Procesorul impinge pe stiva registrele generale in urmatoarea ordine: AX, CX, DX, BX, valoarea initiala a SP inainte de AX, BP, SI si Di Adresa Limita $s mai mare sp —» LMM |<— SP-16 Adresa ‘mai mica fnaime de Dups PUSIIA PUSHA POP - extrage un cuvant din stiva de la pozi destinatic dupa care SP se va incrementa cu dot Singura restrictie a instructiunii POP este cé val Plasata in registrut Cs, curenta a SP si o depune la indicand noul varf al stivei loarea extras nu poate fi Adresa Limita $s ‘mai mare LN, spy Operand SP Adresa mai mica Dups POP POP BX Inlocuieste continutul registrului BX cu confinutul locatiei de memorie aflate in varful stivei. POPA (Pop All Registers) restaureaza registrele salvate pe stiva de PUSHA. Adress Inwimte de Dupa POPA POPA INSTRUCTIUNI ARITMETICE. operatie artimetic& poate consta din doi operanzi registru, dintr-un operand registru sursa cu un operand memorie destinatie, dintr-un operand memorie sursa cu un operand registru destinafie, sau cu un camp imediat, cu, fie un registru, fie o locatie memorie destinajie dar niciodata doi operanzi ‘memorie. Instructiunile artimetice pot opera fie pe octet, fie pe cuvant. Instructiune de adunare ADD (Add integers) inlocuieste destinatia cu suma dintre sursi si destinatie. ADD afecteazi OF, SF, AF, PF, CF, si ZF. ADD BL,BYTBOPRND Adund continutul octetului de memorie etichetat BYTEOPRND la continutul lui BL, si va inlocui BL cu suma rezultata. ADC (Add Intergers with Carry) ~ aduna operanzii, adund si un unu daca CF este setat, si Inlocuiete operandul destinatie cu rezultatul. ADC poate fi folosit pentru a aduna numere mai lungi de 16 biti. ADC afecteaza OF, SF, AF, PF, CF, si ZF. ADC BX,CX Inlocuieste continutul operandutui destinatie BX cu suma dintre BX, CX si 1 (dacd CF este setat). Dacd CF-0, ADC realizeaza aceiasi operate ca instructiunea ADD. INC (Increment) aduna unu la destinatie. Procesorul trateaz& operandul ca un numér binar fra semn, INC actualizeazA PF, AF, OF, SF 9i ZF dar nu afecteaz CF. INC BL Aduné unu ta confinutul tui BL Instructiuni de scadere SUB (Subtract Integers) scade sursa din destinatie gi incoluieste destinatia cu rezultatul. Daca este necesar un imprumut CF este setat Operanzii pot fi cu semn sau fad semn pe octet sau pe cuvant. SUB afectearA OF, SF, ZF, AF, PF si CF. SUB _WORDOPRND,AX Inlocuieste confinutul operandului destinatie WORDOPRND cu rezultatul objinut din scdderea lui AX din conginutul locatiei de memorie etichetata WORDOPRND. SBB (Subtract Integers with Borrow) scade operandul surs din operandul Gestinatie. Operanzii pot fi cu semn sau fara semn, pe octet sau pe cuvant. Se va scddea 1 dac& CF este setat gi rezultatul va fi depus in operandul destinatie. SBB poate fi folosit pentru a scidea numere mai hungi de 16 bifi. Aceasté instructiune afecteazA OF, SF, ZF, AF, PF, si CF. CF este setat daca un imprumut este necesar. SBB BL,32 Scade 32 din continutul lui BL si apoi decrementeaza rezultatul scdderii cu unu dacd CF este setat. Dacd CF=0, SBB realizeazé acviasi operatic ca SUB. DEC (Decrement) - scade 1 din destintie. DEC actualizeaza AF, OF, PF, SF si ZF dar nu afecteaza CF. DEC BX Seade 1 din continutul iui BX si plaseazd rezultatul inapoi in BX. Instructiuni de inmultire MUL (Unsigned Intergers Multiply) realizeaz4 o inmultire fara semn intre un operand surs& gi acumulator. Daca sursa este un octet, procesorul il va inmuiti cu confinutul Iui AL si va returna un rezultat cu lungime dubla in AH si AL. Dacd operandul sursa este un cuvant, procesorul il inmuleste cu continutul lui AX si returneaza rezultatul in dubla lungime in DX gi AX. MUL seteaza CF si OF pentru a indica ca jumatatea superioara a rezultatului este diferita de zero; altfel sunt stergi. Aceasta instructiune las SF, ZF, AF si PF nedefiniti ‘MUL BX Inlocuieste confinutul fui DX gi AX cu produsul dintre BX si AX. Cei 16 biti inferiori ai rezultatului vor inlocui confinutul lui AX tar cei 16 biti superior’ vor merge in DX. Procesorul va seta CF gi OF daca reaultatul fara semn este mai mare de 16 biti IMUL (Signed Integers Multiply) realizeazA 0 operatie de inmultire cu semn. IMUL foloseste AX si DX in acelagi fel ca instruciiunea MUL, facand exceptie cand folosim forma imediata. Forma imediata a lui IMUL permite specificarea registrului de destinatie altul decat DX gi AX. In acest caz, rezultatul nu poate depasi 16 biti. fara s& cauzeze 0 depasire. Daca operandul imediat este un byte, procesorul in mod automat il extinde la 16 biti inainte de a efectua inmultirea, IMUL sterge CF gi OF pentru a indica ci jumatatea superioara a rezultatului este semnul jumatatii inferioare, Aceasta instructiune lasa SF, ZF, AF §1 PF nedefiniti IMUL BL Intocuieste continutul tui AX cu produsul dintre BL si AL. Procesoru seteaz CF si OF daca reaultatul este mai mare de 8 biti MUL BX, SI, 5 Inlocuieste continutul tui BX cu produsul dintre continutul lui SI si valoarea imediata 5. Procesorul seteazd CF si OF daca rezultatul cu semn e mai tung de 16 bifi, Instructiuni de impartire DIV (Unsigned Integers Divide) realizeazd o impartire fara semn a acumulatorului printr-un operand sursi. Daca operandul sursa este un octet, va fi divizat in dubla lungime presupundnd ca deimparjitul este in registrele AL $i AH (AH=msb). Un cat simpla-lungime va fi returnat in AL si un rest simpla Tungime va fi returnat in AH. Daca operandul sursa este un cuvant, deimpartitul in dublé-lungime se va afla in registrele AX si DX. Catul in simpli-lungime va fi returnat in AX, gi restul in simpla-lungime va fi returnat in DX. Caturile care nu sunt numere intregi sunt trunchiate la intreg, Restul este intotdeauna mai mic decat impartitorul. DIV lasé OF, SF, ZF, AP, PF 5i CF nedefinite. Are loc (INT 0) daca impartitoral este zero sau daca catul este prea mare pentru AL sau AX. DIV BX Inlocuieste continutul ui AX cu cétul fara semn al impartrit cuvantului dubls care a fost continut in DX si AX, ta continutul lai BX. Restul fara semn va iniocui confinutul lui DX. DIV BL Inlocuieste continutul tui AL cu cdtul fard semn al cuvantului din AX impartit cu BL. Restul faird semn este continut in AH. IDIV (Signed Integers Divide) realizeazd o impartire cu semn a acumulatorului prin operandul sursa, IDIV foloseste aceleasi registre ca gi instructiunea DIV. Pentru impértires cu semn pe byte, maximul pentra catul poditiv este +127 gi minimul pentru cat negativ -128. Pentru imparjirea pe cuvant, catul maxis pozitiv este +32767 gi minimul pentru catul negativ -32768. Resultatele neintregi vor fi trunchiate spre zero. Restul va avea intotdeauna Acelagi semn ca deimpartitul gi va fi mai mic decat impartitorul. IDIV last OF SF, ZF, AF, PF i CF nedefinite, O impartire cu zero sau un eit mai mare ca AL, au AX vor provoca (INT 0}. IDIV WORDOPRND Inlocuieste continutul lui AX cu un cat cu semn cu valoare dublu- cuvdint confinut in DX $i AX, rezultat din impartirea la valoarea din locatia de memorie cu eticheta WORDOPRND. Restul cu semn va inlocui continutul tui DX. INSTRUCTIUNI LOGICE Instructiuni pentru operatiuni booleene Cu exceptia instructiunilor NOT si NEG, instructiunile pentru operatiuni booleene pot folosi doi operanzi registru, un operand registru $i unul memorie, pn operand imediat cu un operand registra sau un operand memorie, Instructiunile NOT si NEG sunt operajii unare care folosese deci un singur operand, AND (And) _realizeazi un “$1” logic al operanzilor (octet sau_cuvant) gi Feturneaza rezultatul in operandul destinatie. AND sterge OF $i DF, lasd’ AF nedefinit si actualizeaza SF, ZF 9i PF. AND WORDOPRND, Bx Inlocuieste continutul ui WORDOPRND cu “SP’ul logic dintre continutul locatiei de memorie cu eticheta WORDOPRND $i confinutul ui BX. NOT (Not) inverseazi biti in operandul specificat pentru a se obtine complementul lui fata de unu, Not nu afecteaza bitii de conditie. NOT BYTEOPRND Inlocuieste conjinutul original al tui BYTEOPRND cu complementul fata de unu, OR inclusive OR) realizeazé operatia logica de “SAU INCLUSIV" a doi operanzi Si returneaza rezultatul in operandul destinatie. OR gterge OF $i DF, ined AP nedefinit, gi actualizeazd SF, ZF gi PF, OR ALS Inlocuieste continutul initial al tui AL cu reauttatul operatiei logice “SAU” a conjinutului lui AL eu valoarea imediata 5 HOR (Exclusive OR) realizeaza operatia logicd “SAU EXCLUSIV" a doi operanzi gi returneaza rezultatul in operandul destinatie. XOR sterge OF si DF. lasd AF nedefinit, gi actualizeazA SP, ZF si PF. XOR DX, WORDOPRND Intocuieste confinutul initial a tui DX cu valoarea logica a “SAU EXCLUSIV"=ulut dintre continutul lui DX si confinutul locafiei de memorie etichetata WORDOPRND. NEG (Negate) formeazi complementul fafa de doi a unui octet sau a unui cuvant cu semn. Efectul instructiunii NEG este de a inversa semnul unui operand din pozitiv in negativ sau din negativ In pozitiv. NEG actualizeaza OF, SF, ZF, AF, PF i CF, NEG AX Inlocuieste continutul original a tui AX cu complementul li doi al acestui registra. Instructiuni de deplasare si de rotire Instructiunile de deplasare gi rotire repozitioneaza biti in cadrul unui operand specificat. Instructiunile de deplasare sunt in mod convenabil de a realiza inmultirea si impartirea in binar. Instructiunile de rotire sunt foarte folositoare pentru testarea unor biti. Instructiuni de deplasare Bitii dintr-un octet sau cuvant pot fi deplasati aritmetic saw logic. In functie de valoarea unui contor, pand la 31 de pasi pot fi executati O instructiune de deplasare poate specifica contorul in trei moduri: ~ Instructiunea de deplasare specificd in mod implicit contorul ca o singura deplasare = Specifica contorul ca un numér imediat - Specifica contorul ca o valoare conjinut& in CL. Aceastd ultima forma permite contorului sd fie 0 variabilé pe care programul o furnizeaza in timpul executici. Instructiunile de deplasare afecteazd bitii de conditie astfel: AF este intotdeauna nedefinit dupa o opcratie de deplasare PF, SF si ZF sunt actualizati normal ca gi in instruetiunile logice. CF va confine intotdeauna valoarca ultimului bit deplasat in afara operandului destinajie. OF va fi setat daca bitul de semn va fi alterat de operatia de deplasare in rest este zero (deplasare cu un bit) SAL (Shift Arithmetic Left) deplaseazA operandul octet sau cuvant din destinatie cu un bit sau mai mulji bii specificati in contor. Procesorul va deplasa zerouri in locajiile din dreapta operandului ramase libere prin deplasarea spre stanga a acestuia, SAL BL,2 Se deplasaeza continutul lui BL cu doi bifi $i se vor inlocui ultimii doi biti cu zerouri, ‘SHL (Shift Logical Left) este fizic aceiasi instructiune cu SAL once Inainte de SAL aa) 1 . oF cr WO CLE PPP Teper TPO] dupa deptasares Belee counbi WIMP TT yopolvifijoyoyoyoyoyoyoro irae SHR (Shift Logical Right) deplascaz operandul destinatie octet sau cuvant, cu unu sau mai multi biti spre dreapta de numarul de ori specificat in contor (0 valoare imediaté sau o valoare confinuta in CL). Procesorul va deplasa zerouri in partea stanga a operandului pe masura ce bitii ies prin partea dreapta cr TPT PTT TT ToT TOT 7} Gz inaine de SHR cr OTTO TP TOT TTopoyo) Cy Pups sur cw cr oToloToToToyoTaTopopoyi oye) CH Depa SHR eu 1 it SHR BYTEOPRND,CL Deplaseazd confinutul octetului din locatia de memorie cu eticheta BYTEOPRND cu numarul de biti specificati in CL si completeazd artea stranga a operandului cu un numar egal de zerouri. SAR (Shift Arithmetic Right) deplaseazé operandul destinatie la dreapta cu un bit sau un numar de biti specificayi in operandul contor (o valoare imediata saut conjinuté in CL). Procesorul conserva, in acest caz, semnul operandului deplasiind in partea sting’ zerouri daca numarul are valoare pozitiva sau unuri daca numérul are valoare negativa, inainte de SAR S]oT oy oye poypayopoyoya pena un numa poritiv COTeToTo ToT eToToTopoopare ee eaeee CF inainte de SAR CREPT TTT poppe poy py aS, cp meaty Corp OTTTIT TOTO} [0] dupa sar cus SAR WORDOPRND,1 Deplaseazd confinutul locatiei de memorie cu eticheta WORDOPRND cu un bit la dreapta $i tnlocuieste bitul de semn x0 valoare egala semnutui original al tui WORDOPRND. Instructiuni de rotire Instructiunile de rotire permit ca bitii aflafi intr-un octet sau cuvant s& fe rotiti. Bijii care sunt rotifi in afaré nu se pierd ca la operafiunea de deplasare ci sunt ciclati la celdialt capat al operandului Operatiunea de rotire afecteazd numai flag-urile carry $i overflow. CF poate actiona ca 0 extensie a unui operand permitand unui bit sa fie izolat gi apoi testat de un salt conditionat (JC sau JNC). CF va contine intotdeauna Yaloarea ultimului bit rotit in afara, chiar daca instructiunea nu foloseste acest bit ca o extensie a operandului rotit, In rotirile cu un singur bit OF este setat dacd operatia schimba bitul semn al operatiei destinatic. Daca bitul de semn ramane cu valoarea originala, OF va fi sters. La rotatiile multibit, valoarea lui OF este intotdeauna nedefinita ROL (Rotate Left) roteste operandul destinatie la sténga cu un bit sau ua numar de biti specificat de operandul contor (valoare imediata sau valoare continuta in CL). Dupa fiecare rotatie specificata, bitul cel mai semnificativ din stanga operandului va veni in dreapta acestuia pentru a ocupa pozitia celut mai putin semnificativ bit rotit stanga, cr OD GTO ToT op op a eTO To] tnsinte de ROL cr Oefopopoyiy ty ipoyr ToT ToT oyoyT} Hes reat eT un bi Dupa ROL cu 12 bi iyo {Toyo} o] 1 [eyore Te on] 10 ROL AL,8 Roteste conyinutul lui AL spre stanga de 8 oni. Aceasté rotafie va readuce AL la valoare inijialé dar va izola bitul cel mai putin semnificativ in CF pentru @ putea fi testat de JC sau JNC. ROR (Rotate Right) Roteste continutul operandului destinatie cu un bit sau un numar de biti specificati in operandul contor. Pentru fiecare rotatie specificata, bitul c.m.p.s care iese prin dreapta operandului se va intoarce in stanga acestuia pentru a deveni c.m.s bit. oF TET POTOT TOT PAPA O TOTO) GK) nainte de ROR cr TTOTTET TOTOT TOT tT TT 0 [o> La] Pup ROR eu cr DTT yepeyoli fi Dupé ROR cu 8 ROR WORDOPRND,CL Roteste continutul operandului aflat in memorie la locatia cu eticheta WORDOPRND cu un numér de biti aflat tn CL. CF reflecta valoarea ultimului bit rotit de la dreapta la stanga operandului. RCL (Rotate Through Carry Left) roteste bitii din operandul destinatie spre stanga cu un bit sau numar de biti aflat in operandul contor. Aceasta instructiune difera de ROL prin aceea ca ea trateaza CF ca o extensie de un bit al operandului destinatie. Fiecare c.m.s bit care iese prin partea stanga a operandului se muta in CF inainte de a se intoarce in operand ca cam.p.s bit la urmatoarea rotatie. cr T) CETTE TTPO TOTO TO] nine de rev cr perenne DOT Depa nct cw cr {i OPOTETTTTEOTETTOTOT IH ype Rel-cars RCL BX,1 Roteste continutul tui BX spre stanga cu un bit. Bitul em.s al operandului se mutd in CF, cei 15 biti care raman se muta la stanga cu 0 pozifie si valoarea initiald a lui CF devine c.m.p.s bit. RER (Rotate Through Carry Right) roteste operandul destinatie la dreapta cu un bit sau un numar de biti dat de operandul contor. Aceasté instructiune diferd de ROR prin accea ca trateazi CF ca pe o extensie de tip cm.p.s bit a operandului destinatie, Fiecare c.m.p.s bit care iese prin dreapta operandului se muta in CF inainte de a se reintoarce in pozifia c.m.s bit al operandului la urmatoarea rotatie. cr TOT ToToTol ii popoyi yt fololoyo} mm Inainte de RCR CF Dup RCR cu cr Dupa RCR cu 3 LOLoTi Tit [i ToloT opi yi yore DTo}o+4 bi ROR BYTEOPRND,3 Roteste continutul locatiei de memorie de un byte cu eticheta BYTEOPRND spre dreapta cu 3 biti Dupa executia acestei instructiuni CF va deveni valoarea finald a bitului numdrul 5 din BYTEOPRND $i valoarea originala a lui CF devine bitul 2. Instructiuni pentru conversie de tip $1 fara operatie CWD (Convert Word to Double Word) extinde semnul cuvantului aflat in registrul AX asupra registrului DX. CWD nu afecteazd nici unul din flag-uri CWD poate fi folosit pentru a produce un dublu-cuvant ce va constitul deimpartitul provenit dintr-un cuvant la impartirea pe cuvant. CBW (Convert Byte to Word) extinde semnul octetului aflat in registrul AL, asupra registrului AH. CBW nu afecteaza bitii de conditie. NOP (No Operation) ocupa un octet de memorie gi nu afecteazé nimic altceva decat indicatorul de instructiunoi IP. Cantitatea de timp pe care o instructiune NOP o solicita pentru executie variaza in functie de rata ceasualul CPU, Aceasta variatic 0 face nerecomandata pentru constituirea buclelor de timp in programele ce vor fi purtate gi pe alte calculatoare cu o configuratie hard diferita, NOP Procesorul nu executd nici 0 operatie pentru 2 cicturi de ceas. Instructiuni de comparare si testare Instructiunile de comparare gi testare au o caracteristic& comund prin aceea c& nu altereazd operanaii, Aceste instructiuni realizeaza operatii care seteazd numai flag-urile corespunzatoare pentru a indica relatia dintre doi operanai. TEST realizeazd un “SI” logic a celor doi operanzi, sterge OF si DF, lasa AP nedefinit. Diferenta dintre TEST si AND este ca TEST nu altereazd operandul destinatie. TEST BL,32 Realizeazé un si logic “si" seteaza SF, ZF si PF. CMP (Compare) ~ scade operandul sursA din operandul destinatie. Actualizeaza OF, SF, AF, ZF, PF si CF dar nu modifica operanzii sursd si destinatie, O instructiune de transfer conditionat poate testa rezultatul prin folosirea flag-ului corespunzator. CMP Bx,32 Seadle operandul imediat 32, din confinutul lui BX si seteaza OF, SP, 28, AR, PF si CF pentru @ reflecta recultatul. Continutul tui BX ramane acelagi. Instructiuni de control al transferutui Exist doud categorii mari de instructiuni de transfer pentru a directiona executarea unui program: transfer conditionat sitransfer neconditionat, ‘Transferurile conditionate depind de rezultatele operatiilor care afecteazi flag-urile. ‘Transferurile neconditionate sunt intotdeauna executate, Transferurile neconditionate Aceste instructiuni sunt JMP, CALL, RET, INT si IRET. Ele transfer controlul de Ia 0 locatie de cod la alta. Aceste locatii pot fi in acelagi segment sau in segmente diferite. Instructiunea JUMP SMP transfera in mod neconditionat controlul la locatis tinté. Ea este un transfer cu sens unic; ea nu salveazd o adresi de intoarcere pe stiva. Implementarea acestei instruciiuni variaza funcjie de Urméatorii factori: + Este adresa specificata direct in cadrul instructiunii sau indirect prin intermediul unui registra sau al memoriei, - Locajia jinta se gaseste in interiorul sau exteriorul segmentului selectat in CS. MP direct in cadrul segmentului curent de cod Un JMP direct care transfer controlul unei {inte din cadrul segmentului de cod curent foloseste o deplasare relativé a cérei valoare este continuta in Structiune. Aceasta valoare poate fi o valoare pe 16 biti sau o valoare pe 8 biti Su Semnul extins la 16 biti, Procesorul va forma adresa efectiva prin adaugarea deplasarii la adresa continuta in IP. IP se referd la urmatoarea instructiune: UMP NEAR NEWCODE Transferd controtul ta locatia finta etichetata NEAR_NEWCODE care ‘se gaseste in cadrul segmentului cle cad selectat in registrul CS. MP indirect in cadrul segmentulut de cod curent Instructiunile de JMP indirect transferd controlul la 0 locatie in cadrul Seementului de cod curent i specifica o adresa absoluta prin urmatoarele cai, Programul poate sari la o locatie specificata de un registra de 16 biti (AX, DX, CX, BX, BP, SI si Di}. Procesorul muta aceasta valoare de 16 biti in IP §1 reia executia, uMP SI Transfera controlul la adresa tinta formata prin adaugarea celor 16 biti din Si la adresa de baza continuta in CS. Procesorul poate detine, de asemenea, adresa de destinatie in cadrul Segmentului curent dintr-un operand cuvant din memorie spe instructiune. UMP PTR_X (eticheta de variabita) Transferd controlul la adresa tintd formata prin adaugarea valorii de 16 bifi confinutd tn cuvdntul memorie etichetat PTR-X la adresa de bazd continuta in CS. Un registra poate modifica adresa cuvantului din memorie care va selecta ulterior adresa de destinatie. UMP CASE TABLE (BX) CASE. TABLE este primul cuvant dintr-o matrice de pointeri cuvant Valoarea lui BX determina care pointer ua fi selectat de program din matrive. Instructiunea JMP transfera apoi controlul la tocetia specificatd de pointerul selectat UMP direct in afara segmentului de cod curent Instructiunile de UMP direct care specifica 0 locatie finta in afara segmentului de cod curent contin un pointer intreg pe 32 de biti. Acest pointer const dintr-un selector pentru noul segment de cod si o deplasare in cadrul noului segment. UMP FAR_NEWCODE FOO Plaseaza adresa de segment confinuta tn instruetiune in CS si deplasarea in IP. Programul igi reia executia la aceasta locatie in noul segment de cod. ‘JUMP indirect in afara segmentutui de cod curent Instructiunile de JMP indirect care specifica 0 locatie tintd in afara segmentului de cod curent folosesc o variabild dublu cuvant pentru a specifica pointer-ul. UMP NEWCODE NEWCODE primul din cele doud cuvinte consecutive reprezinta noul pointer. NEWCODE confine noua deplasare pentru IP, iar urmatorul cuvant contine adresa de segment pentru CS. Programul tsi va relua execufia la aceastd locatie in noul segment de cod. Instructiuni de tip CALL Instructiunile CALL activeazd proceduri independente de programul principal prin salvarea pe stiva a adresei instructiunii imediat urmatoare dupa CALL pentru a fi mai tarziu utilizata de instructiunea RET (Return). Un CALL intrasegment plaseazi valoarea curenté a IP-ului pe stiva. Un CALL intersegment plaseaza ambele valori IP si CS pe stiva. Instructiunca RET din procedura apelata foloseste aceasta adresa pentru a transfera inapoi controlul Programului apelant. © instructiune de CALL lung care invocd 0 comutare de task-uri (in mod protejat) va necesita pentru revenire utilizarea instructiuni CALL NEAR_NEWCODE CALL SI CALL PIR_X CALL CASE_TABLE (BX) CALL FAR NEWCODE_FOO CALL NEWCODE Instructiunea RET RET (Return From Procedure) termina executia unei proceduri si transfer controlul, printr-o legaturd inversa pe stivd, programului care a invocat procedura initial Un RET intrasegment restaureazi valoarea IP care a fost salvata pe stivA de precedenta instructiune CALL intrasegment. Un RET intersegment restaureaza ambele valori CS si IP care au fost salvate pe stiva de instructiunea CALL intersegment precedenta. RET restaureazd conform tipului de apel. RET n Aceasta forma de instructiune RET realizeaza aceleasi operatii ca instructiunea simpla cu exceptia faptului od adauga la valoarea iui ‘SP 0 valoare (para) n pentru a elimina anumifi parametrii de pe stivd, Instructiuni de transfer conditionat Instructiunile de transfer conditionat sunt salturi care pot sau mu transfera controlul, functie de starea flag-urilor CPU cand ‘se executa instructiunea, Tinta pentru toate salturile conditionate trebuie sa fie tn segmentul de cod curent si in cadrul -128 ta +127 octeti de la primul octet al urmatoarei instructiuni Mnemonic Conditia testata we E/IE onc ONE /INZ IG/INLE ((SF xor OF) or ZF)=0 JGE/ INE (SF xor 0F)=0 JL/INGE (SP xor OF) =1 ILE /ING ((SF xor OF) or ZF) Instructtunt de buelare Instrucjiunile de buclare sunt salturi condifionate care utilizeazd 0 valoare plasata in CX pentru a spi software. Toate ins! LOOP (Loop While CX Not Zero) este un tansfer conditionat care autodecrementeaza registrul CX inainte de al testa pentru conditia de ramificare, Dac& CX este un non-zero, programul sare la eticheta.{inta 16 specificata in instructiune. Instructiunea LOOP cauzeaza repetarea sccventei de cod pana CX este decrementat la valoarea 0. Cand LOOP gaseste C: transfera controlul instructiunii urmatoare dupa LOOP. LOOP START_LOOP De fiecare daté cand programul intalneste aceasta instructiune il va decrementa pe CX si apoi il va testa. Daca valoarea lui CX este non-zero, atunci programul sare la instructiunea cu eticheta START_LOOP. Daca valoarea din CX este zero, atunci programul continua cu instructiunea care urmeazd dupa LOOP. LOOPE (Loop While Equal) si LOOPZ (Loop While Zero) sunt practic aceleasi instructiuni. Aceste instructiuni auto-decrementeazd registral CX inaintea de a testa CX i ZF pentru conditiile de salt. Dacd CX este non-zero iat 2F=1, programul sare la eticheta tint specificata de instructiune. Dac LOOPE sau LOOPZ gaseste cA CX=0 sau ZF=0, controlul se transfer instructiunii imediat urmatoare instructiunea LOOPE sau LOOPZ. LOOPE START LOOP LOOPZ START_LOOP LOOPNE (Loop While Not Equal) si LOOPNZ (Loop While Not Zero) Aceste instructiuni autodecrementeaza registrul CX inainte de a testa CX si ZF pentru conditia de salt. Daca CX este non-zero si ZF=0, programul sare la eticheta tint specificata in instructiune. Dacé LOOPNE sal: LOOPNZ. giseste ca CX=0 sau ZF=1, controlul va fi transferat instructiunii imediat urmatoare dupa LOOPNE sau LOOPNZ. LOOPNE START LOOP LOOPNZ START LOOP JCKZ (Jump if CX zero) se executé salt la eticheta specificaté in instructiune daca este gasitA valoarea zero in CX. Uneori este de dorit st Proiectém o bucla care se executd de zero ori daca variabila de numarare din CX este initializaté cu zero. Deoarece instructiunile de buclare decrementeaza CX inainte de a-l testa, 0 bucla va fi executata de 65 536 ori daca programul intra in bucla cu o valoare zero in CX. Un programator poate depasi aceasta problema in mod convenabil cu ajutorul lui JCXZ daca permite programului sd sar peste bucla daca CX este zero cénd se executd JCXZ. \JCKZ TARGETLABEL Face ca programul sd sara [a instructiunea cu eticheta TARGETLABEL dacd CX=0 cand va executa instructiunea. Intreruperi generate de soft Instructiunile INT si INTO permit programatorului s specifice un transfer lao rutina de intrerupere din cadrul programului. INT activeaza rutina de intrerupere care corespunde numérului codificat in instructiune. Intreruperea numarul 3 este rezervat pentru intreruperile interne generate software. Totusi, instructiunea INT poate specifica orice tip de intrerupere pentru a permite multiple tipuri de intreruperi interne sau pentru a testa o rutina de servici. Rutina de intrerupere se termina cu o instructiune IRET care returneaza controlul instructiunii care urmeaz& INT. INT 3 Transferd controlul rutinei de intrerupere specificata de o intrerupere de tipul 3. INT 0 Transferd controlul rutinei intrerupere specificata de intreruperea de tipul 0 care este rezervata impartiri eronate. INTO (interrupt on Overflow) invoca o intrerupere de tipul 4 daca OF este setat cand se executd instructiunea INTO. Intreruperea tip 4 este rezervata acestui scop. Instructiuni de manipulare siruri si prefixele de repetare Instructiunile gir (mumite si primitive) opereazd pe siruri de clemente pentru a le muta, compara $i parcurge pe octet sau cuvant, Primitivele folosesc flag-ul de directie DF pentru a specifica procesarea sirurilor de la stdnga la dreapta sau de la dreapta la stanga gi folosese un contor in CX pentru a limita procesarea. Aceste instructitini utilizeaz’ perechea de registre DS:Si pentru a puncta spre surs4 si perechea de registre ES:DI pentru a puncta spre destinatie, Instructiuni de mutare a siruritor REP (Repeat While CX Not Zero) specifica o operatie repetata de o Primitiva ir. Prefixul REP cauzeazd o repetare automata a. primitive! gr asociata pana cand CX=0. Aceast forma de iterare permite CPU sa procesens siruri mult mai repede decat ar fi posibil cu o bucla soft obignui Cand prefixul REP insojeste o instructiune MOVS el va opera ca un transfer de bloc de la memorie la memorie, Pentru a pregati aceasta opera Programul trebuie sa inifializeze CX gi registrele perechi DS:S! si ESD ox specifica’ numarul de octefi sau cuvinte aflate in bloc. Pack DF=O, programul trebuie s& seteze DS:SI ca si puncteze spre primul element din sirul sursa i ES:D! spre adresa de destinatie primului element. Dacd DF=1, programul trebuie s& puncteze prin aceste doud registre perechi spre ultimul element ale girurilor sursa si destinatie REP MOVSW Procesorul verificd daca valoarea din CX este zero, Dacd aceasta valoare nu este zero, procesorul mutd un cuvant din locatia punctata de DS:SI ta locafia punctatd de ES:DI $i incrementeazé SI si Di cu doi (daca DF=0). Apoi, procesorul decrementeaza CX cu unu $i se reintoarce la inceputul ciclului pentru a-l verifica pe CX din nou. Dupa ce CX este decrementat ta zero, procesorul executd instructiunea care urmeaza. MOVS (Move String) muta sirul de caractere punctat prin combinatie DS:SI la locatia punctata de combinatia ES si DI. Aceasta este singura operatie de transfer de tip memorie-memorie suportatd de setul de instructiuni al arhitecturii de baza. MOVSB opereaza pe elemente de tip octet. MOVSB ‘Muta confinutul octetului de memorie punctat de DS:SI la locatia punetata de BS:DI Alte operatii cu sirurt MPS (Compare String) scade elementul din sirul destinatie ES:DI din elementul girului surs& DS:SI si actualizeaz’ flag-urile AF, SF, PF, CF si OF. Daca clementele din cele dou siruri sunt egale, ZF=1 altfel, ZF=0. Daca DF=0, procesorul incrementeaza pointerii de memorie SI $i DI pentru cele doua siruri, cMPsB Compararé elementele sirurilor sursd gi destinafie pe fiecare cu Jiecare $i returneaza rezultatul comparatiet in ZF. SCAS (Scan String) scade destinatia punctata de ES:DI din AX sau AL si actualizeaza flag-urile AF, SF, ZF, PF, CF $i OF. Daca valorile sunt egale, ZF=1 altfel, ZF=0. Daca DF=0, procesorul incrementeazd DI pentru gir. Registrul de segment folosit pentru sursa poate fi schimbat. scasw Compara valoarea lui AX cu cuvantul din girul destinatie. REPE/REPZ (Repeat While CX Equal/Zero) si REPNE/REPNZ (Repeat While CX Not Equal/ Not Zero) sunt prefixele care sunt folosite exclusiv cu SCAS si MPS, Diferenfa intre aceste doua tipuri de prefixe octet este ca REPE/REPZ se termina cand ZF=0, iar REPNE/REPNZ se termina cand ZP=1. ZF nu este nevoie s& fie initializat inaintea executérii unei instructiuni sir repatate. Starea reaultata a lui ZF poate limita desfagurarea unei operatii repetate, acelagi lucru producandu-se cand in CX avem valoarea zero. REPE SCASB Produce scanarea de cdtre procesor a sirilui punctat de ES:DI and va intdini un octet care nu se potriveste cu vaioarea din AL ‘sau pand CX este decrementat la zero. LODS (Load String) incarca elementul din sirul sursa dat de DS:SI in AX pentru siruri pe cuvant sau in AL pentru siruri pe octet. Lopsw Incareé AX cu valoarea punctatd de DS:SI. Instructiuni de manipulare adrese Setul de instructiuni de manevrare a adresei ne furnizeaza o cale de a Tealiza calcularea unei adrese sau de a ne muta intr-un nou segment de date sau de extra date. LEA (Load Effective Address) transfera deplasarea operandului sursa in operandul destinajie. Operandul sursa trebuie sai fie un operand memorie si operandul destinatie trebuie sa fie un registru general pe 16 biti LEA mu afecteaza nici un flag. Aceasti instructiune este folosita pentra a initializa registrele inainte de a executa o primitiva sir. LEA BX,EBCDIC TABLE Procesorul plaseazd adresa de inceput a tablei etichetate EBCDIC_TABLE tn BX, LDS (Load Pointer Using DS) transfera un pointer variabila de 32 biti din operandul sursé in DS gi registrul destinatie, Operandul sursa trebuie s4 fie un operand memorie si operandul destinatie trebuie sa fic un registru general DS primeste cuvantul superior al pointer-ului (adresa segment). Registral destinatie va primi cuvantul inferior care puncteaza spre o locatie specifica in cadrul segmentului, LDS SI,STRING_X Incarcd DS cu cuvantul care identificd segmentul indicat de STRING.X $i incared deplasarea tui STRING_X in SI. Specificand SI ea operand destinatie, este un mod convenabil de a pregati o operate sir pentru un sir sursd care nu se gaseste in segmentul de late curent, LES (Load Pointer Using 8) opereaza in mod identic cu LDS cu exceptia ca ES va fi incarcat cu adresa de segment si nu DS. mi LES DI,DESTINATION_X Incarod ES cu cuvantul de identificare segment din DESTINATION X si treared deplasarea din DESTINATION.X in DI. Aceasia instructiune furnizeaza o cale convenabila de a selecta 0 destinajie pentru o operatie sir daca locatia doritdé nu este in extra segmentul curent. Instructiuni de control pentru flag-uri Aceste instructiuni furnizeazd o metoda de a schimba bitii de stare din registrul FLAGS. Carry Flag Instructiunile pentru carry flag sunt folositoare in conexiune cu instructiunile de rotire RCL si RCR. Ele pot inifializa carry flag, CF, la o valoare precunoscut a unei rotafii care-l va muta in operand. STC (Set Carry Flag) seteaza carry flag pe 1 CLC (Clear Carry Flag) reseteaza carry flag la 0. CMC (Complement Carry Flag) inverseaza starea curenti a lui carry flag, Direction Flag (DF) DP controleazd directia procesarii sirurilor de la sténga la dreapta sau de Ja dreapta la stanga. Daci DF=0, procesorul in mod automat incrementeaz& pointerii de memorie ai girului SI si DI dupa fiecare executie a primitivei sir. Daca DF=1, procesorul decrementeaz& aceste valori ale pointerilor. Starea initial a lui DF=0. CLD (Clear Direction Flag) anuleazA DF producand auto-incrementarea lui SI si DI. STD (Set Direction Flag) seteaza DF producand auto-decrementarea lui SI si DI. Instructiuni de transfer a flag-urilor Desi exista instructiuni specifice pentru alterarea lui CF si DF, nu exist ins& o metoda directa de alterare a celorlalte flag-uri. Instructiunile de transfer permit unui program sa altereze gi bitii celorialte flag-uri prin instructiunile de manipulare a bifilor dupa ce vor transfera flag-urile pe stiva sau in registral AH. LAHF (Load AH from Flags) copiaz& bitii SF, ZF, AP, PF si CF in AH, bitii 7, 6, 4, 2 $i 0. Continutul bitilor care raman (5, 3 $i 1) este nedefinit. SF[zF[ [AF [PF] [cr SAHF (Store AH into Flags) transfer bitii 7, 6, 4, 2 si din AH in SP, ZF, AP, PF si CF din registrul FLAGS. PUSHF (Push Flags) decrementeaz SP cu doi i apoi transfera toate flag- urile in cuvantul din varful stivei punctat de SP. Flag-urile raman neafectate. Aceasta instructiune da posibilitatea unei subrutine sa salveze registrul FLAGS pe stiva pentru o utilizare ulterioara. POPF (Pop Fiags) transfera bitii specifici din cuvantul din varful stivei registrul FLAGS. Procesorul va incrementa apoi SP cu doi. Instructiuni de intrareiesire Aceste instructiuni permit accesul programului la portii 1/0 pentru a transfera datele de la gi spre un dispozitiv periferic. IN (input from port) transfera un octet sau un cuvant de la un port de intrare la AL sau AX. Daca programul specific AL in cadrul instructiunii IN, atunci procesorul va transfera 8 biti de Ja portul selectat la AL. Daca programul specifica AX in cadrul instructiunii IN, procesorul va transfera 16 biti de la port Ia AX. Programul poate specifica numarul portului in doud moduri, Folosind 0 Constanta octet imediata pe 8 biti, programul poate accesa 256 porti pe 8 biti humerotati de Ia zero la 255 sau 128 de porti pe 16 biti numerotati 0, 2, 4, 252, 254. Polosind valoarea continuta in DX, programul poate accesa porti pe 8 biti numerotati de la 0 la 65535 sau porti pe 16 biti numerotati pe numerele pare. IN AL,BYTE_PORT_NUMBER ‘Transferd 8 biti th AL de la portul identificat prin constanta imediata BYTE_PORT_NUMBER. OUT (Output to Port) transfera un octet sau un cuvant, din AL sau AX, la un port de iesire. Programul poate specifica numarul portului folosind aceleagi metode ca la instructiunea IN. OUT DX,AX Transferd 16 biti din AX la portul identificat de numarul pe 16 biti conginut in DX, INS $1 OUTS (Input String si Output String) produc operatii de intrare sau iegire a unui bloc de date folosind un prefix de repetare, 2

S-ar putea să vă placă și