510 likes | 734 Views
Systemy operacyjne. Wykład 4 Implementacja systemu przerwań. dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz. Schemat obsługi przerwania. Procesor ( SO ). Sterownik Urządzenia. Urządzenie. Rejestr stanu. Rejestr sterownika.
E N D
Systemy operacyjne Wykład 4 Implementacja systemu przerwań dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznychi Informatyki http://wbieniec.kis.p.lodz.pl/pwsz
Schemat obsługi przerwania Procesor (SO) Sterownik Urządzenia Urządzenie Rejestr stanu Rejestr sterownika Rejestr danych Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań Program użytkownika żąda od systemu operacyjnego wykonania operacji pobrania danych z urządzenia wejściowego. procedura obsł. przerw. 2 Bufor danych
Schemat obsługi przerwania Procesor (SO) Sterownik Urządzenia Urządzenie Rejestr stanu Rejestr sterownika Rejestr danych Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań System operacyjny sprawdza, czy urządzenie jest gotowe do transmisji badając zawartość rejestru stanu. procedura obsł. przerw. 2 Bufor danych
Schemat obsługi przerwania Procesor (SO) Sterownik Urządzenia Urządzenie Rejestr stanu Rejestr sterownika Rejestr danych Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań System operacyjny programuje sterownik urządzenia wpisując odpowiedni rozkaz do jego rejestru sterowania. procedura obsł. przerw. 2 Bufor danych
Schemat obsługi przerwania Procesor (PU) Sterownik Urządzenia Urządzenie Rejestr stanu Rejestr sterownika Rejestr danych Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań System operacyjny oddaje procesor procesowi użytkownika. procedura obsł. przerw. 2 W tym samym czasie sterownik nadzoruje pracę urządzenia, bez interwencji procesora. Bufor danych
Schemat obsługi przerwania IRQ Procesor (SO) Sterownik Urządzenia Urządzenie Rejestr stanu Rejestr sterownika Rejestr danych Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań Kończy się proces transmisji, odebrana informacja jest umieszczona w rejestrze danych sterownika. W rejestrze stanu sterownik ustawia flagę oznaczającą zakończenie komunikacji, a następnie zgłasza przerwanie. procedura obsł. przerw. 2 Bufor danych Powoduje to automatyczne zapamiętanie bieżącego stanu procesora i adresu powrotu oraz przekazanie sterowania do systemu operacyjnego.
Schemat obsługi przerwania Procesor (SO) Sterownik Urządzenia Urządzenie Rejestr stanu Rejestr sterownika Rejestr danych Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań Następuje identyfikacja źródła przerwania dzięki wektorowemu systemowi przerwań. Z tablicy wektorów przerwań pobierany jest adres procedury obsługi tego przerwania. procedura obsł. przerw. 2 Bufor danych
Schemat obsługi przerwania Procesor (SO) Sterownik Urządzenia Urządzenie Rejestr stanu Rejestr sterownika Rejestr danych Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań Sterowanie zostaje przekazane do procedury obsługi przerwania. procedura obsł. przerw. 2 Bufor danych
Schemat obsługi przerwania Procesor (SO) Sterownik Urządzenia Urządzenie Rejestr stanu Rejestr sterownika Rejestr danych Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań Podprogram obsługi przerwania kopiuje zawartość rejestru danych sterownika do bufora w pamięci i kończy swoją pracę. procedura obsł. przerw. 2 Procesor wraca do przerwanego zadania. Bufor danych
Wektorowy system przerwań System ten wymaga programowalnego kontrolera przerwań PIC, połączonego z procesorem. Jeśli urządzenie peryferyjne zgłosi przerwanie, to kontroler je identyfikuje i przekazuje jego numer procesorowi. Numer ten jest indeksem w tablicy wektorów przerwań (ang. IVT). Wartościami tej tablicy są adresy procedur obsługi przerwań. Każde przerwanie może więc mieć własną procedurę obsługi. Tablica ta umieszczana jest zazwyczaj na początku pamięci operacyjnej komputera i wraz z procedurami obsługi przerwań stanowi część systemu operacyjnego.
Kontekst procesora Problemem jest zapamiętanie kontekstu procesora, aby mógł on wrócić do zadania które realizował przed wystąpieniem przerwania. Kontekst procesora - adres w pamięci operacyjnej spod którego ma być pobrany następny, po zakończeniu procedury obsługi przerwania rozkaz do realizacji (tzw. adres powrotu) oraz stan rejestrów procesora. Najmniejszy kontekst obejmuje adres powrotu i rejestr stanu maszyny (dla x86 jest to rejestr flag). Najczęściej kontekst pamiętany jest na stosie.
Konflikt przerwań Możemy różnie rozwiązywać sytuację równoczesnego zgłoszenia dwóch lub większej ilości przerwań. Najprostsze rozwiązanie: wyłączenie systemu przerwań na czas realizacji procedury i ponowne włączenie po jej zakończeniu. Systemy priorytetowe pozwalają na selektywne wyłączanie przerwań o niższym priorytecie nazywane maskowaniem. Możliwe jest również odkładanie na później ich realizacji. We współczesnych systemach operacyjnych, celem zminimalizowania czasu, kiedy określona grupa przerwań lub wszystkie przerwania są wyłączone, procedury obsługi przerwań są podzielone na dwie części zwane połówkami. Górna połówka jest procedurą, która jest wykonywana po otrzymaniu przerwania. Jej działanie jest krótkie i najczęściej sprowadza się do potwierdzenia odebrania przerwania i uruchomienia dolnej połówki. Dolna połówka wykonuje te czynności obsługi przerwania, które są czasochłonne.
Kolejka przerwań Często urządzenie wejścia / wyjścia nie jest wstanie obsłużyć szybko otrzymywanych zleceń. Najczęstszym rozwiązaniem jest zastosowanie tablicy stanów urządzeń. Jest ona umieszczona w pamięci operacyjnej komputera i zawiera odwzorowane rejestry stanu urządzeń peryferyjnych. Jeśli urządzenie jest zajęte realizacją jakiegoś żądania, to następne zlecenia dla tego urządzenia są umieszczane w kolejce, gdzie czekają na realizację. W czasie, gdy obsługa przerwania przedłuża się, proces czeka na jej zakończenie blokując procesor. Systemy wielozadaniowe umożliwiają użycie mechanizmu wait/notify, aby przełączyć w tym czasie procesor na inny proces.
Odwołania do systemu operacyjnego Tylko system operacyjny może wykonywać operacje I/O Proces użytkownika chce komunikować się ze światem zewnętrznym Proces użytkownika może wykonać rozkaz INT, który umożliwia zażądanie od systemu operacyjnego wykonania wymaganych przez nie operacji. Ten rozkaz jest nazywany przerwaniem programowym, ponieważ powoduje przełączenie procesora w tryb monitora, oraz wykonanie odpowiedniej procedury obsługi przerwania. Ta procedura odpowiedzialna jest za zaprogramowanie sterownika odpowiedniego urządzenia. Nazywana jest ona wywołaniem systemowym (ang. system call) lub funkcją systemową. Proces użytkownika może przekazać jej pewne argumenty.
Wywołania systemowe Wywołania systemowe są bezpośrednio dostępne dla programistów piszących aplikacje w języku asemblerowym. Niektóre wersje języków wysokiego poziomu (np. C) pozwalają bezpośrednio ich użyć. Częściej jednak mamy do czynienia z pośrednim wywołaniem funkcji systemowych. Języki wysokiego poziomu dostarczają bibliotek podprogramów, które stanowią opakowania na wywołania systemowe (np. funkcja printf() w języku C).
Argumenty wywołań systemowych Podobnie jak zwykłe podprogramy, wywołania systemowe mogą wymagać pewnych argumentów wywołania. Te argumenty mogą być przekazywane na trzy różne sposoby: przez rejestry; przez stos; przez pamięć – adres początku obszaru pamięci, gdzie zapisane są argumenty, umieszczany jest w rejestrach.
Kategorie wywołań systemowych Nadzór nad procesami – tworzenie nowych procesów; – ładowanie do pamięci programów użytkownika; – kończenie działania procesu; – debugowanie; – profilowanie działania procesu; – zawieszanie działania procesu; – synchronizacja procesów. Operacje na plikach – tworzenie; – otwieranie i zamykanie plików; – odczyt; – zapis; – zmiana pozycji wskaźnika pliku.
Kategorie wywołań systemowych Urządzenia wejścia / wyjścia Wiele systemów operacyjnych, łączy system zarządzania urządzeniami zewnętrznymi z systemem plików, dlatego te same wywołania, które służą do obsługi plików są także używane do obsługi urządzeń wejścia - wyjścia. Niektóre funkcje systemowe z tej grupy mogą być specyficzne jedynie dla urządzeń. Utrzymywanie informacji Najprostszymi przykładami wywołań należących do tej kategorii są wywołania pozwalające pobrać bieżący czas i datę. Bardziej skomplikowane pozwalają poznać wszelkie informacje statystyczne związane z systemem, jak: ilość wolnego miejsca na dysku, ilość dostępnej pamięci operacyjnej, liczba użytkowników, itp.
Kategorie wywołań systemowych Komunikacja między procesami W przypadku komunikacji przez sieć lub łącza logiczne muszą istnieć wywołania pozwalające utworzyć połączenie, nadać i odebrać komunikat oraz zamknąć połączenie. W przypadku komunikacji przez pamięć musi istnieć funkcja systemowa pozwalająca zażądać od systemu operacyjnego obszaru pamięci, który będzie współdzielony przez dwa lub większą liczbę procesów równocześnie.
Przerwania w systemie MS-DOS BIOS = Basic Input/Output System Zadaniem BIOS-u jest odizolowanie systemu operacyjnego od bezpośredniej obsługi sprzętu (hardware), co umożliwia wymianę i doskonalenie urządzeń bez zmian metod posługiwania się nimi. BIOS zawiera procedury obsługi podstawowych części składowych komputera, a także procedury inicjujące ten system po włączeniu zasilania i ładujące system operacyjny z pamięci masowej.
Przerwania w systemie MS-DOS System operacyjny DOS i programy użytkowe mogą żądać od systemu BIOS wykonania operacji przez wykonanie instrukcji przerwania programowego (INT). Poszczególne części BIOS obsługujące różne urządzenia mają przydzielone oddzielne numery przerwań. W systemie DOS występują cztery źródła przerwań. – Przerwanie niemaskowalne (błąd parzystości, błąd sygnalizowany przez kartę rozszerzającą lub koprocesor arytmetyczny). – Przerwania sprzętowe (pochodzą od urządzeń wejścia-wyjścia znajdujących się na płycie głównej lub karcie rozszerzającej). – Przerwania generowane przez procesor (tzw. wyjątki, np. wykrycie dzielenia przez zero). – Przerwania programowe (są wynikiem wykonania instrukcji INT).
Przerwania w MS-DOS Priorytety W jednej chwili może zgłosić kilka urządzeń żądanie o przerwanie, a procesor w danej chwili może obsłużyć tylko jedno z nich. Każdemu przerwaniu sprzętowemu przyporządkowano pewien numer (priorytet). Numer ten mówi, w jakiej kolejności należy wykonywać przerwania Przerwanie o najwyższym priorytecie (IRQ0) ma numer 8 i jest to przerwanie zegarowe. Jeśli w tej samej chwili klawiatura i zegar zgłoszą żądanie o przerwanie, procesor najpierw wykona przerwanie zegarowe, ponieważ ma większy priorytet (0), a dopiero później przerwanie klawiatury (priorytet 1).
Wektor przerwań W procesorach x86 adresy przerwań przechowywane są w tzw. tablicy wektorów przerwań. Tablica ta ma 256 pozycji i zajmuje 1024 bajty pamięci i rozpoczyna się od adresu 0000:0000, czyli na samym początku pamięci komputera. Adresy procedur przerwań są 32-bitowe – w dwóch pierwszych bajtach zapisany jest offset, a w następnych dwóch segment. Do szybkiego znajdywania adresu przerwania można posłużyć się wzorem: offset = 4*NR segment = 4*NR + 2 gdzie NR jest numerem przerwania. Np. offset przerwania 5 zapisany jest pod adresem 0000:0014H, a segment pod adresem 0000:0016H.
Przerwania programowe Przerwania programowe są generowane przez program przy użyciu instrukcji INT Z przerwań programowych możemy korzystać na trzy sposoby Wymuszenie generacji przerwania o podanym adresie - np. funkcją INT nr_przerwania Przerwanie jest obsługiwane w standardowy sposób Zmianę standardowego programu obsługi przerwania używanego przez system (np. przerwania 1CH generowanego przez zegar systemowy). Można to osiągnąć pisząc własną funkcję obsługi przerwania. Można wykorzystać jeden z wolnych numerów przerwań (np. od F1H do FFH) i przyporządkować mu własną funkcję obsługi. W praktyce przerwania programowe stosuje się najczęściej do wykonywania operacji wejścia-wyjścia oraz pewnych operacji systemowych (np.: przydzielanie pamięci, ustawianie/pobieranie czasu itp.)
Przykład – zmiana adresu przerwania Zmień adres przerwania zegarowego 1CH, tak aby wskazywał na procedurę, zakładając, zaczyna się ona etykietą PRZERWANIE CLI MOV AX,0 MOV ES:AX MOV ES:70H,OFFSET PRZERWANIE MOV ES:72H,SEG PRZERWANIE STI Można również to uczynić za pomocą przerwania 21H i funkcji 25H. W rejestrze AL podajemy numer przerwania, natomiast adres przekazujemy w DS:DX. MOV AX,SEG PRZERWANIE MOV DS,AX MOV DX,OFFSET PRZERWANIE MOV AL,01CH MOV AH,25H INT 21H
Funkcje DOS Niektóre przerwania podzielone są na podfunkcje np. 10H czy 21H. Jeżeli chcemy wywołać jakąś funkcję systemową to w rejestrze AH umieszczamy numer funkcji i wywołujemy określone przerwanie. Standardowe znakowe wejście/wyjście 01h - Czytanie znaku z echem 02h - Wypisywanie znaku 03h - Czytanie znaku z urządzenia dodatkowego 04h - Wypisywanie znaku do urządzenia dodatkowego 05h - Drukowanie znaku 06h - Bezpośrednie korzystanie z konsoli 07h - Bezpośrednie czytanie z konsoli 08h - Czytanie znaku 09h - Wypisywanie tekstu 0Ah - Czytanie wiersza z klawiatury 0Bh - Sprawdzanie stanu klawiatury 0Ch - Opróżnianie bufora klawiatury
Funkcje DOS Gospodarka pamięcią operacyjną 48h - Przydział pamięci 49h - Zwalnianie pamięci 4Ah - Zmiana wielkości przydzielonej pamięci 58h - Ustaw/Pobierz strategię przydziału pamięci Zarządzanie procesami 31h - Usypianie procesu 4B00h - Ładowanie i uruchamianie programu 4B03h - Ładowanie nakładki 4Ch - Kończenie procesu 4Dh - Pobieranie kodu powrotu procesu potomnego 62h - Pobieranie adresu PSP
Funkcje DOS Operacje na plikach używających dojść 3Ch - Tworzenie dojścia 3Dh - Otwieranie dojścia 3Eh - Zamykanie dojścia 3Fh - Czytanie przez dojście 40h - Pisanie przez dojście 42h - Ustawianie wskaźnika w pliku 45h - Kopiowanie dojścia 46h - Zmiana dojścia 5Ah - Tworzenie pliku roboczego 5Bh - Tworzenie nowego pliku 67h - Ustawienie maksymalnej liczby otwartych dojść 68h - Stabilizowanie pliku 6Ch - Rozszerzone otwieranie dojścia
Funkcje DOS Nadzorowanie pracy urządzeń 4400h - Pytanie o opis urządzenia 4401h - Ustalanie opisu urządzenia 4402h - Wysyłanie polecenia do urządzenia znakowego 4403h - Odbieranie informacji od urządzenia znakowego 4404h - Wysyłanie polecania do urządzenia blokowego 4405h - Odbieranie informacji od urządzenia blokowego 4406h - Pytanie o stan urządzenia wejściowego 4407h - Pytanie o stan urządzenia wyjściowego 4408h - Pytanie, czy urządzenie ma wymienny nośnik 440Bh - Ustalanie liczby nawrotów 440Ch - Ustalanie matrycy znaków urządzeń 440Dh - Ogólna kontrola urządzeń blokowych 440Eh - Pobierz mapę urządzenia 440Fh - Ustaw mapę urządzenia
Funkcje DOS Działania na katalogach 39h - Tworzenie katalogu 3Ah - Usuwanie katalogu 3Bh - Ustalanie katalogu bieżącego 41h - Usuwanie pozycji z katalogu 43h - Sprawdzanie lub zmiana atrybutów pliku 47h - Pytanie o katalog bieżący 4Eh - Znajdowanie pierwszego pliku w katalogu 4Fh - Znajdowanie następnego pliku katalogu 56h - Zmiana pozycji w katalogu 57h - Sprawdzanie lub zmiana daty i czasu modyfikacji pliku Funkcje sieciowe 4409h - Pytanie, czy urządzenie blokowe jest dostępne przez sieć 440Ah - Pytanie, czy plik lub urządzenie są dostępne przez sieć 5E00h - Pytanie o nazwę stanowiska roboczego 5E02h - Ustalanie znaków sterujących drukarką 5F02h - Pytanie o pozycję listy przypisań 5F03h - Dodanie pozycji do listy przypisań 5F04h - Usuwanie pozycji z listy przypisań
Funkcje DOS INNE FUNKCJE SYSTEMOWE 0Dh - Stabilizowanie stanu dysków 0Eh - Ustalanie dysku bieżącego 19h - Pytanie o dysk bieżący 1Ah - Ustalanie buforu roboczego 1Bh - Pytanie o charakterystykę dysku roboczego 1Ch - Pytanie o charakterystykę urządzenia blokowego 25h - Ustalanie adresu kodu obsługi przerwania 2Ah - Pytanie o datę 2Bh - Ustalanie daty 2Ch - Pytanie o czas 2Dh - Ustalanie czasu 30h - Pytanie o numer wersji systemu 33h - Pytanie wrażliwości na znak Control-C lub jej ustalenie 35h - Pytanie o adres kodu obsługi przerwania 36h - Pytanie o rozmiar wolnego obszaru na dysku 38h - Pytanie o kod kraju lub ustalenie tego kodu 54h - Pytanie o stan sygnalizacji weryfikacji 59h - Pytanie o pełny kod błędu 65h - Pobierz rozszerzone informacje o kraju 66h - Ustal/Pobierz globalną matrycę znaków
Przerwania maskowalne i niemaskowalne Istnieją dwa rodzaje przerwań sprzętowych: maskowalne to jest takie, które mogą być przekazane do procesora, niemaskowalneNMI (Non MaskableInterrupt), które muszą być przekazywane do procesora zawsze. NMI generowane jest w sytuacjach krytycznych (gdyż ma najwyższy priorytet) np. przy błędzie parzystości. Tablica wektorów przerwań procesowa Intel x86 ma 256 pozycji z czego pierwsze 32 są przeznaczone na NMI
Przerwania maskowalne i niemaskowalne O tym, czy przerwanie maskowalne jest w danej chwili maskowane czy nie informuje znacznik przerwań IF (interrupt flag) w rejestrze znaczników. Jeżeli jest on równy zero przerwania są maskowane. Zawartość znacznika możemy ustawiać lub zerować za pomocą instrukcji CLI (clear interrupts) zerowanie, oraz STI (set interrupts) ustawianie. Przerwana możemy także maskować wybiórczo tzn. powodować, by przy ustawionym znaczniku IF (przerwania dozwolone) niektóre przerwania nie pojawiały się. W PIC istnieje rejestr maskowania przerwań, który określa, które przerwania sprzętowe będą pojawiać się. Każdy bit tego rejestru odpowiada jednemu przerwaniu sprzętowemu (IRQ0 – IRQ7).
Tryby pracy sterownika przerwań 8259A Tryb pracy układu 8259A ustalany jest programowo. Układ otrzymuje w fazie programowania 2-4 bajty konfiguracyjne ICW1 – ICW4 (InitializationCommand Word), które decydują o późniejszym zachowaniu systemu obsługi przerwań. Istnieją też rozkazy, które można przekazywać kontrolerowi podczas jego pracy modyfikując tym samym dynamicznie system obsługi przerwań stosownie do bieżących potrzeb. Układ 8259A rozpoznaje trzy rozkazy OCW1 - OCW3 (OperationControl Word). Maskowanie zwykłe – korzystając ze słowa sterującego OCW1 można załadować rejestr maskowania przerwań odp. słowem – maską, blokującą wybrane źródła przerwań. Jeżeli żądanie przerwania zostało już potwierdzone przez procesor za pomocą sygnału INTA=0, przerwanie to będzie mimo to blokować zgłoszenia przerwań o niższych priorytetach. Można temu zapobiec – za pomocą bitu EOI w słowie sterującym OCW2 oraz za pomocą trybu maskowania specjalnego, programowanego słowem OCW3.
Tryby pracy sterownika przerwań 8259A Maskowanie specjalne – Jeżeli realizowany jest program obsługi przerwania, który w trakcie wykonywania został zamaskowany, można za pomocą maskowania specjalnego, programowanego słowem sterującym OCW3, umożliwić obsługę przerwań o niższych priorytetach nie czekając na zakończenie realizowanego programu obsługi przerwania wyższego, lecz zamaskowanego priorytetu. Rotacje specjalne – polega na tym, że można programować w dowolnej chwili realizacji programu źródła przerwania o najniższym priorytecie. Jest zawsze przesunięciem priorytetów o określoną liczbę pozycji w prawo. Może być wykonana w dowolnej chwili trwania programu.
Tryby pracy sterownika przerwań Autorotacja – polega na tym że obsłużonemu żądaniu przerwań zostaje zawsze przyporządkowany najniższy priorytet. Zmiana priorytetów następuje każdorazowo w wyniku realizacji sterowania EOI. Autorotacja jest stosowana szczególnie wtedy, gdy brak przekonujących argument za przyporządkowaniem jednym źródłom przerwań wyższych priorytetów niż innym. W przypadku autorotacji każde źródło musi czekać na obsługę co najwyżej do zakończenia obsługi siedmiu pozostałych źródeł przerwań. Może być zrealizowana po zakończeniu trwania programu. Tryb ankietowania – element 8259 nie pracuje jako sterownik przerwań, lecz jako generator flag statusowych, które mogą być testowane przez system mikroprocesorowy w celu wykonania operacji wejścia – wyjścia. Operacje te muszą być inicjowane przez mikroprocesor za pomocą słowa sterującego OCW3.
Przykład – zmiana priorytetów Bezpośrednio po wyzerowaniu sterownika priorytety przerwań zostają ustawione w ten sposób, iż ich wartość maleje wraz ze wzrostem indeksu wejścia (wejście IR0 posiada priorytet najwyższy, równy 0, zaś IR7 — najniższy, równy 7). Priorytety te mogą być zmieniane w sposób cykliczny. Wskazanemu wejściu przypisuje się priorytet najniższy, zaś priorytety pozostałych wejść ulegają rotacji identycznej jak przesunięcie najniższego priorytetu. Programowanie sterownika 8259A odbywa się przy pomocy słów sterujących wysyłanych na port 20H Postać tego słowa zmieniająca priorytety przerwań to 11000xxx gdzie xxx to numer wejścia które otrzyma najniższy priorytet (7). mov al, 11000111b out20h,al
Przykład – zmiana częstości przerwania zegara Funkcja powoduje zmianę wartości początkowej licznika 0 układu 8253 przy pomocy słowa sterującego 36h wysłanego na port 43h, a następnie młodszego i starszego bajtu nowej wartości wysłanej na port 40h . Wpisanie 0h powoduje ustawienie licznika na domyślną wartość która umożliwia osiągnięcie najdłuższego interwału czasu. mov al, 36h out 43h, al mov al, 0 out 40h, al out 40h, al Wstawienie 4000h powoduje czterokrotne zwiększenie częstotliwości generowania przerwań przez licznik. mov al, 36h out 43h, al mov ax, 4000h out 40h, al mov al, ah out 40h, al
Mieszanie kodu C i asemblera Nie każde przerwanie lub operację sprzętową da się wykonać w języku C. Jest możliwe umieszczanie wstawek w kodzie. Uwaga – nie są one w standardzie ANSI C. #pragmainline intmain() { char*napis="\nTekstprzykladowy $"; asm{ MOV DX, napis MOV AH,9 INT 33 } } #pragmainline intmain() { char*napis="\nTekstprzykladowy $"; _asm MOV DX, napis _asm MOV AH,9 _asm INT 33 } }
Asembler i C Zdefiniowano zmienne globalne odwołujące się do rejestrów _AX, _AL, AH, _BX, _BL, _BH, _CX, _CL, _CH, _DX, _DL, _DH, _CS, _DS, _SS, _ES, _SP, _BP, _SI, _DI REGS – unia zawierająca stan wszystkich rejestrów. main() { union REGS r; r.x.ax = 1; r.h.cl = 2; }
Język C: pamięć i przerwania FP_OFF(adres); – wyznaczenie ofsetu . Wyodrębnienie z adresu części, która stanowi przemieszczenie względem początku segmentu FP_SEG(adres); – wyznaczenie adresu segmentu dla danego adresu MK_FP(seg, off); – utworzenie adresu na podstawie segmentu i offetu getvect(nr_przerwania); – zwraca adres funkcji obsługującej dane przerwanie (wartość wektora przerwania) setvect(nr_przerwania, adres/nazwa_funkcji); – przypisuje funkcję jako obsługę przerwania (aktualizuje wektor) inport(nr_portu), inportb– odczyt danej z portu o numerze danym parametrem outport, outportb– zapis danej do portu o numerze danym parametrem
Język C: pamięć i przerwania int86(nr_przerw, in_regs, out_regs); Załadowanie zestawu rejestrów do procesora, wykonanie przerwania i zwrócenie zawartości rejestrów procesora intdos(in_regs, out_regs); Załadowanie zestawu rejestrów do procesora, wykonanie przerwania 21H i zwrócenie zawartości rejestrów procesora enable(); Pozwala maskować przerwania jest dozwolone od każdego urządzenia zewnętrznego. disable(); Wyłącza dostęp przerwaniom sprzętowym.
Przykład w języku C intmain() { char napis[] = "Mój napis!$"; struct REGPACK reg; reg.r_ax = 0x900; reg.r_dx = FP_OFF(napis); reg.r_ds = FP_SEG(napis); intr(0x21, ®); return 0; }
Przykład: obsługa zegara #include <stdio.h> #include <dos.h> #define INT 0x1C staticvolatilecount, flag; voidinterrupt far timer() { if(count++%18) return; flag++; } main() { voidinterrupt (far *ref)(); unsignedint i = 0; ref = getvect(INT); setvect(INT, timer); while(!kbhit()) { printf("%u", i++) if(flag) flag--; putchar('\a'); } setvect(INT, ref); }
Przykład: melodyjka W programie użytkownika ma być wyłączona operacja drukowania, spowodowana naciśnięciem klawiszy Shift i PrtSc. Zamiast tej operacji ma być grana melodia. #include <dos.h> #include <conio.h> voidinterruptnowa_funkcja(); voidinterrupt(*stara_funkcja)(); intmain() { stara_funkcja = getvect(0x05); setvect(0x05, nowa_funkcja); while(1) { if( kbhit( )) if( getch( ) == 27) break; } setvect(0x05, stara_funkcja); } constint n=7; constunsignedint ton[n]= {1500, 0, 1000, 0, 700, 500, 300}; constunsignedint czas[n]= {200, 100, 500, 400, 400, 400,400}; voidinterruptnowa_funkcja() { staticint n; for( i=0; i<n; i++) { sound(ton[i]); delay( czas[i] ); } nosound(); }