ROZDZIAL SIEDEMNASTY PRZERWANIA, INFORMATYKA, „THE ART OF ASSEMBLY LANGUAGE” [PL]
[ Pobierz całość w formacie PDF ]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
WYŁĄCZNOŚĆ DO PUBLIKOWANIA TEGO TŁUMACZENIA
POSIADA
RAG
„THE ART OF ASSEMBLY LANGUAGE”
tłumaczone by KREMIK
Konsultacje naukowe: NEKRO
wankenob@priv5.onet.pl
nekro@pf.pl
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ROZDZIAL SIEDEMNASTY:
PRZERWANIA, PRZERWANIA KONTROLOWANE I WYJATKI
Koncepcja przerwan jest czyms, co rozwijalo sie w ciagu lat. Rodzina 80x86 powiekszyla tylko
zamieszanie wokól przerwan poprzez wprowadzenie instrukcji int ( przerwania programowe). Istotnie, rózni
producenci uzywaja terminów takich jak wyjatki, bledy, zawieszenia, pulapki i przerwania do opisania zjawiska,
który omawia ten rozdzial. Niestety nie ma wyraznej jednomyslnosci, co do dokladnego znaczenia tych terminów.
Rózni autorzy róznie adoptuja te terminy na swój wlasny uzytek. Chociaz jest kuszace unikanie uzywania takich
naduzywanych generalnie terminów, dla celów tego omówienia byloby milo miec zbiór dobrze zdefiniowanych
terminów, jakie mozemy uzyc w tym rozdziale. Dlatego tez, wybierzemy trzy z powyzszych terminów, przerwania,
pulapki i wyjatki i je zdefiniujemy. Rozdzial ten spróbuje uzyc najpowszechniejszego znaczenia dla tych terminów,
ale nie bedzie niespodzianka, jesli znajdziemy inne teksty uzywajace ich w innych kontekstach.
W 80x86 sa trzy typy popularnie znane przerwania: pulapki, wyjatki i przerwania (przerwania sprzetowe).
Rozdziale ten bedzie opisywal kazda z tych form i opisze ich wsparcie dla CPU 80x86 i kompatybilne maszyny PC.
Chociaz terminy przerwanie kontrolowane i wyjatki sa czesto uzywane zamiennie, bedziemy uzywali
terminu przerwanie kontrolowane do oznaczania oczekiwania przekazania sterowania do specjalnego podprogramu
obslugi. Pod wieloma wzgledami przerwanie kontrolowane jest niczym wiecej niz. wywolanym wyspecjalizowanym
podprogramem. Wiele tekstów odnosi sie do przerwan kontrolowanych jako przerwan programowych. Instrukcja int
80x86 jest glównym narzedziem dla wykonania przerwania kontrolowanego. Zauwazmy, ze przerwania
kontrolowane sa zazwyczaj bezwarunkowe; to znaczy, kiedy wykonujemy instrukcje int, sterowanie zawsze jest
przekazywane do procedury powiazanej z przerwaniem kontrolowanym. Poniewaz przerwania kontrolowane
wykonuja sie przez wyrazne instrukcje, latwo jest okreslic dokladnie, które instrukcje w programie beda
wywolywaly podprogram obslugi przerwan kontrolowanych.
Wyjatek jest automatycznie generowana pulapka (wymuszenie zamiast prosby), która wystepuje w
odpowiedzi na warunek wyjatku. Generalnie, nie ma okreslonej powiazanej z wyjatkiem, zamiast tego wyjatek
wystepuje w odpowiedzi na niewlasciwe zachowanie wykonania zwyklego programu 80x86. Przyklady warunków,
które moga zglaszac (powodowac) wyjatki obejmuja wykonywanie instrukcji dzielenia przez zero, wykonywanie
niedozwolonych opcodów i bledy ochrony pamieci. Obojetnie, kiedy taki warunek wystapi, CPU natychmiast
zawiesza wykonywanie biezacej instrukcji i przekazuje sterowanie do podprogramu obslugi wyjatków. Ten
podprogram moze zdecydowac jak obsluzyc warunek wyjatku; moze próbowac naprawiac problem lub przerwac
program i wydrukowac wlasciwy komunikat bledu. Chociaz generalnie nie wykonujemy okreslonych instrukcji
powodujacych wyjatek, podobnie przerwan sprzetowych (pulapek), wykonywanie instrukcji jest czyms, co
powoduje wyjatki. Na przyklad, dostaniemy blad dzielenia, kiedy wykonujemy instrukcje dzielenia gdzies w
programie.
Przerwania sprzetowe, trzecia kategoria, do której bedziemy sie odnosic po prostu jako do przerwan, sa
przerwaniami sterowanymi opartymi na zewnetrznych zdarzeniach sprzetowych (zewnetrzne dla CPU) Generalnie te
przerwania nie maja nic do roboty z biezaco wykonywanymi instrukcjami; zamiast tego, niektóre zdarzenia, takie
jak nacisniecie klawisza na klawiaturze lub limit czasu na tajmerze chipa, informuja CPU, ze urzadzenie potrzebuje
jego uwagi, a potem zwraca sterowanie ponownie do programu.
Podprogram obslugi przerwan jest procedura napisana specjalnie do dzialania z pulapkami, wyjatkami i
przerwaniami. Chociaz rózne zjawiska powoduja pulapki, wyjatki i przerwania, struktura podprogramu obslugi
przerwan lub ISR jest w przyblizeniu taka sama dla kazdego z nich.
17.1 STRUKTURA PRZERWAN 80X86 I PODPROGRAM OBSLUGI PRZERWAN (ISR)
Pomimo róznych powodów wystapienia przerwan kontrolowanych, wyjatków i przerwan, dziela one
wspólny format dla swoich podprogramów obslugi. Oczywiscie, te podprogramy obslugi przerwan beda
wykonywaly rózne dzialania w zaleznosci od zródla wywolania., Ale jest calkiem mozliwe napisanie pojedynczego
podprogramu obslugi przerwan, który przetwarza przerwania kontrolowane, wyjatki i przerwania sprzetowe. Jest to
rzadko robione, ale struktura systemu przerwan 80x86 pozwala na to. Sekcja ta bedzie opisywala strukture przerwan
80x86 i to jak napisac podstawowy podprogram obslugi przerwan dla przerwan trybu rzeczywistego 80x86.
Chipy 80x86 pozwalaja na 256 wektorów przerwan. To znaczy, ze mamy do 256 róznych zródel przerwan,
a 80x86 bezposrednio wywola podprogram obslugi dla tego przerwania bez przetwarzania programowego.
Kontrastuje to z niewektorowymi przerwaniami, które przekazuja sterowanie bezposrednio do pojedynczego
podprogramu obslugi przerwan, bez wzgledu na zródlo przerwania.
80x86 dostarcza 256 wejsc do tablicy wektorów przerwan poczynajac od adresu 0:0 w pamieci. Jest to 1KB
tablica zawierajaca 256 4 bajtowych wejsc. Kazde wejscie w tej tablicy zawiera adres segmentowany, który
wskazuje podprogram obslugi przerwan w pamieci. Generalnie, bedziemy sie odnosili do przerwan poprzez ich
indeks w tej tablicy, tak wiec zerowy adres przerwania (wektor) jest w komórce pamieci 0: 0, wektorze przerwania
jeden jest pod adresem 0: 4, wektor przerwania dwa jest pod adresem 0: 8 itd.
Kiedy wystapi przerwanie, bez wzgledu na zródlo, 80x86 robi, co nastepuje?
1) CPU odklada rejestr flag na stos
2) CPU odklada daleki adres powrotny (segment: offset) na stos, najpierw wartosc segmentu
3) CPU okresla powód przerwania (tj. numer przerwania) i pobiera cztero bajtowy wektor przerwania spod
adresu 0: wektor*4
4) CPU przekazuje sterowanie do podprogramu okreslonego przez wejscie tablicy wektorów przerwan
Po ukończeniu tych kroków, sterownie ma podprogram obsługi przerwań. Kiedy podprogram obsługi przerwań chce
zwrócić sterowanie musi wykonać instrukcję iret (interrupt return – powrót z przerwania). Zdejmuje ona daleki
adres powrotny i flagi ze stosu. Zauważmy, że wykonanie dalekiego powrotu jest niewystarczające, ponieważ na
stosie pozostaną flagi.
Jest jedna ważna różnica pomiędzy tym jak 80x86 przetwarza przerwania sprzętowe a innymi typami
przerwań – na wejściu do podprogramu obsługi przerwań sprzętowych, 80x86 blokuje dalsze przerwania sprzętowe
przez wyzerowanie flagi przerwania. Przerwania kontrolowane i wyjątki nie robią tego. Jeśli chcemy odrzucić dalsze
przerwania sprzętowe wewnątrz procedury przerwania kontrolowanego lub wyjątku, musimy wyraźnie wyzerować
flagę przerwania instrukcją cli. Odwrotnie, jeśli chcemy zezwolić na przerwania wewnątrz podprogramu obsługi
przerwań sprzętowych, musimy wyraźnie włączyć ją ponownie instrukcją sti. Zauważmy, że na blokowanie flagi
przerwania 80x86 wpływa tylko przerwanie sprzętowe.. Wyzerowanie flagi przerwania nie będzie zapobiegało
wykonaniu przerwania kontrolowanego lub wyjątku.
ISR’y są napisane podobnie jak prawie każda inna procedura w języku asemblera z wyjątkiem tego, że
wracają one instrukcją iret a nie ret. Chociaż odległość procedury ISR (near kontra far) nie ma zazwyczaj znaczenia,
powinniśmy uczynić wszystkie procedury ISR far. Uczyni programowanie łatwiejszym, jeśli zdecydujemy się
wywołać ISR bezpośrednio zamiast używać normalnych mechanizmów procedur przerwania.
ISR’y wyjątków i przerwań sprzętowych mają bardzo specjalne ograniczenia: muszą zachować stan CPU.
W szczególności, te ISR’y muszą zachować wszystkie rejestry, które modyfikują. Rozważmy następujący
ekstremalnie prosty ISR:
SimpleISR
proc far
mov
ax, 0
iret
SimpleISR
endp
Ten ISR oczywiście nie zachowuje stanu maszynowego; wyraźnie narusza wartość w ax a potem zwraca z
przerwania. Przypuśćmy, że wykonaliśmy poniższy fragment kodu, kiedy przerwanie sprzętowe przekazało
sterowanie do powyższego ISR’a:
mov ax, 5
add ax, 2
;Przypuśćmy, że tu wystąpiło przerwanie
puti
-
-
-
Podprogram obsługi przerwań, ustawi rejestr ax na zero a nasz program wydrukuje zero zamiast wartości pięć.
Gorzej, przerwania sprzętowe są generalnie asynchroniczne, w znaczeniu, że mogą wystąpić w każdym czasie i
rzadko występują w tym samym miejscu programu. Dlatego też, powyższa sekwencja kodu drukowałaby siedem
większość czasu; inaczej będzie drukował zero lub dwa (będzie drukował dwa, jeśli przerwanie wystąpi pomiędzy
instrukcjami, mov ax, 5 a add ax, 2) Błędy w podprogramach obsługi przerwań sprzętowych są bardzo trudne do
odnalezienia, ponieważ takie błędy często wpływają na wykonywanie nie powiązanego kodu.
Rozwiązaniem tego problemu oczywiście jest upewnienie się, że zachowaliśmy wszystkie rejestry, jakich
używamy w podprogramie obsługi przerwań dla przerwań sprzętowych i wyjątków. Ponieważ pułapki są
wywoływane jasno, zasady zachowywania stanów maszynowych w takich programach są identyczne jak dla
procedur.
Napisanie ISR’a jest tylko pierwszym krokiem do implementacji programu obsługi przerwania. Musimy
również zainicjalizować wejście tablicy wektorów przerwań adresem naszego ISR’a. Są dwa popularne sposoby
wykonania tego – przechowanie adresu bezpośrednio w tablicy wektorów przerwań lub wywołanie DOS’a i
pozwolenie, aby DOS wykonał to za nas.
Przechowanie samego adresu jest łatwym zadaniem, Wszystko, co musimy zrobić to załadować rejestr
segmentowy zerem, (ponieważ tablica wektorów przerwań jest w segmencie zero) i przechować cztery bajty adresu
pod właściwym offsetem wewnątrz segmentu. Następująca sekwencja kodu inicjalizuje wejście do przerwania 255
adresem podprogramu SimpleISR przedstawionego wcześniej:
mov
ax, 0
mov
es, ax
pushf
cli
mov
word ptr es:[0ffh*4], offset SimpleISR
mov
word ptr es:[0ffh*4 +2], seg SimpleISR
popf
Odnotuj jak ten kod wyłącza przerwania podczas zmiany tablicy wektorów przerwań. Jest to ważne, jeśli
poprawiamy wektor przerwań sprzętowych, ponieważ nie robi tego dla przerwań występujących pomiędzy ostatnimi
dwoma powyższymi instrukcjami mov; w tym punkcie, wektor przerwań jest w wewnętrznie sprzecznym stanie i
wywołując przerwanie w tym punkcie przekażemy sterowanie do offsetu SimpleISR i segmentu poprzedniego
programu obsługi przerwania 0FFh. To oczywiście będzie katastrofa Instrukcje, które wyłączają przerwania
podczas poprawiania wektora są zbyteczne, jeśli poprawiamy adres programu obsługi pułapki lub wyjątku.
Być może lepszym sposobem inicjalizacji wektora przerwań jest użycie wywołania DOS’owskiego Zbioru
Wektorów Przerwań. Wywołanie DOS (zobacz „MS-DOS, PC-BIOS i I/O Plików) z ah równym 25h dostarcza tej
funkcji. To wywołanie oczekuje numeru przerwania w rejestrze al. I adresu podprogramu obsługi przerwań w ds:dx.
Wywołanie MS-DOS, które wykonuje tą samą rzecz jak powyższa to
mov
ax, 25ffh
;AH=25h, AL = 0FFh
mov
dx, seg SimpleISR
;£aduje DS:DX adresem ISR
mov
ds., dx
lea
dx, SimpleISR
int
21h
;Wywołanie DOS
mov
ax, dseg
;Przywrócenie DS, więc ponownie wskazuje DSEG
mov
ds., ax
Chociaż ta sekwencja kodu jest trochę bardziej złożona niż włożenie danych bezpośrednio do tablicy wektora
przerwań, jest bezpieczniejsza. Wiele programów monitoruje zmiany robione na tablicy wektorów przerwań przez
DOS., Jeśli wywołujemy DOS, który zmienia wejście tablicy wektora przerwań, programy te uświadomią sobie
swoje zmiany. Jeśli pominiemy DOS, programy te mogą nie odkryć, że poprawiono ich własne przerwania i mogą
nie działać.
Ogólnie, jest to bardzo zły pomysł poprawianie tablicy wektora przerwań i nie przywracanie oryginalnego
wejścia po zakończeniu naszego programu. Cóż programy zawsze zachowują poprzednią wartość wejścia tablicy
wektora przerwań i przywracają tą wartość przed zakończeniem. Poniższa sekwencja kodu demonstruje jak to
zrobić. Po pierwsze przez poprawianie tablicy bezpośrednio:
mov
ax, 0
mov
es, ax
;Zachowanie bieżącego wejścia w zmiennej dword IntVectSave:
mov
ax, es:[IntNumber*4]
mov
word ptr IntVectSave, ax
mov
ax, es:[IntVect*4 +2]
mov
word ptr IntVectSave+2, ax
;Poprawienie tablicy wektora przerwań adresem naszego ISR’a
pushf
;wymagane, jeśli jest to przerwanie hw
cli
; „ „ „ „ „ „ „ „
mov
word ptr es:[IntNumber*4], offset OurISR
mov
word ptr es:[IntNumber*4+2], seg OurISR
popf
;wymagane jeśli jest to przerwania hw
-
-
-
;Przywrócenie wejścia wektora przerwań przed opuszczeniem:
mov
ax, 0
mov
es, ax
pushf
;wymagane, jeśli jest to przerwanie hw
cli
;” „ „ „ „ „
mov
ax, word ptr IntVectSave
mov
es:[IntNumber*4[, ax
mov
ax, word ptr IntVectSave+2
mov
es:[IntNumber*4+2], ax
popf
;wymagane, jeśli jest to przerwania hw
-
-
-
Jeśli wolelibyśmy wywołanie DOS do zachowania i przywrócenia wejścia tablicy wektora przerwań, możemy
uzyskać adres istniejącego wejścia tablicy przerwań używając wywołania DOS Pobranie Wektora Przerwań.
Wywołanie to z ah = 35h, oczekuje numeru przerwania w al.; zwraca istniejący wektor dla tego przerwania w
rejestrach es:bx. Próbka kodu, który zachowuje wektor przerwań używając DOS to
;Zachowanie bieżącego wejścia w zmiennej dword IntVectSave:
mov
ax, 3500h + IntNumber
;AH=35h, AL = Int #
int
21h
mov
word ptr IntVectSave, bx
mov
word ptr IntVectSave+2, es
;Poprawa tablicy wektora przerwań adresem naszego ISR’a
mov
dx, seg OurISR
mov
ds, dx
lea
dx, OurISR
mov
ax, 2500h + IntNumber
;AH=25, AL=Int #
int
21h
-
-
-
;Przywrócenie wejścia wektora przerwań przed opuszczeniem:
lds
bx, IntVectSave
mov
ax, 2500h+IntNumber
;AH=25, AL=Int #
int
21h
-
-
-
17.2 PRZERWANIA KONTROLOWANE
Przerwanie kontrolowane jest przerwaniem wywoływanym programowo. Wykonując przerwanie
kontrolowane używamy instrukcji int 80x86 (przerwanie programowe). Są tylko dwie podstawowe różnice
pomiędzy przerwaniem kontrolowanym a dowolnym wywołaniem procedury far: instrukcja, jakiej używamy do
wywołania podprogramu (int kontra call) i fakt, że przerwanie kontrolowane odkłada flagi na stos, więc musimy
użyć instrukcji iret do powrotu z niej. W przeciwnym razie, rzeczywiście nie ma różnicy pomiędzy kodem programu
obsługi przerwania kontrolowanego a ciałem typowej procedury far.
Głównym celem przerwania kontrolowanego jest dostarczenie stałego podprogramu, który różne programy
mogą wywoływać bez znajomości aktualnego adresu i czasu wykonania. MS-DOS jest doskonałym przykładem.
Instrukcja int 21h jest przykładem wywołania przerwania kontrolowanego Nasze programy nie muszą znać
aktualnego adresu pamięci punktu wejścia DOS’a do wywołania DOS. Zamiast tego, DOS poprawia wektor
przerwanie 21h kiedy ładuje go do pamięci.Kiedy wykonujemy int 21h, 80x86 automatycznie przekazuje
sterowanie do punktu wejścia DOS gdziekolwiek w pamięci się to wydarzy.
Jest duża lista podprogramów wspierających, które używają mechanizmu przerwań kontrolowanych do
połączenia aplikacji z nią samą. DOS, BIOS, sterownik myszy i Netware oto kilka przykładów. Ogólnie, używamy
przerwań kontrolowanych do wywołania funkcji rezydentnych. Programy rezydentne ładują się same do pamięci i
pozostają w pamięci dopóki się nie zakończą Poprze poprawę wektora przerwań wskazujemy podprogram wewnątrz
kodu rezydentnego, inne programy, które działają po zakończeniu programu rezydentnego mogą wywołać
rezydentne podprogramy poprzez wykonanie właściwej instrukcji int.
Większość programów rezydentnych nie używa oddzielnych wejść do wektorów przerwań dla każdej
funkcji jaką dostarczają. Zamiast tego, zazwyczaj poprawiają pojedynczy wektor przerwań i przekazują sterowanie
do właściwego podprogramu używając numeru funkcji, który kod wywołujący przekazuje w rejestrze Poprzez
konwencję większość programów rezydentnych oczekuje numeru funkcji w rejestrze ah typowy podprogram
obsługi przerwań kontrolowanych. Typowy podprogram obsługi przerwań kontrolowanych będzie wykonywał
instrukcję wyboru na wartości z rejestru ah i przekaże sterowanie do właściwego podprogramu obsługi funkcji.
Ponieważ program obsługi przerwań kontrolowanych są praktycznie identyczne z procedurami far pod
względem zastosowania, nie będziemy tu omawiać przerwań kontrolowanych bardziej szczegółowo. Jednakże, tekst
tego rozdziału będzie zgłębiał ten temat bardziej, kiedy omawiać będzie programy rezydentne.
[ Pobierz całość w formacie PDF ]
-
Linki
- Home
- Psych.9 - Psych 9 (2010) BRRip.XviD.x264.NAPiSY PL, sporo filmów do ściągnięcia
- Psych.9 - Psych 9 (2010) BRRip.XviD.NAPiSY PL, sporo filmów do ściągnięcia
- RED - Red (2010) BDRip.XviD.Napisy PL 3, sporo filmów do ściągnięcia
- RED - Red (2010) BDRip.XviD.Napisy PL, sporo filmów do ściągnięcia
- RED - Red (2010) BDRip.XviD.Napisy PL 2, sporo filmów do ściągnięcia
- Rambo-First.Blood.Part.II[1985]DvDrip-aXXo.pl, ● Filmy ●, -Rambo- kolekcja
- Radical 2017 PL, WĘDKARSTWO, Dokumenty wędkarskie PDF i KATALOGI
- Resident Evil Degeneration 2008 napisy PL, napisy do filmow
- Rambo.III[1988]DvDrip-aXXo.pl, ● Filmy ●, -Rambo- kolekcja
- Regulamin GOT PTTK - od 1 stycznia 2014..compressed(1), 0000 FOLDER NR 1 MATERIAŁY PDF POJEDYŃCZO
- zanotowane.pl
- doc.pisz.pl
- pdf.pisz.pl
- streamer.htw.pl