RETAZCOVE INSTRUKCIE

   V tejto funkcnej skupine su zahrnute instrukcie ktore vykonavaju rozne operacie nad bajtovymi alebo slovnymi retazcami v pameti. Bajtovy retazec je suvisla cast pameti v ktorej je postupnost bajtov. Slovny retazec je v podstate to iste ako bajtovy, ale pracujeme naraz nad dvojicami bajtov - nad slovami. Lubovolna operacia moze byt vykonavana procesorom aj opakovane, pokial sa pred samotnou instrukciou nachadza tzv. opakovania predpona.

   Vsetky zakladne operacie nad retazcami pouzivaju pre adresaciu zdrojoveho retazca registre DS:SI (od toho je nazov registra SI ako source index) a na adresaciu cieloveho sa pouzivaju registre ES:DI (podobne zase aj tu - DI ako destination index). Nie vsetky operacie musia adresovat aj cielovy a aj zdrojovy retazec. Ak pracuju nad iba jednym retazcom, ako druhy argument pouzivaju akumulator.

   V nasledujucej tabulke sa nachadza prehlad zakladnych operacii nad retazcami:

NazovCinnostPriznaky
MOVSB MOV [ES:DI],[DS:SI] ... prenesie bajt
if DF=0 thenSI=SI+1 else SI=SI-1
DI=DI+1DI=DI-1
nemeni
MOVSW MOV [ES:DI],[DS:SI] ... prenesie slovo
if DF=0 thenSI=SI+2 else SI=SI-2
DI=DI+2DI=DI-2
nemeni
CMPSB CMP [DS:SI],[ES:DI] ... porovna bajt
if DF=0 thenSI=SI+1 else SI=SI-1
DI=DI+1DI=DI-1
nastavuje podla
vysledku porovnania
CMPSW CMP [DS:SI],[ES:DI] ... porovna slovo
if DF=0 thenSI=SI+2 else SI=SI-2
DI=DI+2DI=DI-2
nastavuje podla
vysledku porovnania
SCASB CMP AL,[ES:DI] ... porovna bajt
if DF=0 thenDI=DI+1 else DI=DI-1
nastavuje podla
vysledku porovnania
SCASW CMP AX,[ES:DI] ... porovna slovo
if DF=0 thenDI=DI+2 else DI=DI-2
nastavuje podla
vysledku porovnania
LODSB MOV AL,[DS:SI] ... nacita bajt z pameti
if DF=0 thenSI=SI+1 else SI=SI-1
nemeni
LODSW MOV AX,[DS:SI] ... nacita slovo z pameti
if DF=0 thenSI=SI+2 else SI=SI-2
nemeni
STOSB MOV [ES:DI],AL ... ulozi bajt do pameti
if DF=0 thenDI=DI+1 else DI=DI-1
nemeni
STOSW MOV [ES:DI],AX ... ulozi slovo do pameti
if DF=0 thenDI=DI+2 else DI=DI-2
nemeni

   Okrem zakladnych retazcovych operacii do tejto skupiny zaradujeme este opakovacie predpony REP, REPE, REPZ, REPNE a REPNZ. Vlozenie takejto predpony pred retazcovu operaciu sposobi opakovanie tejto operacie pokym CX nie je nulove alebo pokym sa nesplni nejaka specificka podmienka.

   Cinnost tychto predpon sa da zhrnut do takychto krokov:

  1. Skontrolovanie ci je CX nulovy. Ak je nulovy, retazcova operacia sa uz vykonavat nebude a pokracuje sa dalej vo vykonavani programu.
  2. Vykonanie retazcovej operacie nasledujucu za predponou.
  3. Dekrementovanie registra CX. (CX=CX-1).
  4. Ak je retazova operacia typu MOVS, LODS alebo STOS, opakovanie slucky (pokracovanie bodom 1).
  5. Pri retazcovych instrukciach CMPS a SCAS sa este testuje priznak ZF. Ak je predpona jedna z REP, REPE alebo REPZ, potom na to aby sa pokracovalo vo vykonavani slucky musi byt ZF nastaveny. Ak je predpona jedna z REPNE alebo REPNZ, potom sa pokracuje vo vykonavani slucky prave vtedy ked nie je ZF nastaveny.

   Predpony REP, REPE a REPZ su si navzajom plne ekvivalentne a totozne a je jedno, ktoru z nich napisete do textu programu, prekladac assemblera ich aj tak vsetky tri preklada do jedneho operacneho kodu. Podobne aj predpony REPNZ a REPNE su si tak isto ekvivalentne.

   Ako sa daju tieto retazcove instrukcie vyuzit ? Operacie typu MOVS s vyhodou pouzijete napr. pri efektivnom prenasani nejakych rozsiahlych blokov pameti, STOS sa da vyuzit pri zaplnani oblasti pameti nejakym bajtom alebo slovom, LODS sam o sebe sice nema vyznam opakovat, ale mozete ho vyuzit v nejakom programe, v ktorom sa budu postupne do akumulatora nacitavat nejake data a potom nejak spracuvat. Pomocou operacii typu CMPS sa da velmi pekne zrealizovat porovnavanie dvoch retazcov v pameti a SCAS je zase idealny pri hladani nejakeho bajtu alebo slova v oblasti pameti.

Nazad na obsah , predchadzajuca a dalsia lekcia