Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Sumar al limbajului de asamblare
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 

 

//////////////////////////////////// j6k19kt
Modurile de adresare ale operanzilor
////////////////////////////////////

Vom discuta acum citeva lucruri legate de adresarea operanzilor.
Exista mai multe moduri de a adresa datele (operanzii instructiunilor).
Operanzii pot fi continuti in registri, in memorie, in instructiune sau in porturile de intrare/iesire.
Primele doua moduri de adresare la care vom face referinta sunt adresarea imediata si adresarea la registri. Instructiunile care folosesc aceste tipuri de adresare sunt compacte si rapide, operatiile se executa numai in unitatea centrala, nemaifiind necesara aducerea datelor din memorie.

* Adresarea imediata *
AAAAAAAAAAAAAAAAAAAAAAAAAAA

Operanzii imediati sint date constante continute in instructiune, de lungime
8 sau 16 biti. Operanzii imediati sunt cei care pot fi evaluati la o constanta la momentul asamblarii. Ei pot servi doar ca operanzi sursa
(operanzii cei mai din dreapta in cadrul unei instructiuni). De exemplu:

mov ax, 5 mov ax, 41h mov dx, OFFSET HelloMessage mov ax, my_data ; unde my_data este un segment anterior definit

In primele doua exemple este evident ca, operanzii fiind constante, se foloseste adresare imediata. In cel de-al treilea exemplu, operandul imediat este OFFSET HelloMessage deoarece acesta reprezinta deplasamentul variabilei HelloMessage fata de inceputul segmentului de date in care rezida, fiind astfel o valoare (constanta) cunoscuta de asamblor in momentul asamblarii. In ultimul exemplu, operandul imediat este my_data, care identifica adresa de inceput a unui segment de date.

* Adresarea la registri *
AAAAAAAAAAAAAAAAAAAAAAAAAAA

Acest tip de adresare se refera la operanzi in registri generali; ei pot fi operanzi sursa, destinatie ori amindoua. Practic, operandul unei instructiuni este continutul unui registru specificat in instructiunea respectiva.




Exemple: mov ax, 0b800h ;(operand destinatie adica ax) mov ds, ax ;(ambii operanzi) inc bx ;(bx) cmp ah,'A' ;(operandul destinatie adica ah)

Observatie:
AAAAAAAAAAAAAA

Modurile de adresare la care ne vom referi de aici incolo sunt pentru adresarea memoriei; este vorba de situatii in care, pentru accesul operanzilor aflati in memorie este nevoie de un transfer prin magistrala.
Pentru a calcula adresa fizica a memoriei la care rezida un operand, pe linga adresa segmentului, trebuie calculat deplasamentul, deci distanta in octeti de la inceputul segmentului pina in locul in care se afla operandul.
Acest offset se numeste adresa efectiva a operandului.

* Adresare indirecta prin registri *
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Adresa-efectiva a operandului (adica deplasamentul fata de inceputul zonei segment in care se gaseste acesta ) poate fi luata din unul din registrii de baza sau de index prezenti in instructiune ( bx, bp, si sau di).

Exemplu:

mov ah,ds:abxi

Operandul sursa este adresat indirect prin registrul bx; continutul acestui registru va contine deplasamentul zonei de memorie de un octet fata de inceputul segmentului.

Observatie:
Nu este obligatoriu sa specificam registrul segment; implicit, daca operandul este adresat indirect prin BX, segmentul implicit este cel care are adresa de inceput in DS si la fel pentru SI si DI iar pentru BP - in SS. Asadar, pentru instructiunea de mai sus, daca suntem asigurati ca DS contine segmentul de date care ne intereseaza, putem scrie direursa octet ori
FFFFh pentru sursa cuvint) sau daca a fost incercata o impartire cu 0, este generata o intrerupere de tip 0 (impartire la 0), restul si citul avind valori nedefinite.

Instructiunea IDIV: Impartire intreaga cu semn

Folosire:
IDIV sursa

Impartire cu semn a acumulatorului cu sursa. Daca operandul sursa este un octet, citul este plasat in AL, iar restul in AH. Daca operandul sursa este un cuvint, citul este in AX, iar restul in DX. Domeniul valorilor citului este cuprins intre -127...+127 pentru sursa octet, si -32767...+32767 pentru sursa cuvint.In cazul in care citul este pozitiv si depaseste valoarea maxima, ori este negativ si depaseste valoarea minima, se generaza o intrerupere de tip 0, iar restul si citul au valori nedefinite.

Instructiunea CBW: Convert Byte to Word

Folosire: CBW

Converteste octetul din AL la valoare pe un cuvint in AX cu extensie de semn.

Instructiunea CWD: Convert Word to Double-word
Folosire: CWD

Extinde semnul cuvintului din AX formind un dublu cuvint cu partea cea mai semnificativa in DX iar cea mai putin semnificativa in AX.

Instructiuni de transfer

Instructiunea MOV

Folosire: MOV destinatie,sursa

Transfera un octet sau un cuvint de memorie din operandul sursa in operandul destinatie.

Exemple: mov ds, ax; continutul registrului ax va fi transferat in registrul ds mov ah, 9h ; ah va contine octetul cu valoarea 9h

Instructiunea PUSH: Pune un cuvint in stiva

