AK D Lab 10

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]


Wyszukiwarka

Podobne podstrony:
CCNA2 lab 10 1 6 pl
lab 3 10 5
lab 3 10 1
Lab 8 9 10 ver2
lab 10 2 5
IE RS lab 10 solutions
lab 8 10 1
lab 10 2 4
AK D Lab 1
LAB 10
2010 Lab 10 struktury drzewiaste
lab 10 3 2 1
Podstawy Automatyki Lab 10 CW3 Układy sekwencyjne elektroniczne
Podstawy Automatyki Lab 10 CW1 Układy przełączające oparte na elementach stykowych
Lab 6, 10.2.2.8 Packet Tracer - DNS and DHCP Instructions
lab 5(1) 10
lab 10
CCNA1 lab 10 3 5c pl

więcej podobnych podstron