background image

Informatyka Studia Dzienne

Laboratorium Architektury Komputerów

Ćwiczenie 10

System przerwań mikrokomputera PC.

Przygotowanie:
Krzysztof Tokarz

background image

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

background image

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]