| STATYSTYKI |
Od 06.09.2000
|
Optymalizacja: 1024x768, IE5 |
|
| 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.
| Relacja | Skok dla liczb bez znaku | Skok dla liczb ze znakiem |
| ds:[si]=es:[di] | je | je |
| ds:[si]>es:[di] | ja | jg |
| ds:[si]<es:[di] | jb | jl |
| ds:[si]>=es:[di] | jae | jge |
| ds:[si]<=es:[di] | jbe | jle |
| ds:[si]<>es:[di] | jne | jne |
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).
<<
|
|