OPERATII PE SIRURI DE OCTETI / CUVINTE

Instructiuni pe siruri:

Le retineti mai usor:)


Un sir este caracterizat de:
- tipul elementelor (octeti sau cuvinte) => este indicat de ultima literă a instructiunii folosite (B=byte, W=word), ambele siruri având acelasi tip
- adresa primului element => este o adresă FAR memorată astfel:
        - în DS:SI – pentru şirul sursă
        - în ES:DI – pentru şirul destinaţie
- directia de parcurgere => este indicată de valoarea din flagul DF (0 – de la adrese mai mici la adrese mai mari, 1 – de la adrese mai mari la adrese mai mici. Vezi CLD, STD)
- numărul de elemente => când este nevoie de el, se pune în CX

Instructiuni pentru transfer de date

LODSB În AL se încarcă octetul de la adresa <DS:SI>
Dacă DF=0 atunci inc(SI), altfel dec(SI)
    -    
LODSW În AX se încarcă cuvântul de la adresa <DS:SI>
Dacă DF=0 atunci SI:=SI+2, altfel SI:=SI-2
    -    
STOSB La adresa <ES:DI> se încarcă octetul din AL
Dacă DF=0 atunci inc(DI), altfel dec(DI)
    -    
STOSW La adresa <ES:DI> se încarcă cuvântul din AX
Dacă DF=0 atunci DI:=DI+2, altfel DI:=DI-2
    -    
MOVSB La adresa <ES:DI> se încarcă octetul de la adresa <DS:SI>
Dacă DF=0 atunci inc(SI), inc(DI), altfel dec(SI), dec(DI)
    -    
MOVSW La adresa <ES:DI> se încarcă cuvântul de la adresa <DS:SI>
Dacă DF=0 atunci SI:=SI+2, DI:=DI+2, altfel SI:=SI-2, DI:=DI-2
    -    


Exemplu:    Avem un sir sursa (cuvinte). Să se copieze într-un sir destinatie. Stim câte elemente avem.

     mov CX, dim_sir
     mov SI, OFFSET sir_sursa
     mov AX, SEG sir_sursa
     mov DS, AX
     mov DI, OFFSET sir_dest
     mov AX, SEG sir_dest
     mov ES, AX
     CLD
Again:
     LODSW
     STOSW
LOOP Again

(sau direct cu MOVSW)



Instrucţiuni pentru consultarea şi compararea datelor

SCASB CMP AL, <ES:DI>
Dacă DF=0 atunci inc(DI), altfel dec(DI)
OF, SF, ZF,
AF, PF, CF
SCASW CMP AX, <ES:DI>
Dacă DF=0 atunci DI:=DI+2, altfel DI:=DI-2
OF, SF, ZF,
AF, PF, CF
CMPSB CMP <DS:SI>, <ES:DI>
Dacă DF=0 atunci inc(SI), inc(DI), altfel dec(SI), dec(DI)
OF, SF, ZF,
AF, PF, CF
CMPSW CMP <DS:SI>, <ES:DI>
Dacă DF=0 atunci SI:=SI+2, DI:=DI+2, altfel SI:=SI-2, DI:=DI-2
OF, SF, ZF,
AF, PF, CF


Exemplu:    Se dă un sir de octeti. Să se găsească ultimul caracter "0".

     ;... se incarca toate datele despre sirul "destinatie"
     MOV AL, '0'
     MOV CX, lung_sir
     STD
Cont_caut:     ;continui cautarea...
     SCASB
     JE Gasit
LOOP Cont_caut
     ...
Gasit:
     INC DI     ;ma intorc la caracterul gasit inainte sa se fi facut decrementarea lui DI



Executia repetată a unei instructiuni pe siruri

prefix_de_instructiune instructiune_pe_sir

echivalentă cu

Again:
       instructiune_pe_sir
      
LOOP Again

... unde prefix_de_instructiune poate fi REP, echivalent cu REPE (Repeat While Equal), REPZ (Repeat While Zero) - care provoacă executia repetată a instructiunilor SCAS sau CMPS până când CX devine 0 sau până când apare o nepotrivire ( => ZF=0)
... sau poate fi REPNE (Repeat While Not Equal) sau REPNZ (Repeat While Not Zero) - care provoacă executia repetată a instructiunii SCAS sau CMPS până când CX devine 0 sau până când apare o potrivire ( => ZF=1)

Observatii:
- instructiunile pe siruri nu afectează flagurile în urma actiunii asupra registrilor SI, DI sau CX
- LODS, STOS, MOVS - nu afectează nici un flag, în timp ce SCAS si CMPS modifică flagurile doar ca rezultat al comparatiilor efectuate