Folosire:
PUSH sursa

Decrementeaza continutul registrului SP cu doi si apoi transfera un cuvint din operandul sursa in noul virf al stivei, referit de SP
(deci care are adresa SS:SP). Aceasta instructiune este folosita deseori pentru incarcarea parametrilor in stiva, inainte de apelul unei proceduri.

Instructiunea POP: Extrage un cuvint din stiva.

Folosire:
POP destinatie

Transfera cuvintul din top-ul stivei (SS:SP) la locatia referita de
"destinatie", apoi incrementeaza SP cu 2 astfel incit sa pointeze la noul virf al stivei.

EqFqGqHqIqÿÿKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZqaq\qiq^q_q`qaqÿÿ ÿÿ fqgqhqiqmq nqoqvq ir yqzqAq|qSqIqq€qq‚qƒq„q…q†q‡qÿÿ‰qŠq‹qŒqqŽqqq‘q’qÿÿ ÿÿ  qiq¢q£q¤q¥q¦q§qÿÿ ÿÿIqAqAqAqÇqÈqÉqÊqËqIqIqIqÿÿÐqÑqÒqÓqÔqÕqÖq×qØqÙqÚqÛqÜqÝqÞqßqaqaqaqaqaqaqaqçqèqéqêqëqiqiqÿÿiqðqñqÿÿ tori modificati: AF OF PF SF ZF

Scade (operatie fara semn) un 1 din "destinatie".

Instructiunea NEG: Complement fata de 2

Folosire:
NEG destinatie
Indicatori modificati: AF CF OF PF SF ZF

Scade "destinatie" din 0 si salveaza complementul fata de 2 al lui
"destinatie" in "destinatie" (practic, schimba semnul numarului). Daca numarul este -128 sau -32768, atunci el nu este schimbat, ci este setat pe 1 indicatorul OF.

Instructiunea CMP: CoMPare

Folosire:
CMP destinatie,sursa
Indicatori modificati: AF CF OF PF SF ZF

Scade "sursa" din "destinatie" si actualizeaza indicatorii dar nu salveaza rezultatul. De obicei, in urma acestei instructiuni sunt verificate valorile indicatorilor pentru conditii.

Instructiunea MUL: Inmultire fara semn

Folosire:
MUL sursa
Indicatori modificati: CF OF

Inmulteste continutul registrului acumulator cu "sursa". Daca "sursa" este valoare pe un byte, atunci este folosit AL, iar rezultatul este plasat in AX. Daca "sursa" este valoare pe un cuvint, atunci sursa este inmultita cu AX, iar rezultatul este plasat in DX si AX. Indicatorii CF si OF sunt pozitionati daca partea cea mai semnificativa a rezultatului este diferita de 0 (AH pentru operand sursa pe un octet, DX pentru operand sursa cuvint).

Instructiunea IMUL: Inmultire cu semn

Folosire:
IMUL sursa
IMUL sursa,immed (numai de la 80286 in sus)
IMUL destinatie,sursa,immed8 (numai de la 80286 in sus)
Indicatori modificati: CF OF

Realizeaza inmultirea cu semn a registrului acumulator cu "sursa".
Daca "sursa" este valoare pe un byte, atunci este folosit AL, iar rezultatul este plasat in AX. Daca "sursa" este valoare pe un cuvint, atunci sursa este inmultita cu AX, iar rezultatul este plasat in DX si AX. Indicatorii CF si OF sunt pozitionati daca partea cea mai semnificativa a rezultatului este diferita de 0 (AH pentru operand sursa pe un octet, DX pentru operand sursa cuvint). Din modurile in care este folosita instructiunea, se poate observa ca ursa octet ori
FFFFh pentru sursa cuvint) sau daca a fost incercata o impartire cu 0, este generata o intrerupere de tip 0 (impartire la 0), restul si citul avind valori nedefinite.

Instructiunea IDIV: Impartire intreaga cu semn

Folosire:
IDIV sursa

Impartire cu semn a acumulatorului cu sursa. Daca operandul sursa este un octet, citul este plasat in AL, iar restul in AH. Daca operandul sursa este un cuvint, citul este in AX, iar restul in DX. Domeniul valorilor citului este cuprins intre -127...+127 pentru sursa octet, si -32767...+32767 pentru sursa cuvint.In cazul in care citul este pozitiv si depaseste valoarea maxima, ori este negativ si depaseste valoarea minima, se generaza o intrerupere de tip 0, iar restul si citul au valori nedefinite.

Instructiunea CBW: Convert Byte to Word

Folosire: CBW

Converteste octetul din AL la valoare pe un cuvint in AX cu extensie de semn.

Instructiunea CWD: Convert Word to Double-word
Folosire: CWD

Extinde semnul cuvintului din AX formind un dublu cuvint cu partea cea mai semnificativa in DX iar cea mai putin semnificativa in AX.

Instructiuni de transfer

Instructiunea MOV

Folosire: MOV destinatie,sursa

Transfera un octet sau un cuvint de memorie din operandul sursa in operandul destinatie.

Exemple: mov ds, ax; continutul registrului ax va fi transferat in registrul ds mov ah, 9h ; ah va contine octetul cu valoarea 9h

Instructiunea PUSH: Pune un cuvint in stiva

Folosire:
PUSH sursa

Decrementeaza continutul registrului SP cu doi si apoi transfera un cuvint din operandul sursa in noul virf al stivei, referit de SP
(deci care are adresa SS:SP). Aceasta instructiune este folosita deseori pentru incarcarea parametrilor in stiva, inainte de apelul unei proceduri.

Instructiunea POP: Extrage un cuvint din stiva.

Folosire:
POP destinatie

Transfera cuvintul din top-ul stivei (SS:SP) la locatia referita de
"destinatie", apoi incrementeaza SP cu 2 astfel incit sa pointeze la noul virf al stivei.

//////////////////////
Set de instructiuni
//////////////////////

Instructiuni aritmetice

Instructiunile aritmetice efectueaza operatii aritmetice de baza asupra operanzilor - numere pe 8 sau 16 biti, cu semn sau fara semn.
Instructiunile aritmetice afecteaza indicatorii de stare dupa cum urmeaza:

1. Seteaza CF daca rezultatul operatiei fara semn este in afara domeniului,
2. Seteaza OF daca rezultatul operatiei cu semn este in afara domeniului,
3. Seteaza ZF daca rezultatul operatiei este 0,
4. Seteaza SF daca cel mai semnificativ bit al rezultatului operatiei este 1, ceea ce indica rezultat negativ,
5. Seteaza PF daca rezultatul operatiei contine un numar par de biti 1.

Instructiunea ADD: Adunare aritmetica

Folosire: ADD destinatie, sursa
Indicatori modificati: AF CF OF PF SF ZF

Aduna "sursa" la "destinatie" si inlocuieste continutul original al operandului "destinatie" cu rezultatul adunarii. Amindoi operanzii sunt numere binare, pe 8 sau 16 biti.

Instructiunea ADC: Aduna cu "Carry"

Folosire: ADC destinatie,sursa

Indicatori modificati: AF CF OF SF PF ZF

Aduna "sursa" la "destinatie" si inlocuieste continutul original al operandului "destinatie" cu rezultatul adunarii. Daca dupa adunare CF este 1, se aduna un 1 la destinatie.

Instructiunea INC: Incrementare

Folosire: INC destinatie
Indicatori modificati: AF OF PF SF ZF

Aduna un 1 la "destinatie", considerat numar binar fara semn.

Instructiunea SUB: Scadere (Subtract)

Folosire: SUB destinatie, sursa
Indicatori modificati: AF CF OF PF SF ZF

Sursa este scazuta din destinatie, iar rezultatul este pastrat in destinatie.

Instructiunea SBB: SuBtract with Borrow

Folosire: SBB destinatie, sursa
Indicatori modificati: AF CF OF PF SF ZF

Scade sursa din destinatie; daca CF este setat pe 1, scade un 1 si plaseaza rezultatul in "destinatie".

Instructiunea DEC: Decrement

Folosire: DEC destinatie
Indicatori modificati: AF OF PF SF ZF

Scade (operatie fara semn) un 1 din "destinatie".

Instructiunea NEG: Complement fata de 2

Folosire: NEG destinatie
Indicatori modificati: AF CF OF PF SF ZF

Scade "destinatie" din 0 si salveaza complementul fata de 2 al lui
"destinatie" in "destinatie" (practic, schimba semnul numarului). Daca numarul este -128 sau -32768, atunci el nu este schimbat, ci este setat pe 1 indicatorul OF.

Instructiunea CMP: CoMPare

Folosire: CMP destinatie,sursa
Indicatori modificati: AF CF OF PF SF ZF

Scade "sursa" din "destinatie" si actualizeaza indicatorii dar nu salveaza rezultatul. De obicei, in urma acestei instructiuni sunt verificate valorile indicatorilor pentru conditii.

Instructiunea MUL: Inmultire fara semn

Folosire: MUL sursa
Indicatori modificati: CF OF

Inmulteste continutul registrului acumulator cu "sursa". Daca "sursa" este valoare pe un byte, atunci este folosit AL, iar rezultatul este plasat in AX. Daca "sursa" este valoare pe un cuvint, atunci sursa este inmultita cu AX, iar rezultatul este plasat in DX si AX. Indicatorii CF si OF sunt pozitionati daca partea cea mai semnificativa a rezultatului este diferita de 0 (AH pentru operand sursa pe un octet, DX pentru operand sursa cuvint).

Instructiunea IMUL: Inmultire cu semn

Folosire: IMUL sursa
IMUL sursa,immed (numai de la 80286 in sus)
IMUL destinatie,sursa,immed8 (numai de la 80286 in sus)
Indicatori modificati: CF OF

Realizeaza inmultirea cu semn a registrului acumulator cu "sursa".
Daca "sursa" este valoare pe un byte, atunci este folosit AL, iar rezultatul este plasat in AX. Daca "sursa" este valoare pe un cuvint, atunci sursa este inmultita cu AX, iar rezultatul este plasat in DX si AX. Indicatorii CF si OF sunt pozitionati daca partea cea mai semnificativa a rezultatului este diferita de 0 (AH pentru operand sursa pe un octet, DX pentru operand sursa cuvint). Din modurile in care este folosita instructiunea, se poate observa ca se pot specifica registri sursa si destinatie, precum si un eventual al treilea factor al inmultirii (operand imediat).

Instructiunea DIV: Divide

Folosire: DIV sursa

Impartire fara semn a acumulatorului si a extensiei sale cu sursa.
Daca operandul sursa este un octet, citul este plasat in AL, iar restul in AH.
Daca operandul sursa este un cuvint (atentie, in acest caz se considera ca deimpartit AX cu extensia DX, deci numar pe 32 de biti), citul este in AX, iar restul in DX.
Observatii:
In cazul in care operandul sursa este un cuvint, daca doriti sa impartiti doar AX, asigurati-va ca DX este 0; altfel, conform celor mai sus descrise, riscati rezultat imprevizibil.
Daca restul depaseste capacitatea registrului destinatie (FFh pentru sursa octet ori FFFFh pentru sursa cuvint) sau daca a fost incercata o impartire cu 0, este generata o intrerupere de tip 0 (impartire la 0), restul si citul avind valori nedefinite.

Instructiunea IDIV: Impartire intreaga cu semn

Folosire: IDIV sursa

Impartire cu semn a acumulatorului cu sursa. Daca operandul sursa este un octet, citul este plasat in AL, iar restul in AH. Daca operandul sursa este un cuvint, citul este in AX, iar restul in DX. Domeniul valorilor citului este cuprins intre -127...+127 pentru sursa octet, si -32767...+32767 pentru sursa cuvint.In cazul in care citul este pozitiv si depaseste valoarea maxima, ori este negativ si depaseste valoarea minima, se generaza o intrerupere de tip 0, iar restul si citul au valori nedefinite.

Instructiunea CBW: Convert Byte to Word

Folosire: CBW

Converteste octetul din AL la valoare pe un cuvint in AX cu extensie de semn.

Instructiunea CWD: Convert Word to Double-word

Folosire: CWD

Extinde semnul cuvintului din AX formind un dublu cuvint cu partea cea mai semnificativa in DX iar cea mai putin semnificativa in AX.

Instructiuni de transfer

Instructiunea MOV

Folosire: MOV destinatie,sursa

Transfera un octet sau un cuvint de memorie din operandul sursa in operandul destinatie.

Exemple: mov ds, ax; continutul registrului ax va fi transferat in registrul ds mov ah, 9h ; ah va contine octetul cu valoarea 9h

Instructiunea PUSH: Pune un cuvint in stiva

Folosire: PUSH sursa

Decrementeaza continutul registrului SP cu doi si apoi transfera un cuvint din operandul sursa in noul virf al stivei, referit de SP
(deci care are adresa SS:SP). Aceasta instructiune este folosita deseori pentru incarcarea parametrilor in stiva, inainte de apelul unei proceduri.

Instructiunea POP: Extrage un cuvint din stiva.

Folosire: POP destinatie

Transfera cuvintul din top-ul stivei (SS:SP) la locatia referita de
"destinatie", apoi incrementeaza SP cu 2 astfel incit sa pointeze la noul virf al stivei.

Instructiunea XCHG: Exchange (schimba)

Folosire: XCHG destinatie, sursa

Schimba continutul intre "destinatie" si "sursa". Operanzii pot fi registri sau memorie; registrii segment nu pot fi oeranzi ai acestei insructiuni.

Instructiunea IN: Primeste octet sau cuvint de la un port specificat.

Folosire: IN acumulator, port

Este citit un octet sau un cuvint de la "port" si este plasat in AL, sau AX respectiv. Daca numarul portului este in domeniul 0-255, operandul
"port" poate fi specificat ca valoare imediata. Altfel, numarul de port trebuie specificat in DX.

Instructiunea OUT: Faciliteaza iesirea datelor la porturi

Folosire: OUT port, acumulator

Transfera un octet din AL, ori un cuvint din AX la portul specificat.
Daca numarul portului este in domeniul 0-255, operandul "port" poate fi specificat ca valoare imediata. Altfel, numarul de port trebuie specificat in
DX.

Instructiunea LEA: Incarca adresa efectiva (Load Effective Address)

Folosire: LEA destinatie, sursa

Transfera deplasamentul din adresa operandului "sursa" in operandul
"destinatie", care trebuie sa fie un registru general.

Instructiunea LDS: Incarca pointer folosind DS

Folosire: LDS destinatie, sursa

Incarca o adresa logica de memorie (pe 32 de biti) din memorie
(operandul "sursa" se presupune a fi o variabila in memorie) in "destinatie", care trebuie sa fie registru general, si in registrul DS. Deplasamentul este incarcat in registrul general specificat in "destinatie", iar segmentul este incarcat in DS. Operandul "sursa" indica locatia in memorie la care se afla dublu cuvintul ce urmeaza a fi incarcat. Pntru a folosi aceasta instructiune cuvintul de la adresa de memorie mai mica trebuie sa contina deplasamentul, iar cel de la adresa mai mare trebuie sa contina adresa de segment.

Instructiunea LES: Incarca pointer folosind ES

Folosire: LES destinatie, sursa

Incarca o adresa logica de memorie (pe 32 de biti) din memorie
(operandul "sursa" se presupune a fi o variabila in memorie) in "destinatie", care trebuie sa fie registru general, si in registrul ES. Deplasamentul este incarcat in registrul general specificat in "destinatie", iar segmentul este incarcat in ES. Operandul "sursa" indica locatia in memorie la care se afla dublu cuvintul ce urmeaza a fi incarcat. Pntru a folosi aceasta instructiune cuvintul de la adresa de memorie mai mica trebuie sa contina deplasamentul, iar cel de la adresa mai mare trebuie sa contina adresa de segment.

Instructiunea LAHF: Incarca registrul AH din "flag-uri"

Folosire: LAHF

Copie indicatorii SF, ZF, AF, PF si CF in bitii 7, 6, 4, 2, 0 respectiv, ai registrului AH. Continutul bitilor 5, 3 si 1 este nedefinit.
Indicatorii nu sunt afectati in urma acestei instructiuni.

Instructiunea SAHF: Restaureaza indicatorii din AH

Folosire: SAHF

Transfera bitii 7, 6, 4, 2 si 0 ai registrului AH in indicatorii SF,

ZF, AF, PF si CF respectiv.

Instructiunea PUSHF:

Folosire: PUSHF

Tansfera registrul indicatorilor de stare si control in stiva.

Instructiunea POPF

Folosire: POPF

Transfera cuvintul din top-ul stivei in registrul indicatorilor de stare si control, dupa care incrementeaza SP cu 2.

Instructiuni logice

Instructiunea NOT: NOT logic

Folosire: NOT destinatie

Realizeaza complementul operandului "destinatie" in baza 2 (bitii 1 devin 0, iar bitii 0 devin 1). Rezultatul este in "destinatie".

Instructiunea AND: SI logic

Folosire: AND destinatie, sursa
Indicatori modificati: CF OF PF SF ZF (AF nedefinit)

Realizeaza operatia "si logic" (daca bitii de pe aceeasi pozitie in cei doi operanzi sunt setati, atunci bitul corespunzator in rezultat va fi setat) intre cei doi operanzi, rezultatul fiind in "destinatie".

Instructiunea OR: SAU logic

Folosire: OR destinatie,sursa
Indicatori modificati: CF OF PF SF ZF (AF nedefinit)

Realizeaza operatia "sau logic" a celor doi operanzi (orice bit setat pe 1 in unul din operanzi va fi setat pe 1 in rezultat) si returneaza rezultatul in "destinatie".

Instructiunea XOR: SAU exclusiv

Folosire: XOR destinatie,sursa
Indicatori modificati: CF OF PF SF ZF (AF nedefinit)

Realizeaza operatia "sau exclusiv" intre cei doi operanzi (bitii setati in rezultat sunt cei care corespund pozitiilor in operanzi ce contin valori diferite ) si returneaza rezultatul in "destinatie".

Instructiunea TEST: Testeaza "sablon"

Folosire: TEST destinatie,sursa
Indicatori modificati: CF OF PF SF ZF (AF nedefinit)

Realizeaza "si logic" intre cei doi operanzi, actualizeaza indicatorii, dar nu returneaza rezultatul.

Instructiuni de deplasare

Instructiunile SHL/SAL: Translare (Shift) la stinga

Folosire: SAL destinatie, nr
SHL destinatie, nr
Indicatori modificati: CF OF PF SF ZF (AF nedefinit)

Transleaza operandul "destinatie" la stinga cu numar de biti dat de
"nr", zerorizind pozitiile la dreapta; indicatorul CF tine ultimul bit translat. Practic, o shiftare cu o pozitie la stinga este echivalenta cu o inmultire cu 2 a operandului destinatie.

Instructiunea SHR: Shift la dreapta

Folosire: SHR destinatie, nr
Indicatori modificati: CF OF PF SF ZF (AF nedefinit)

Shifteaza operandul destinatie la dreapta cu "nr" pozitii, zerorizind pozitiile shiftate. Carry Flag tine ultimul bit shiftat. Cu shift la dreapta putem realiza foarte usor o impartire la putere a lui 2 a operandului destinatie.

Instructiunea SAR: Shift Aritmetic la dreapta

Folosire: SAR destinatie, nr
Indicatori modificati: CF OF PF SF ZF (AF nedefinit)

Shifteaza destinatia la dreapta cu un numar de pozitii dat de "nr".
Diferenta fata de SHR revine din faptul ca lasa neschimbat bitul cel mai semnificativ (bitul semn). Carry Flag contine ultimul bit shiftat.

Instructiuni de rotire

Instructiunea ROL: Roteste la stinga

Folosire: ROL destinatie, nr
Indicatori modificati: CF OF

Roteste bitii operandului destinatie la stinga de "nr" ori, astfel incit bitii scosi la stinga sunt reintrodusi in pozitiile din dreapta. CF va tine ultimul bit shiftat la stinga.

Instructiunea ROR: Roteste la dreapta

Folosire: ROR destinatie, nr
Indicatori modificati: CF OF

Similar cu ROL, dar pentru pozitiile din dreapta.

Instructiunea RCL: Rotire la stinga prin CF

Folosire: RCL destinatie,nr
Indicatori modificati: CF OF

Similar cu ROL, dar fiecare bit shiftat la stinga este pastrat in CF, si fiecare pozitie libera la dreapta ia valoarea curenta a lui CF.

Instructiunea RCR: Rotire la dreapta prin CF

Folosire: RCR destinatie,nr
Indicatori modificati: CF OF

Similar cu RCL, dar pentru pozitiile din dreapta.

Instructiuni pe siruri

Un sir este o seventa de octeti in memorie. Operatiile pe siruri
(realizate de instructiunile mai jos descrise) vizeaza lucrul pe asemenea secvente de octeti, de exemplu mutarea unui sir dintr-o zona a memoriei in alta, compararea a doua siruri, etc. Instructiunile pe siruri pot fi precedate de prefixe de repetare, peritind prelucrarea rapida a sirurilor lungi. O instructiune pe siruri poate avea operand sursa, operand destinatie sau ambii.
Implicit, sirul sursa se considera a fi in segmentul de date curent (adresat de DS) iar sirul destinatie - in extrasegmentul curent de date (adresat de ES).
Registrul SI (registrul sursa index) este folosit pentru a contine deplasamentul cu care adresam elementul curent al sirului sursa, iar DI (registru destinatie index) contine deplasamentul elementului curent al sirului destinatie. Evident, inainte de executia unei instructinuni pe siruri, trebuie cunoscut tipul de date din siruri (octeti sau cuvinte). Registrii index trebuiesc initializati inainte de executie. In timpul executiei, functie de setarea indicatorului de directie DF, registrii de index se autoincrementeaza (DF=0) sau se autodecrementeaza (DF=1) cu 1 daca datele sunt octeti, sau cu 2 daca datele sunt cuvinte.
Instructiunile pe siruri pot fi precedate de prefixe de repetare
(REP, REPE, etc.). In acest caz, numarul de repetari ale unei instructiuni este dat de continutul registrului CX. Dupa fiecare repetare a instructiunii,
CX este decrementat, iar la CX=0 se preda controlul instructiunii urmatoare.

Instructiunile REP/REPE/REPZ/REPNE/REPNZ: Repeta o operatie pe siruri

Aceste instructiuni sunt folosite ca prefixe in operatii cu siruri.

Instructiunea REP este folosita impreuna cu instructiunile MOVS si STOS.
Repeta executia unei instructiuni pe siruri cit timp CX este diferit de 0.
Dupa fiecare instructiune, CX este decrementat si se testeaza indicatorul ZF.
Instructiunile REPE si REPZ sunt identice; ele se folosesc cu instructiunile CMPS si SCAS; repeta executia instructiunii pe siruri atita timp cit CX este diferit de 0 si indicatorul ZF este 1. CX este decrementat si ZF este testat dupa fiecare executie a instructiunii pe siruri.
Instructiunile REPNE si REPNZ sunt identice; repeta executia unei instructiuni pe siruri atita timp cit CX este diferit de 0 si ZF este 0.
CX este decrementat si ZF este testat dupa fiecare operatie pe siruri.

Observatie:
Instructiunile cu repetare sunt interuptibile, in sensul ca microprocesorul va recunoaste o intrerupere inaintea prelucrarii unui nou element al sirului.

Instructiunile MOVS, MOVSB, MOVSW: Muta elementul curent al unui sir

Folosire: MOVS destinatie,sursa
MOVSB
MOVSW

Instructiunea MOVS copie un octet sau un cuvint de la locatia adresata de DS:SI (chiar daca operanzii sunt specificati) la locatia adresata de ES:DI si actualizeaza SI si DI functie de lungimea datei copiate, astfel incit sa adreseze urmatorul element al sirului.
Cu instructiunea MOVSB se specifica transfer explicit pentru un octet de la DS:SI la ES:DI, iar MOVSW este analog folosita, dar pentru transferuri de cuvinte.
Aceste mnemonice pot fi folosite cu prefixe de repetare pentru transferul unor blocuri intregi din memorie.

Instructiunile CMPS, CMPSB, CMPSW: Compara elementele curente a doua siruri
(CoMPare String)
Folosire: CMPS destinatie,sursa
CMPSB
CMPSW
Indicatori modificati: AF CF OF PF SF ZF

Compara elementul adresat de ES:DI cu cel adresat de DS:SI (prin scadere, dar nu modifica operanzii) si actualizeaza indicatorii si registrii index (ca sa adreseze urmatorul element). Utilizate impreuna cu prefixele de repetare, pot fi executate pina la implinirea unei anumite conditii.
CMPSB se foloseste pentru compararea a doi octeti, iar CMPSW pentru compararea a doua cuvinte curent adresate in siruri.

Instructiunile SCAS, SCASB, SCASW: SCAn String

Folosire: SCAS sir_destinatie
SCASB
SCASW
Indicatori modificati: AF CF OF PF SF ZF

Compara valoarea adresata de ES:DI cu continutul registrului acumulator. In fapt, se scade din AL (sau AX) valoarea adresata de ES:DI
(care poate fi octet sau cuvint), actualizeaza indicatorii si registrul DI, dar nu modifica operandul. Instructiunile SCASB si SCASW sunt folosite pentru a specifica daca este vorba de o data pe un octet (caz in care se compara cu
AL) sau de o data pe un cuvint respectiv (caz in care se compara cu AX).
Folosite cu prefixele de repetare conditionate, aceste instructiuni pot fi folosite in scanarea unui sir pentru cautarea unei valori.

Instructiunile LODS, LODSB, LODSW: LOad String

Folosire: LODS sursa
LODSB
LODSW

Transfera un element al sirului sursa adresat de DS:SI (octet sau cuvint) in acumulator (in AL pentru octet sau in AX pentru cuvint) si actualizeaza SI pentru adresarea urmatorului element in sir.

Instructiunile STOS, STOSB, STOSW: STOre String

Folosire: STOS destinatie
STOSB
STOSW

Transfera un octet sau un cuvint din acumulator la locatia adresata de ES:DI si actualizeaza DI pentru adresarea urmatorului element in sir.
Utilizind prefixele de repetare, aceste instructiuni pot fi folosite la initializarea unui sir cu o valoare constanta.

Instructiuni de salt

Instructiunile de salt modifica valoarea continutului registrului de instructiuni IP, eventual a registrului segment de cod CS, intrerupind executia secventiala a instructiunilor. In urma acestor modificari, programul isi continua executia de la instructiunea incarcata la adresa CS:IP.
Exista doua categorii de instructiuni de salt: instructiuni de salt neconditionat si instructiuni de salt conditionat.

Instructiuni de salt neconditionat

Instructiunea CALL

Folosire: CALL nume_procedura

Instructiunea CALL este folosita pentru apelul unei proceduri cu numele "nume_procedura". Inainte de a se preda controlul procedurii apelate, se salveaya pe stiva informatii privitoare la adresa din segmentul de cod la care se va preda controlul dupa terminarea executiei procedurii. Corespunzator celor doua tipuri de proceduri, NEAR si FAR, asamblorul genereaza doua tipuri de CALL: intrasegment si intersegment respectiv. In cazul unui CALL intrasegment, la executie este plasat (mai corect, salvat) in stiva continutul registrului IP, iar IP este incarcat cu deplasamentul in segmentul de cod al locatiei in care incep instructiunile componente ale procedurii. In cazul unui CALL intersegment, pe linga salvarea registrului IP, are loc operatia similara si pentru registrul CS iar registrii CS si IP sunt incarcati astfel incit sa pointeze la adresa la care incep instructiunile procedurii.

Instructiunile RET, RETF, RETN

Folosire: RET nrBytes
RETF nBytes
RETN nBytes

Instructiunea RET se afla (tipic) in corpul unei proceduri si transfera controlul din procedura la instructiunea ce urmeaza instructiunii
CALL ce apeleaza procedura respectiva. Corespunzator celor doua tipuri de proceduri, NEAR si FAR, asamblorul genereaza doua tipuri de RET: intrasegment si intersegment respectiv. In cazul unui RET intrasegment, registrul IP este incarcat cu ceea ce a fost salvat anterior in stiva prin executia unui CALL (printr-o operatie "pop") astfel incit programul sa poata relua executia din punctul de dupa apelul procedurii. In cazul unui RET intersegment, pe linga salvarea (respectiv restaurarea) registrului IP, are loc operatia similara si pentru registrul CS
Daca nrBytes este specificat, SP este modificat conform operatiei
SP:=SP+numar_octeti, dupa care este restaurat CS (doar daca procedura este FAR) si apoi IP.

Instructiunea JMP: JuMP

Folosire: JMP eticheta

Transfera controlul la locatia data de "eticheta". Implicit, domeniul saltului este intre -32768 - 32767 octeti relativ la instructiunea care urmeaza lui JMP. Salturile NEAR si SHORT cauzeaza actualizarea lui IP, iar cele FAR actualizeaza CS si IP (fara salvari in stiva).

Instructiuni de salt conditionat


Aceste instructiuni sunt executate functie de starile indicatorilor de stare si control. Toate salturile conditionate sunt scurte (SHORT), deci in domeniul -128 - 127 octeti relativ la instructiunea ce urmeaza celei de salt conditionat. In continuare este prezentata lista instructiunilor de salt conditionat impreuna cu conditiile care trebuiesc satisfacute.

Mnemonica Salt daca... Conditie testata

JA Jump if Above CF=0 and ZF=0
JAE Jump if Above or Equal CF=0
JB Jump if Below CF=1
JBE Jump if Below or Equal CF=1 or ZF=1
JC Jump if Carry CF=1
JCXZ Jump if CX Zero CX=0
JE Jump if Equal ZF=1
JG Jump if Greater (signed) ZF=0 and SF=OF
JGE Jump if Greater or Equal (signed) SF=OF
JL Jump if Less (signed) SF != OF
JLE Jump if Less or Equal (signed) ZF=1 or SF != OF
JNA Jump if Not Above CF=1 or ZF=1
JNAE Jump if Not Above or Equal CF=1
JNB Jump if Not Below CF=0
JNBE Jump if Not Below or Equal CF=0 and ZF=0
JNC Jump if Not Carry CF=0
JNE Jump if Not Equal ZF=0
JNG Jump if Not Greater (signed) ZF=1 or SF != OF
JNGE Jump if Not Greater or Equal (signed) SF != OF
JNL Jump if Not Less (signed) SF=OF
JNLE Jump if Not Less or Equal (signed) ZF=0 and SF=OF
JNO Jump if Not Overflow (signed) OF=0
JNP Jump if No Parity PF=0
JNS Jump if Not Signed (signed) SF=0
JNZ Jump if Not Zero ZF=0
JO Jump if Overflow (signed) OF=1
JP Jump if Parity PF=1
JPE Jump if Parity Even PF=1
JPO Jump if Parity Odd PF=0
JS Jump if Signed (signed) SF=1
JZ Jump if Zero ZF=1

Observatii:

- conditiile sunt exprimate in limba engleza, pentru a reflecta de unde vin abrevierile pentru mnemonici; de asemenea, sunt cuprinse informatii despre conditii in care se iau in considerare numere cu semn
(signed).
- este o practica buna de programare ca programul sa fie organizat astfel incit cazurile cele mai des intilnite (in stabilirea unei conditii) sa fie tratate fara a se trece printr-un salt (ceea ce, evident, salveaza timp).

Instructiunea INT: INTerrupt

Folosire: INT num
Indicatori modificati: TF IF

Initiaza executarea unei intreruperi; incarca registrul indicatorilor de stare si control in stiva, zerorizeaza TF si IF, salveaza CS si IP in stiva si apoi incarca CS:IP cu valorile gasite in tabela vectorilor de intrerupere.
Executia programului continua de la punctul dat de CS:IP nou incarcati.

Instructiunea INTO: INTerrupt on Overflow

Folosire: INTO
Indicatori modificati: IF TF

Daca indicatorul OF (Overflow Flag) este 1, atunci aceasta instructiune genereaza un INT 4 care determina executia instructiunilor care incep la adresa 0000:0010.

Instructiunea IRET: Interrupt RETurn

Folosire: IRET
Indicatori modificati: AF CF DF IF PF SF TF ZF

Aceasta instructiune se gaseste in corpul de definitie al unei intreruperi. Returneaza controlul programului in punctul de dupa instructiunea care a chemat intreruperea, restaurind IP, CS si registrul indicatorilor de stare si control din stiva. Executia programului continua de la punctul dat de CS:IP nou incarcati.

Instructiuni pentru controlul iteratiilor

Instructiunile din aceasta clasa permit conducerea si controlul buclelor in programe. Fiecare din aceste instructiuni are forma generala
"mnemonica eticheta", unde "eticheta" precede instructiunea la care se preda controlul daca CX este diferit de 0. Instructiunea la care se preda controlul trebuie sa fie in domeniul -128 la +127 octeti fata de cea care urmeaza instructiunea ce controleaza iteratia. La fiecare executie a unei instructiuni din aceasta clasa, registrul CX se decrementeaza. De obicei, aceste instructiuni sunt folosite in combinatie cu instructiunile pe siruri.

Instructiunea LOOP: Decrement CX and Loop if CX Not Zero

Folosire: LOOP eticheta

Decremeteaza CX cu 1; daca CX nu este 0, transfera controlul la instructiunea precedata de "eticheta". Instructiunea la care se preda controlul trebuie sa fie in domeniul -128 la +127 octeti fata de cea care urmeaza instructiunea LOOP.

Instructiunile LOOPE/LOOPZ - LOOP while Equal / LOOP while Zero

Folosire: LOOPE eticheta
LOOPZ eticheta

Decremeteaza CX cu 1; daca CX nu este 0 si ZF este 1, transfera controlul la instructiunea precedata de "eticheta". Instructiunea la care se preda controlul trebuie sa fie in domeniul -128 la +127 octeti fata de cea care urmeaza instructiunea de buclare.

Instructiunile LOOPNZ/LOOPNE - LOOP while Not Zero / LOOP while Not Equal

Folosire: LOOPNZ eticheta
LOOPNE eticheta

Decrementeaza CX cu 1; daca CX nu este 0 si ZF este 0, transfera controlul la instructiunea precedata de "eticheta". Instructiunea la care se preda controlul trebuie sa fie in domeniul -128 la +127 octeti fata de cea care urmeaza instructiunea de buclare.

Insructiuni pentru lucrul cu indicatorii de stare si control

Instructiunea CLC - CLear Carry

Folosire: CLC
Indicatori modificati: CF

In urma acestei instructiuni indicatorul CF (Carry Flag) ia valoarea 0.

Instructiunea CLD - CLear Direction Flag

Folosire: CLD
Indicatori modificati: DF

In urma acestei instructiuni, indicatorul DF (Direction Flag) ia valoarea 0 (astfel incit, in orice instructiune cu siruri registri DI si SI se vor auto-incrementa).

Instructiunea CLI - CLear Interrupt Flag

Folosire: CLI
Indicatori modificati: IF

Dezactiveaza intreruperile hardware mascabile, prin setarea flagului
IF pe 0. Intreruperile hardware nemascabile si cele software nu sunt dezactivate.

Instructiunea CMC - CoMplement Carry flag

Folosire: CMC
Indicatori modificati: CF

Inverseaza valoarea lui CF.

Instructiunea STC - SeT Carry flag

Folosire: STC
Indicatori modificati: CF

Seeaza CF pe 1.

Instructiunea STD - SeT Direction flag

Folosire: STD
Indicatori modificati: DF

Seteaza DF pe 1, astfel incit in instructiunile pe siruri DI si SI se vor auto-decrementa.

Instructiunea STI - Set Interrupt Flag (Enable Interrupts)

Folosire: STI
Indicatori modificati: IF

Seteaza IF la 1, validind recunoasterea tuturor intreruperilor hardware.


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta