194
7. Wybrane techniki programowania
WEKTOR_P 32 EQU STOS
WORD PTR ES:32*4 SEGMENT STACK
• ••
STOS ENDS
DANE SEGMENT
• • •
DANE
PROGRAM GŁÓWNY
PROGRAM GŁÓWNY PODPR PRZERWAŃ PODPR NMI
PODPR PRZERWAŃ
ENDS SEGMENT MOV AX,0 MOV ES,AX
MOV WEKTORNMI, OFFSET PODPR NMI MOV WEKTOR_P_4, OFFSET PODPR P 4 MOV WEKTORP32, OFFSET PODPR P_32 ; ciąg dalszy programu głównego ; jak w poprzednim przykładzie
ENDS SEGMENT PROC FAR
; segment podprogramów obsługi przerwań jak ; w poprzednim przykładzie
ENDS
Mikroprocesory 8086/8088, w porównaniu do swych 8-bitowych poprzedników, mają rozbudowaną grupę rozkazów umożliwiających proste, a przede wszystkim szybkie przetwarzanie łańcuchów, tablic i innych struktur danych w postaci ciągłego obszaru pamięci. Rozkazy te opisano szczegółowo w p. 5.4. Działają one podobnie jak rozkazy blokowe w mikroprocesorze Z80 (zob. np. [8]), chociaż ich koncepcja jest nieco odmienna. Stosowanie rozkazów transmisji łańcuchowych skraca czas operacji dzięki temu, iż rozkaz do wykonania jest pobrany jednokrotnie niezależnie od wielkości przetwarzanego łańcucha. Rozwiązanie klasyczne w postaci pętli wymaga wielokrotnego, zależnie od liczby przetwarzanych bajtów, pobierania odpowiedniego rozkazu.
Przykład
; program przesyła tablicę bajtów TAB1 do TAB 2 (w klasycznej pętli) i nie ; wykorzystuje rozkazów transmisji blokowych
; źródło adresowane przez rejestr SI ; przeznaczenie przez rejestr Dl ; następny element
; powtórz dla następnego elementu
PĘTLA: MOV AL, TAB J[SI]
MOV TAB 2[DI], AL INC SI INC DI
LOOP PĘTLA
; w powyższym programie przesłanie każdego bajtu jest związane z pobraniem 5
powered by
7.3. Przetwarzanie łańcuchów (tablic)
kodów rozkazów (fetch) do jednokrotnego wykonania pętli
to samo można zrealizować jednym rozkazem łańcuchowym z przedrostkiem
(jednokrotne pobranie kodu jednego rozkazu i przedrostka
dla operacji przesłania całej tablicy)
REP MOVS TAB_2, TAB 1 +
Schemat blokowy realizacji tego rozkazu przedstawiono na rys. 5.3, w p. 5.4 przedstawiono natomiast ogólne założenia i reguły operacji łańcuchowych rejestrów DI. SI, DS, ES oraz znacznika DF. Operacje łańcuchowe mogą być realizowane na bajtach lub słowach. Aby asembler mógł wygenerować właściwy kod rozkazu, musi znać typ przetwarzanego łańcucha, który można zadeklarować.
Przykłady
• Deklaracja przez podanie argumentu rozkazu łańcuchowego, którego typ został zdefiniowany dyrektywą DB lub DW.
TAB 1 DB 100 DUP (?)
TAB 2 DB 200 DUP (?)
• Deklaracja przez określenie typu, operatorem PTR.
MOVS BYTE PTR ES:[DI], DS:[SI] ♦
• Deklaracja przez zastosowanie właściwej mnemoniki rozkazu.
MOVSB - dla bajtów
W tym ostatnim przypadku nie należy dopisywać żadnych argumentów, które są określone jednoznacznie zawartością rejestrów DS:SI oraz ES:DI. Poniżej Czytelnik znajdzie kilka przykładów typowego wykorzystania rozkazów łańcuchowych.
•Przepisanie zawartości TAB 1 do TAB 2 (rys. 7.7) można zrealizować sekwencją rozkazów
MOV CX, 300 MOV SI, SEG TAB 1 MOV DS, SI
MOV SI, OFFSET TAB 1 MOV DI, SEG TAB 2 MOV ES, DI
MOV DI, OFFSET TAB 2 CLD
REP MOYSB
; liczba bajtów do przesłania ; adres źródła
; adres przeznaczenia
; od niejszych do większych adresów
♦