142
5. Rozkazy mikroprocesorów 8086/8088
MOV AL,
STD ; DF«-1 SCASB JE STOP
CMPS/CMPSB/CMPSW (ang. compare byte or word string) porównanie bajtu lub słowa dwóch łańcuchów (tablic, bloków)
Operacja: {w = 0 =» (delta: = 1; argumenty są bajtami)
else (delta: =2; argumenty są słowami); next M[DS:SI]-M[ES:DI];
next DF = 0 => (DI «-DI + delta; SI «-SI + delta) else (DI «-DI-delta; SI «-SI-delta)
Znaczniki: OF DF IF TF SF ZF AF PF CF
x---xxxxx
Rozkaz powoduje odjęcie elementu łańcucha (bajtu lub słowa) adresowanego przez rejestry ES:DI od odpowiedniego elementu łańcucha adresowanego przez rejestry DS.SI. Wynik nie jest zapamiętywany, jedynie są ustawiane znaczniki. Po wykonaniu operacji porównania rejestry DI oraz SI są zwiększane (DF = 0) lub zmniejszane (DF=1) o jeden (w = 0) lub o dwa (w=l). Użycie mnemoniki CMPS powoduje, że asembler określa na podstawie atrybutów argumentów, czy mają być porównywane bajty łańcuchów czy słowa i na tej podstawie generuje właściwy kod wynikowy. Można użyć mnemoniki CMPSB lub CMPSW, która określa czy mają być porównane bajty (CMPSB) czy słowa (CMPSW) (zob. też REPZ/PERE i REPNZ/REPNE). j
1010 Oliw
Liczba taktów - 22 dla operacji jednokrotnej.
Przykłady
MO V AX, SEG TABLICA J "J
MO V DS, AX
MOV ES, AX
Argumenty w ostatnim rozkazie CMPS służą wyłącznie do określenia typu porównywanych elementów łańcuchów, można w tym miejscu napisać CMPSB lub CMPSW.
5.4.2. Przedrostki deklarujące powtórzenia
REP (ang. repeat string operation)
powtarzanie operacji łańcuchowej (przedrosteka)___
Operacja: CX*0 => ({wykonaj MOVS lub STOS}; next CX«-CX-l;next IP<-IP-1 Znaczniki: bez zmian
5.4. Rozkazy przetwarzające łańcuchy (rozkazy l
Przedrostek REP jest kojarzony z rozkazami łańcuchowe MOVS i STOS i pozwala na wielokrotne wykonywanie tych rozkazów (pętla sprzętowa). Krotność wykonywania rozkazu jest określona zawartością licznika Cx, który jest każdorazowo zmniejszany o jeden. Wykonywanie rozkazu kończy się z chwilą wyzerowania licznika. Wielokrotne wykonywanie rozkazu łańcuchowego może być wstrzymane przez przerwanie. Wykonanie rozkazu jest kontynuowane po powrocie z procedury obsługi przerwania, procesor odtwarza jedynie jeden przedrostek. Jeżeli w operacji łańcuchowej potrzeba użyć dodatkowych przedrostków (np. segmentu, LOCK), to na czas wykonywania tej operacji należy zablokować system przerwań.
REP MOVS - przepisanie w pamięci łańcucha (tablicy, bloku);
REP STOS - wypełnienie łańcucha (tablicy, bloku) wzorcem umieszczonym w akumulatorze (AX lub AL).
REP LODS, REP SCAS, REP CMPS - są możliwe, aczkolwiek bez sensu
1111001x
x - bit nieistotny Liczba taktów - 2.
Przykłady
MO V AX, 0
MO V DI, OFFSET TABLICA MOV CX, LENGHT TABLICA
REP STOSW ; wyzerowanie tablicy ♦
REPE/REPZ (ang. repeat string operation if eÄ…ual/zero )
powtarzanie operacji łańcuchowej dopóki jest równość lub jest zero__
Operacja: CX *0 => ({wykonaj SCAS lub CMPS}; next CX«-CX-1; next ZF = 0 => IP+-IP-1)
Znaczniki: bez zmian
REPE/REPZ są to równoważne przedrostki dla operacji łańcuchowych SCAS i CMPS. Rozkazy te wykonywane są wielokrotnie tak długo, jak długo licznik CX *0 (zob. komentarz do REP) oraz dodatkowo znacznik ZF = 1, czyli równość lub wartość jest równa zero. Znacznik ZF nie musi być inicjowany, bowiem jego testowanie odbywa się dopiero po wykonaniu pojedynczej operacji.
REPE SCAS, REPZ SCAS - porównywanie zawartości akumulatora (AX lub AL) 2 elementami łańcucha dopóki wartości są równe;
REPE CMPS, REPZ CMPS - porównywanie dwóch łańcuchów dopóki kolejne odpowiadające sobie ich elementy są równe.
Liczba taktów - 2.