Informatyka Studia Dzienne
Laboratorium Architektury Komputerów
Ćwiczenie 10
System przerwań mikrokomputera PC.
Przygotowanie:
Krzysztof Tokarz
1. Cel ćwiczenia.
Celem ćwiczenia jest poznanie:
- budowy systemu przerwańw komputerze PC
- mechanizmu zgłaszania i obsługi przerwań,
- metod przechwytywania przerwań.
2. System przerwań procesorów zgodnych z 8086.
W procesorach z rodziny 8086 każdemu z przerwań jest przyporządkowany czterobajtowy wpis w
tablicy wektorów przerwań. Wpis ten jest 32-bitowym adresem procedury obsługi tego przerwania.
Tablica wektorów przerwań umieszczona jest w pierwszym kilobajcie pamięci operacyjnej
komputera począwszy od adresu 00000h. W komputerach PC tylko osiem przerwań jest
zgłaszanych bezpośrednio przez urządzenia zewnętrzne. Przerwania te są nazywane sprzętowymi i
posiadają numery od 08h – 0Fh. Odpowiadają im linie magistrali IRQ0 – IRQ7. Przerwania o
numerach z zakresu 00h – 1Fh, w tym sprzętowe, są obsługiwane przez BIOS komputera.
Przerwania o numerach 20h – 3Fh obsługuje system operacyjny. Każde przerwanie można wywołać
programowo, za pomocą instrukcji int, której argumentem jest numer przerwania.
3. Przechwytywanie przerwań.
Aby umożliwić procedurze obsługę przerwania należy adresem jej początku wypełnić odpowiednie
miejsce w tablicy wektorów przerwań. Należy przy tym pamiętać, że jeśli do przerwania była już
przyporządkowana procedura, może okazać się konieczne jej wywołanie.
Przechwycenie przerwania wykonuje się przy pomocy funkcji systemowych. Funkcja o numerze
35h, odczytuje aktualny adres procedury obsługi przerwania z tablicy wektorów. W rejestrze al
należy podać numer przerwania. Adres procedury zwracany jest w rejestrach es:bx. Funkcja, która
ustawia nowy adres ma numer 25h. Argumentami tej funkcji są: numer przerwania podawany w
rejestrze al, oraz adres nowej procedury przekazywany w parze rejestrów ds:dx. Przed
zakończeniem programu należy odtworzyć oryginalny adres w tablicy, dlatego trzeba go zachować.
Można to zrobić przechowując go w globalnej zmiennej o rozmiarze podwójnego słowa
zdefiniowanej w segmencie danych:
stara_proc dd 0
;zmienna na adres pierwotnej procedury obslugi
Przykładowy fragment programu służący przechwyceniu przerwania może wyglądać następująco.
mov ah,35h
;funkcja 35h - odczytanie adresu
mov al,09h
;procedury przerwania 09h
int 21h
mov word ptr stara_proc,bx
;zapamietanie 32-bitowego adresu
mov word ptr stara_proc+2,es ;pierwotnej procedury obslugi
push cs
;do ds segment kodu
pop ds
;w którym jest procedura
mov dx,offset nowa_proc
;do dx offset adresu procedury
mov ah,25h
;funkcja 25h - nowa procedura
mov al,09h
;obslugi przerwania 09h
int 21h
4. Wywołanie oryginalnej procedury obsługi przerwania.
W przypadku niektórych przerwań konieczne jest wywołanie oryginalnej procedury obsługi. Można
ją wywołać na trzy sposoby.
Sposób pierwszy: instrukcja CALL
Instrukcją CALL symulujemy wywołanie przerwania. Ponieważ procedura kończy się instrukcją
RET, która pobiera oprócz adresu powrotu także rejestr znaczników należy stan tego rejestru
odłożyć na stos przed wywołaniem procedury. Zgłoszenie przerwania sprzętowego lub
programowego odkłada stan rejestru znaczników.
pushf
;odlozenie znacznikow dla symulacji
call stara_proc
;wywolania przerwania instrukcja call
Powyższy fragment programu może znaleźć się w dowolnym miejscu nowej procedury obsługi
przerwania. Należy pamiętać, że procedura musi kończyć się instrukcją IRET.
Sposób drugi: instrukcja INT
Przerwania z zakresu 60h – 67 są dostępne do wykorzystania przez programistę. Można jedno z
nich wykorzystać do wywołania pierwotnej procedury obsługi przerwania. Nażeży w tym celu
przypisać wybranemu przerwaniu adres starej procedury. Należy to zrobić tuż po odczytaniu adresu
pierwotnej procedury obsługi – w części programu odpowiedzialnej za przechwytywanie przerwań.
mov dx,word ptr stara_proc+2 ;adres starej procedury - segment
mov ds,dx
mov dx,word ptr stara_proc
;offset
mov ah,25h
;funkcja 25h - ustawienie adresu
mov al,60h
;pierwotnej procedury obslugi
int 21h
;zamiast 09h teraz jest 60h
Po przypisaniu można ją wywołać za pomocą instrukcji INT, któa może znaleźć się w dowolnym
miejscu nowej procedury obsługi. Procedura musi kończyć się rozkazem IRET.
int 60h ;wywolanie pierwotnej procedury obslugi przerwania
Sposób trzeci: instrukcja JMP
Sposób ten można użyć tylko w przypadku, gdy oryginalną procedurę można wywołać po
wykonaniu nowej. Instrukcja JMP jest ostatnią instrukcją nowej procedury, powrót nastąpi
bezpośrednio do głównego programu.
jmp dword ptr cs:[stara_proc]