Aceasta lucrare continua prezentarea instructiunilor setului ISA x86 cu instructiunile speciale pe siruri de caractere.
Aceste instructiuni s-au introdus cu scopul de a accelera accesul la elementele unei structuri de tip 717j913h sir sau vector. Instructiunile folosesc în mod implicit registrele index SI si DI pentru adresarea elementelor sirului sursa si respectiv destinatie. În mod implicit registrul DS pastreaza adresa de segment a sursei iar registrul ES adresa de segment a destinatiei. Dupa efectuarea operatiei propriu-zise (specificata prin mnemonica instructiunii), registrele index sunt incrementate sau decrementate automat pentru a trece la elementele urmatoare din sir. Indicatorul DF determina directia de parcurgere a sirurilor: DF=0 prin incrementare, DF=1 prin decrementare. Registrul CX poate fi folosit pentru contorizarea numarului de operatii efectuate.
Instructiunile MOVSB, MOVSW
Aceste instructiuni transfera un element din sirul sursa în sirul destinatie. Instructiunea MOVSB opereaza pe octet (eng. move string on byte), iar MOVSW opereaza pe cuvânt. La operatiile pe cuvânt registrele index se incrementeaza sau se decrementeaza cu 2 unitati, deoarece un cuvânt ocupa 2 locatii în memorie. Instructiunile nu au parametrii; programatorul trebuie sa încarce în prealabil adresele sirurilor în registrele SI si DI, si lungimea sirului în CX.
Exemplu:
mov si, offset sir_sursa ; "offset" este un operator care determina adresa
mov di, offset sir_destinatie ; de offset a variabilei
mov cx, lung_sir
et: MOVSB ; DS:[SI]=>ES:[DI], SI++, DI++
jnz et
Instructiunile LODSB, LODSW, STOSB si STOSW
Primele doua instructiuni realizeaza încarcarea succesiva a elementelor unui sir în registrul acumulator. Urmatoarele doua instructiuni realizeaza operatia inversa de salvare a registrului acumulator într-un sir. si la aceste instructiuni registrele index (SI pentru încarcare si DI pentru salvare) se incrementeaza sau se decrementeaza automat. Terminatiile "B" respectiv "W" indica lungimea pe care se face transferul: octet sau cuvânt.
Instructiunile CMPSB, CMPSW, SCASB si SCASW
Aceste instructiuni realizeaza operatii de comparare cu elemente ale unui sir. Primele doua instructiuni compara între ele elementele a doua siruri, iar ultimele doua compara continutul registrului acumulator cu câte un element al sirului (operatie de scanare).
Instructiunile REP, REPZ, REPE, REPNZ, REPNZ
Aceste instructiuni permit executia multipla a unei instructiuni pe siruri. Prin amplasarea unei astfel de instructiuni în fata unei instructiuni pe siruri obliga procesorul executia repetata a operatiei pâna ce conditia de terminare este satisfacuta. Registrul CX se decrementeaza automat. La prima varianta, REP, conditia de terminare este CX=0. La instructiunile REPZ si REPE operatia se repeta atâta timp cât rezultatul este zero sau operanzii sunt egali. La REPNZ si REPNE operatia se repeta atâta timp cât rezultatul este diferit de zero sau operanzii sunt diferiti.
Exemple:
mov si, offset sir_sursa
mov di, offset sir_destinatie
mov cx, lungime_sir
rep movsb ; transfera sirul sursa în sirul destinatie
Instructiunile CLD si STD
Aceste instructiuni modifica starea indicatorului de directie DF. Prin acest indicator se controleaza modul de parcurgere a sirurilor la operatiile pe siruri: prin incrementare (DF=0) sau prin decrementare (DF=1).
Exercitii si probleme
Se dau doua siruri cu un numar egal de elemente. Sa se interclaseze elementele celor doua siruri.
2. Sa se scrie o rutina care efectueaza operatii aritmetice de baza între doi vectori. Parametrii de intrare:
DS:SI - adresa primului vector
ES:DI - adresa celui de al doilea vector
DS:BX - adresa vectorului rezultat
CX - lungimea vectorilor
AL - codul operatiei (0 - adunare, 1 - scadere, 2 - înmultire, 3 împartire)
O depasire de capacitate va fi indicata prin setarea indicatorului CF (CF=1). Pentru un rezultat corect indicatorul va fi sters (CF=0|)
|