Instrucţiuni pentru operaţii cu şiruri
Prin şir se înţelege o secvenţă de octeţi sau de cuvinte, aflate la adrese succesive de memorie. Setul de
instrucţini cuprinde operaţii primitive (la nivel de octet sau cuvânt) şi prefixe de repetare, care pot realiza
repetarea operaţiilor primitive de un număr fix de ori sau până la îndeplinirea unei condiţii de tip
comparaţie. Denumirea instrucţiunilor fără operanzi la nivel de octet se termină cu litera B, iar a celor la
nivel de cuvânt cu litera W. Aceste instrucţiuni folosesc registrele DS:SI ca adresă sursă şi ES:DI ca adresă
destinaţie. Există şi variantele cu operanzi ale acestor instrucţiuni, şi ele se folosesc în situaţia în care se
utilizează alt segment pentru şirul sursă, decât segmentul de date implicit (DS). Toate aceste instrucţiuni
incrementează (dacă DF este 0) sau decrementează (dacă DF este 1) în mod automat adresele (regiştrii SI,
DI) cu 1 sau cu 2, după cum operaţia este la nivel de octet sau de cuvânt. Starea flagului DF poate fi
modificată prin instrucţiunile CLD (Clear Direction) şi STD (Set Direction), care şterg, respectiv setează
acest bistabil.
1. Operaţii primitive
Instrucţiunile MOVSB, MOVSW (Move String - Copiază şir)
MOVSB
MOVSW
ES:DI ← DS:SI
SI ← SI + delta
DI ← DI + delta
Instrucţiunile CMPSB, CMPSW (Compare String - Compară şiruri)
CMPSB
CMPSW
DS:SI - ES:DI
SI ← SI + delta
DI ← DI + delta
Instrucţiunile LODSB, LODSW (Load String - Încarcă şir)
LODSB
LODSW
acumulator ← DS:SI (acumulator este AX sau AL în funcţie de tipul operaţiei)
SI ← SI + delta
Instrucţiunile STOSB, STOSW (Store String - Depune şir)
STOSB
STOSW
ES:DI ← acumulator (acumulator este AX sau AL în funcţie de tipul operaţiei)
DI ← DI + delta
21
Instrucţiunile SCASB, SCASW (Scan String - Căutare în şir)
SCASB
SCASW
acumulator - ES:DI (acumulator este AX sau AL în funcţie de tipul operaţiei)
DI ← DI + delta
2. Prefixe de repetare
Prefixele de repetare permit execuţia repetată a unei operaţii primitive cu şiruri de octeţi sau de cuvinte,
funcţie de un contor de operaţii sau de un contor şi o condiţie logică. Aceste prefixe nu sunt instrucţiuni în
sine, ci participă la formarea unor instrucţiuni compuse, alături de operaţiile primitive descrise mai sus.
Prefixul de repetare REP (Repeat - Repetă)
REP op_primitiva
Repetă operaţia primitivă şi decrementează CX, cât timp conţinutul registrului CX este diferit de zero. De
obicei se foloseşte la primitivele de tip MOVS, LODS şi STOS.
Prefixul de repetare REPE/REPZ (Repeat While Zero/Equal - Repetă cât timp este zero/egal)
REPE/REPZ op_primitiva
Repetă operaţia primitivă şi decrementează CX, cât timp conţinutul registrului CX este diferit de zero şi
rezultatul operaţiei primitive este 0. De obicei se foloseşte la primitivele de tip CMPS şi SCAS.
Prefixul REPNE/REPNZ (Repeat While Not Zero/Equal - Repetă cât timp nu este zero/egal)
REPNE/REPNZ op_primitiva
Repetă operaţia primitivă şi decrementează CX, cât timp conţinutul registrului CX este diferit de zero şi
rezultatul operaţiei primitive este de asemenea diferit de 0. De obicei se foloseşte la primitivele de tip
CMPS şi SCAS.
Observaţie: Numărul elementelor unui şir se poate calcula folosind contorul de locaţii. În exemplul
următor, expresia $-text reprezintă numărul octeţilor de la adresa text până la adresa curentă:
text db 'A B C D E F G H J K L M N O P Q R'
ltext equ $-text
De asemenea, operatorul LENGTH întoarce numărul de elemente, iar operatorul SIZE întoarce dimensiunea
în octeţi a unei variabile. Astfel pentru definiţia:
tab dw 100 dup(?)
expresia length tab are valoarea 100. Pentru aceeaşi definiţie, expresia size tab are valoarea 200.
1. Să se scrie un program care copiază un şir într-un alt şir.
2. Căutarea unui anumit caracter într-un şir. Se va afişa pe ecran poziţia caracterului în şir.
3. Să se scrie un program care dă indicele caracterului începând de la care două şiruri
diferă.
4. Să se scrie un program care afişează pe ecran numărul de apariţii a unui şir într-un alt şir.
5. Să se scrie un program care adună două şiruri de cifre zecimale aflate în zona de date.
Rezultatul este
un şir care conţine pe fiecare poziţie suma cifrelor de pe poziţiile corespunzătoare din cele două şiruri.
6. Precizaţi care este efectul următoarei secvenţe de instrucţiuni:
mov al, ‘D’
mov cx, 12
rep stosb .
Prin şir se înţelege o secvenţă de octeţi sau de cuvinte, aflate la adrese succesive de memorie. Setul de
instrucţini cuprinde operaţii primitive (la nivel de octet sau cuvânt) şi prefixe de repetare, care pot realiza
repetarea operaţiilor primitive de un număr fix de ori sau până la îndeplinirea unei condiţii de tip
comparaţie. Denumirea instrucţiunilor fără operanzi la nivel de octet se termină cu litera B, iar a celor la
nivel de cuvânt cu litera W. Aceste instrucţiuni folosesc registrele DS:SI ca adresă sursă şi ES:DI ca adresă
destinaţie. Există şi variantele cu operanzi ale acestor instrucţiuni, şi ele se folosesc în situaţia în care se
utilizează alt segment pentru şirul sursă, decât segmentul de date implicit (DS). Toate aceste instrucţiuni
incrementează (dacă DF este 0) sau decrementează (dacă DF este 1) în mod automat adresele (regiştrii SI,
DI) cu 1 sau cu 2, după cum operaţia este la nivel de octet sau de cuvânt. Starea flagului DF poate fi
modificată prin instrucţiunile CLD (Clear Direction) şi STD (Set Direction), care şterg, respectiv setează
acest bistabil.
1. Operaţii primitive
Instrucţiunile MOVSB, MOVSW (Move String - Copiază şir)
MOVSB
MOVSW
ES:DI ← DS:SI
SI ← SI + delta
DI ← DI + delta
Instrucţiunile CMPSB, CMPSW (Compare String - Compară şiruri)
CMPSB
CMPSW
DS:SI - ES:DI
SI ← SI + delta
DI ← DI + delta
Instrucţiunile LODSB, LODSW (Load String - Încarcă şir)
LODSB
LODSW
acumulator ← DS:SI (acumulator este AX sau AL în funcţie de tipul operaţiei)
SI ← SI + delta
Instrucţiunile STOSB, STOSW (Store String - Depune şir)
STOSB
STOSW
ES:DI ← acumulator (acumulator este AX sau AL în funcţie de tipul operaţiei)
DI ← DI + delta
21
Instrucţiunile SCASB, SCASW (Scan String - Căutare în şir)
SCASB
SCASW
acumulator - ES:DI (acumulator este AX sau AL în funcţie de tipul operaţiei)
DI ← DI + delta
2. Prefixe de repetare
Prefixele de repetare permit execuţia repetată a unei operaţii primitive cu şiruri de octeţi sau de cuvinte,
funcţie de un contor de operaţii sau de un contor şi o condiţie logică. Aceste prefixe nu sunt instrucţiuni în
sine, ci participă la formarea unor instrucţiuni compuse, alături de operaţiile primitive descrise mai sus.
Prefixul de repetare REP (Repeat - Repetă)
REP op_primitiva
Repetă operaţia primitivă şi decrementează CX, cât timp conţinutul registrului CX este diferit de zero. De
obicei se foloseşte la primitivele de tip MOVS, LODS şi STOS.
Prefixul de repetare REPE/REPZ (Repeat While Zero/Equal - Repetă cât timp este zero/egal)
REPE/REPZ op_primitiva
Repetă operaţia primitivă şi decrementează CX, cât timp conţinutul registrului CX este diferit de zero şi
rezultatul operaţiei primitive este 0. De obicei se foloseşte la primitivele de tip CMPS şi SCAS.
Prefixul REPNE/REPNZ (Repeat While Not Zero/Equal - Repetă cât timp nu este zero/egal)
REPNE/REPNZ op_primitiva
Repetă operaţia primitivă şi decrementează CX, cât timp conţinutul registrului CX este diferit de zero şi
rezultatul operaţiei primitive este de asemenea diferit de 0. De obicei se foloseşte la primitivele de tip
CMPS şi SCAS.
Observaţie: Numărul elementelor unui şir se poate calcula folosind contorul de locaţii. În exemplul
următor, expresia $-text reprezintă numărul octeţilor de la adresa text până la adresa curentă:
text db 'A B C D E F G H J K L M N O P Q R'
ltext equ $-text
De asemenea, operatorul LENGTH întoarce numărul de elemente, iar operatorul SIZE întoarce dimensiunea
în octeţi a unei variabile. Astfel pentru definiţia:
tab dw 100 dup(?)
expresia length tab are valoarea 100. Pentru aceeaşi definiţie, expresia size tab are valoarea 200.
- Aplicaţii
1. Să se scrie un program care copiază un şir într-un alt şir.
2. Căutarea unui anumit caracter într-un şir. Se va afişa pe ecran poziţia caracterului în şir.
3. Să se scrie un program care dă indicele caracterului începând de la care două şiruri
diferă.
4. Să se scrie un program care afişează pe ecran numărul de apariţii a unui şir într-un alt şir.
5. Să se scrie un program care adună două şiruri de cifre zecimale aflate în zona de date.
Rezultatul este
un şir care conţine pe fiecare poziţie suma cifrelor de pe poziţiile corespunzătoare din cele două şiruri.
6. Precizaţi care este efectul următoarei secvenţe de instrucţiuni:
mov al, ‘D’
mov cx, 12
rep stosb .
Niciun comentariu:
Trimiteți un comentariu