M E N U
Strona główna Assembler -kurs
Assembler -teksty
AntiCracking
API
Opisy narzędzi
Zabezpieczenia CD/DVD
Budowa plików
Sources
Linki
Kontakt

STATYSTYKI

stat4u
PRV.PL - Twoje miejsce w sieci.
Od 06.09.2000
Optymalizacja:
1024x768, IE5
  • Assembler - kurs

  • Operacje na łańcuchach

  • REP, REPx, REPNx
    REP(powtarzaj), REPE/REPZ(powtarzaj dopóki równe), REPNE/REPNZ(powtarzaj dopóki nie równe) są prefiksami poprzedzającymi instrukcje działające na łańcuchach: loads, movs, stos, cmps, scas(we wszystkich odmianach).

    REP - wskazaną operację powtarza CX razy.

    REPE, REPZ - powtarzają wskazaną operację CX razy, ale przerywają, gdy ZF=0 (instrukcja wskazana jest powtarzana, gdy: CX <>0 i ZF=1).

    REPNE, REPNZ - powtarzają wskazaną operację CX razy, ale przerywają, gdy ZF=1 (instrukcja wskazana jest powtarzana, gdy: CX <>0 i ZF=0).

    Znacznik kierunku
    Znacznik kierunku DF mówi procesorowi, w którą stronę (+,-) ma pójść po wykonaniu instrukcji łańcuchowej. Kierunek może być równy 1 lub -1.
    Jeśli ustawimy znacznik DF na 0 (instrukcja CLD), to kierunek ma wartość 1.
    Jeśli ustawimy znacznik DF na 1 (instrukcja STD), to kierunek ma wartość -1.

    Operacje

    Wypełnienie łańcucha wartością
    Do wypełniania łańcucha (podstawiania danej wartości do każdego jego pola) służy instrukcja stosx.Występują trzy postaci tej instrukcji:
  • stosb - wstawia bajt. Instrukcja wykonuje przepisanie bajtu do komórki pamięci (es:[di]=al) i zmienia indeks di(di=di+kierunek, przesuwa indeks o bajt).
  • stosw - wstawia słowo. Instrukcja wykonuje przepisanie słowa do komórki pamięci (es:[di]=ax) i zmienia indeks di(di=di+2*kierunek, przesuwa indeks o słowo).
  • stosd - wstawia podwójne słowo (only >=386). Instrukcja wykonuje przepisanie podwójnego słowa do komórki pamięci (es:[di]=eax) i zmienia indeks di(di=di+4*kierunek, przesuwa indeks o podwójne słowo).

    Kopiowanie łańcuchów
    Do kopiowania łańcuchów służy instrukcja do komórki pamięci movsx. Występują trzy odmiany tej instrukcji:
  • movsb - kopiuje bajt. Instrukcja wykonuje przepisanie między komórkami pamięci
    (es:[di]=ds:[si], komórka o rozmiarze bajtu) i zwiększa indeksy si i di (si=si+kierunek, di=di+kierunek).
  • movsw - kopiuje słowo. Instrukcja wykonuje przepisanie między komórkami pamięci
    (es:[di]=ds:[si], komórka o rozmiarze słowa) i zwiększa indeksy si i di (si=si+2*kierunek, di=di+2*kierunek).
  • movsd - kopiuje podwójne słowo (only >=386). Instrukcja wykonuje przepisanie między komórkami pamięci
    (es:[di]=ds:[si], komórka o rozmiarze podwójnego słowa) i zwiększa indeksy si i di (si=si+4*kierunek, di=di+4*kierunek).

    Odczyt elementu z łańcucha
    Do odczytu elementu (bajtu, słowa, podwójnego słowa) z łańcucha służy instrukcja lodsx. Występują trzy postaci tej instrukcji:
  • lodsb - czyta bajt. Instrukcja wykonuje przepisanie bajtu z komórki pamięci (al=ds:[si]) i zmienia indeks si (si=si+kierunek, przesuwa indeks o bajt).
  • lodsw - czyta słowo. Instrukcja wykonuje przepisanie słowa z komórki pamięci (ax=ds:[si]) i zmienia indeks si (si=si+2*kierunek, przesuwa indeks o słowo).
  • lodsd - czyta podwójne słowo. Instrukcja wykonuje przepisanie podwójnego słowa z komórki pamięci (eax=ds:[si]) i zmienia indeks si (si=si+4*kierunek, przesuwa indeks o podwójne słowo).

    Porównywanie łańcuchów
    Do porównywania dwóch łańcuchów służy instrukcja cmpsx. Występują trzy postaci tej instrukcji:
  • cmpsb - porównanie bajtów. Wykonuje porównanie bajtów w komórkach pamięci
    (ds:[si] i es:[di]) i zmienia indeksy si i di (si=si+kierunek, di=di+kierunek).
  • cmpsw - porównanie słów. Wykonuje porównanie słów w komórkach pamięci
    (ds:[si] i es:[di]) i zmienia indeksy si i di (si=si+2*kierunek, di=di+2*kierunek).
  • cmpsd - porównanie podwójnych słów (only >=386). Wykonuje porównanie podwójnych słów w komórkach pamięci
    (ds:[si] i es:[di]) i zmienia indeksy si i di (si=si+4*kierunek, di=di+4*kierunek).

    Wynik porównań powyższych instrukcji nie jest nigdzie składowany, tylko na jego podstawie są ustawiane znaczniki (tzn. na podstawie relacji między ds:[si] i es:[di]). Wobec tego można na ich podstawie dokonać odpowiednich skoków warunkowych.

    RelacjaSkok dla liczb bez znakuSkok dla liczb ze znakiem
    ds:[si]=es:[di]jeje
    ds:[si]>es:[di]jajg
    ds:[si]<es:[di]jbjl
    ds:[si]>=es:[di]jaejge
    ds:[si]<=es:[di]jbejle
    ds:[si]<>es:[di]jnejne

    Poniższy przykład przedstawia wyszukiwanie w dwóch tablicach dwóch takich samych elementów na tych samych pozycjach.

    TABLICA_1 dw 1000 dup(?)
    TABLICA_2 dw 1000 dup(?)
    push cs
    pop es
    push cs
    pop ds
    lea di,TABLICA_1
    lea si,TABLICA_2
    mov cx,1000
    cld ;kierunek dodatni
    repne cmpsw
    jz znalazl ;jeżeli ZF<>1, tzn. znalazl takie same slowa, a di,si-przesuniecia nastepnych slow
    ;.........
    znalazl:
    ;.........

    Jeśli zamienimy w powyższym przykładzie instrukcje repne na repe i jz na jnz to będzie on przykładem na wyszukiwanie dwóch różnych elementów.

    Przeszukiwanie łańcucha
    Do przeszukiwania łańcucha(wyszukiwania określonej wartości) służy instrukcja scasx. Występują trzy postaci tej instrukcji:
  • scasb - przeszukuj bajty. Jeśli al=es:[di] to znacznik ZF=1 i zmienia indeks di (di=di+kierunek).
  • scasw - przeszukuj słowa. Jeśli ax=es:[di] to znacznik ZF=1 i zmienia indeks di (di=di+2*kierunek).
  • scasd - przeszukuj podwójne słowa(only >=386). Jeśli eax=es:[di] to znacznik ZF=1 i zmienia indeks di (di=di+4*kierunek).

    <<

  • ©Copyright by zoomek 2001
    Wszelkie prawa zastrzeżone!