Skip navigation

String- és tömb-műveletek

Műveletek irányának beállítása

A szting, és tömbkezelő utasítások közös tulajdonsága, hogy egy tömbönelemen végeznek műveletet, majd a felhasznált mutatót átállítják a tömb következő elemére. A következő elem viszont két irányban lehet, jobbra, vagy balra. Az irányt nekünk kell megadnunk az direction flag beállításával.

CLD: CLear Direction

  • Hatására a direction flag értéke 0-ra áll.
  • Újabb módosításig a string műveletek jobbra léptetnek.

STD: SeT Direction

  • Hatására a direction flag értéke 1-re áll.
  • Újabb módosításig a string műveletek balra léptetnek.

Fontos továbbá, hogy amennyiben a műveletek egyik oldala a memóriában van, úgy a memóriában levő forrás az ESI a cél pedig az EDI regiszter szokott lenni.

Adatok betöltése

Az adatok betöltésére a LODSB, LODSW, LODSD, LODS utasítások használhatóak. A betöltésben az ESI, és az EAX regiszterek vesznek részt.


LODSB (LOaD String Byte):

  • Az ESI által mutatott memóriacímről olvas betölt egy Byte-ot az AL regiszterbe,
  • Majd az ESI értékét a Direction flag alapján módosítja 1-el (iránytó függően hozzáad, vagy kivon 1-et).

LODSW (LOaD String Word):

  • Az ESI által mutatott memóriacímről olvas betölt egy Szót az AX regiszterbe,
  • Majd az ESI értékét a Direction flag alapján módosítja 2-vel (iránytó függően hozzáad, vagy kivon 2-t).

LODSD (LOaD String Doubleword):

  • Az ESI által mutatott memóriacímről olvas betölt egy Duplaszót az EAX regiszterbe,
  • Majd az ESI értékét a Direction flag alapján módosítja 4-el (iránytó függően hozzáad, vagy kivon 4-et).

LODS (LOaD Sring):

  • A paraméterei alapján végez betöltését,
  • Használata nem célszer, így kerülni fogjuk,
  • Leírása az előadás jegyzetben.

Adatok kiírása

Az adatok kiírására a STOSB, STOSW, STOSD, STOS utasítások használhatóak. A betöltésben az EDI, és az EAX regiszterek vesznek részt.


STOSB (STOre String Byte):

  • Az AL-ben tárolt byte-ot kimenti az [EDI] által mutatott memóriacímre,
  • Majd az EDI értékét a Direction flag alapján módosítja 1-el (iránytó függően hozzáad, vagy kivon 1-et).

STOSW (STOre String Word):

  • Az AX-ben tárolt 2 byte-ot kimenti az [EDI] által mutatott memóriacímre,
  • Majd az EDI értékét a Direction flag alapján módosítja 2-vel (iránytó függően hozzáad, vagy kivon 2-t).

STOSD (STOre String Doubleword):

  • Az EAX-ben tárolt 4 byte-ot kimenti az [EDI] által mutatott memóriacímre,
  • Majd az EDI értékét a Direction flag alapján módosítja 4-el (iránytó függően hozzáad, vagy kivon 4-et).

LODS (STOre Sring):

  • A paraméterei alapján végez betöltését,
  • Használata nem célszer, így kerülni fogjuk,
  • Leírása az előadás jegyzetben.

Adatok másolása

Lehetőség van az adatok automatikus másolására is. A MOVSB, MOVSW, MOVSD, és MOVS utasításokkal egy forrás és cél között megoldható az adatok automatikus áthelyezése.


MOVSB (MOVe String Byte):

  • Az [ESI] által mutatott 1 byte-ot átmásolja az [EDI] által mutatott memóriacímre,
  • Majd az ESI, és EDI értékét a Direction flag alapján módosítja 1-el (iránytó függően hozzájuk ad, vagy kivon 1-et).

MOVSW (MOVe String Word):

  • Az [ESI] által mutatott 2 byte-ot átmásolja az [EDI] által mutatott memóriacímre,
  • Majd az ESI, és EDI értékét a Direction flag alapján módosítja 2-vel (iránytó függően hozzájuk ad, vagy kivon 2-t).

MOVSD (MOVe String Doubleword):

  • Az [ESI] által mutatott 1 byte-ot átmásolja az [EDI] által mutatott memóriacímre,
  • Majd az ESI, és EDI értékét a Direction flag alapján módosítja 4-el (iránytó függően hozzájuk ad, vagy kivon 4-et).

MOVS (MOVe Sring):

  • A paraméterei alapján végez betöltését,
  • Használata nem célszer, így kerülni fogjuk,
  • Leírása az előadás jegyzetben.

Adatok összehasonlítása

Az adatok összehasonlítására is van segéd utasítás.


A

  • CMPSB (CoMaPre String Byte),
  • CMPSW (CoMaPre String Word),
  • CMPSD (CoMaPre String Doubleword),
  • CMPS  (CoMaPre String)

utasítások string elemek összehasonlítását szolgálják. Működésük hasonló a MOVSB, MOVSW, MOVSD, és MOVS utasításokhoz, de adat másolás helyett karakterek összehasonlítását végzik a CMP utasítás mintájára (a forrás és cél különbsége alapján állítják be a FLAGS regisztert).


A

  • SCASB (SCAn String Byte),
  • SCASW (SCAn String Word),
  • SCASD (SCAn String Doubleword),
  • SCAS  (SCAn String)

utasítások pedig az EAX regiszter egyes részeit hasonlítják össze az [EDI] által mutatott memória adattal. Működésük a STOSB, STOSW, STOSD, és STOS utasításhoz hasonló, detárolás helyett az adatok összehosonlítását végzik.

Ismétlések

A fent említett utasítások ismétlésére is van lehetőség. A REP, utasítás és változatai az utánuk írt string műveletet az ECX-ben adott számszor (, vagy egy feltétel teljesüléséig) ismétlik meg.


REP [String utasítás] - (REPeat):

  • Elvégzi a megoadott String utasítást,
  • Csökkenti az ECX-et egyel,
  • Ha az ECX nem nulla, akkor újrekezdi az string utasítást, és az ECX csökkentést.

pl.:

.data
    string1     DB      16 dup 0
    string2     DB      16 dup ?

;...

.code
    MOV     ESI, offset string1     ; ESI a string1-re mutat
    MOV     EDI, offset string2     ; EDI a string2-re mutat
    MOV     ECX, 16                 ; ECX értéke 16
    
    REPNE   MOVSB                   ; 16 byte másolás a [ESI]-től az [EDI]-hez

A REP utasítás variánsai különböző extra megállási feltételeket adnak a REP működéséhez:

  • REPZ (REPeat util Zero), REPE (REPeat util Equal): Megáll, ha a Zero flag értéke 0 lesz,
  • REPNZ (REPeat util Not Zero), REPNE (REPeat util Not Equal): Megáll, ha a Zero flag értéke 1.

Pl.:

.data
    string1     DB       'Hello World+', 0
    string2     DB       'Hello!', 0

;...

.code
    MOV     ESI, offset string1     ; ESI a string1-re mutat
    MOV     EDI, offset string2     ; EDI a string2-re mutat
    MOV     ECX, 13                 ; ECX értéke 16
    
    REPNE   CMPSB                   ; Az ESI és EDI által mutatott maximum 13 karakterpár összehasonítása
                                    ;     Eltérő karakterpár esetén megállunk