160
5. Rozkazy mikroprocesorów 8086/8088
[TllOOOlO disp
Liczba taktów -17 dla skoku wykonanego, 5 dla skoku nie wykonanego.
; suma będzie wAX ; stan początkowy wskaźnika ; ile zsumować elementów ; zsumuj kolejny element ; wskaż następny element ; powtórz jeśli CX^0
♦
MOV AX, 0 MOV SI, 0
MOV CX, LENGHT TABLICA PĘTLA: ADD AX, TABLICA[SI] ADD SI, TYPE TABLICA LOOP PĘTLA MOV SUMA, AX
LOOPE/LOOPZ (ang. loop if eÄ…ual/if zero )
powtórzenie sekwencji rozkazów jeśli rejestr CX^0 i jest równość, powtórzenie sekwencji rozkazów jeśli CX^0 i wartość równa zero
Operacja: CX<-CX-1; next (CF^O A ZF = 1) => IP^-IP + disp Znaczniki: bez zmian
Rozkaz powoduje zmiejszenic rejestru CX pełniącego rolę licznika o jeden, sprawdzenie czy CX ^0 i ZF = 1 i jeżeli tak, to przekazanie sterowania pod adres wynikający z dodania argumentu rozkazu LOOPE/LOOPZ (disp) do offsetu następnego po LOOP rozkazu. Gdy CX = 0 lub ZF = 0 nie jest wykonywana żadna operacja.
Liczba taktów - 18 dla skoku wykonanego, 6 dla skoku nie wykonanego.
; poszukiwanie w TABLICY elementu różnego od 2020H MOV CX, LENGHT TABLICA ; ile elementów przeszukać
MOV SI, -2 ; elementami są słowa
PĘTLA: INC SI ; następny element
INC SI
CMP TABLICA[SI], 2020H ; czy jest równy 2020H ?
LOOPE PĘTLA ; powtórz test
JNE JEST ROŻNY ; znaleziono różny od 2020H +
LOOPNE/LOOPNZ (ang. loop if not eÄ…ual/if not zero )
powtórznie sekwencji rozkazów jeśli rejestr CX^0 i nie ma równości, powtórzenie sekwencji rozkazów jeśli CX ^0 i wartość różna od zera
Operacja: CX«-CX-1; next (CF^O A ZF = 0) => IP«-IP + disp Znaczniki: bez zmian
Rozkaz powoduje zmiejszenie rejestru CX pełniącego rolę licznika o jeden, sprawdzenie czy CX^0 i ZF = 0 i jeżeli tak, to przekazanie sterowania pod adres
powered by
5.7. Rozkazy przerwań
wynikający z dodania argumentu rozkazu LOOPNE/LOOPNZ (disp) do offsetu następnego rozkazu po LOOP. Gdy CX = 0 lub ZF = 1 nie jest wykonywana żadna operacja.
1110 0000 disp
Liczba taktów - 19 dla skoku wykonanego, 5 dla skoku nie wykonanego.
; przepisanie TABLICY1 do TABLICY2 aż do napotkania zerowego bajtu MOV CX, LENGHT TABLICA 1 ; długość tablicy
MOV SI, -1 ; przepisywanie bajtami
PĘTLA:
M()V BL, TABLICA1[SI] MOV TABLICA2[S1], BL CMP BL, 0 LOOPNZ PĘTLA
INC SI ; następny bajt ; przepisz bajt
; czy zakończyć ?
JCXZ (ang.junip if CX is zero)
skok względny jeśli rejestr CX równy jest zero
Operacja: CX = 0 => IP«-IP + disp Znaczniki: bez zmian
Jeżeli CX = 0, to sterowanie jest przekazywane pod żądany adres, który nic może być odległy od offsetu następnego rozkazu o więcej niż -128 i +127. Jeżeli CX *0, to skok nie jest wykonywany i jest realizowany kolejny rozkaz w programie.
1110 0011 disp
Liczba taktów -18 dla skoku wykonanego, 6 dla skok nie wykonanego.
PĘTLA:
CMP AL,
JE JEST
LOOP PĘTLA
JEST: JCXZ KONIEC
Rozkazy przerwań pozwalają na przekazanie sterowania do podprogramów obsługi przerwań w taki sam sposób, jak w przypadku przerwań pochodzących od urządzeń zewnętrznych. Rozkazy przerwań