Chcialbym popisac troche procedur obslugi przerwań i wyjątków procesora i jako ze jestem jeszcze mocno początkujący prosilbym o wskazówki jak się do tego zabrać. Chodzi mi o jakiś schemat jak taka procedura i program ją zawierający powinny wyglądać i co powinny zawierac.
Pozdrawiam
yyy, wybacz taką odpowiedź, ale jak jesteś początkujący, to, proszę, zarzuć ten temat na jakiś czas. Zajmij się czymś prostrzym a doświadczenie samo przyjdzie.
Tutaj wyjasnilem podstawy ktore trzeba znac przy procedurach przerwan i nie tylko :
http://www.binboy.org/forum/viewtopic.php?t=4478
Jako poczatkujacemu radze na poczatku ;) nie brac sie za te rzeczy :>
Postanowilem sie nie poddawac :-8 i napisalem taka oto procedure obslugi przerwania zegarowego. Ma ona wyswietlac zielona linie przesuwającą sie w prawo. Program dziala jak chcialem, ale pod koniec wyskakuje mi jakis komunikat MS DOS ze napotkano jakas nieprawidlowa instrukcje. Gdzie lezy blad?
Oto ten program:
Rozkazy SEGMENT use16
Assume cs: Rozkazy
wektor8 dd ?
licznik db 0
Start:
mov ax, 0013h
int 10h
mov ah, 35h
mov al, 08h
int 21h
mov [word PTR wektor8], bx
mov [word PTR wektor8 + 2], es ;zapamietanie starej
;procedury obslugi
mov dx, SEG Zegar
mov ds, dx
mov dx, OFFSET Zegar
cli ;instalowanie nowej procedury obsługi
mov ah, 25h
mov al, 08h
int 21h
sti
ptl:
cmp cs:licznik, 255
jne ptl
mov dx, SEG wektor8
mov ds, dx
mov dx, OFFSET wektor8
cli ;deinstalacja nowej procedury obsługi
mov ah, 25h
mov al, 08h
int 21h
sti
mov ah, 0
mov al, 3
int 10h ;powrót do trybu tekstowego
mov ax, 4C00h ;zakończenie wykonywania programu
int 21h
Zegar PROC
sti ;odblokowanie przerwań
push ax ;zapamietanie na stosie modyfikowanych rejestrów
push bx
push dx
push es
;wlasciwe dzialanie procedury
inc cs:licznik
mov ax, 0A000h
mov es, ax
mov bx, 0
mov bl, cs:licznik
mov byte ptr es:[bx], 10
pop es
pop dx
pop bx
pop ax
mov al, 20h
out 20h, al
jmp dword PTR cs:wektor8 ;skok do pierwotnej procedury obslugi
ret
Zegar ENDP
Rozkazy ENDS
END Start
W sprawie tego kodu:
mov al, 20h
out 20h, al
Jest to informacja o zakończeniu działania przerwania sprzętowego. Skoro przekazujesz działanie kodu do oryginalnej funkcji obsługi przerwania IRQ0 to nie powinieneś wysyłać wartości 20h do portu 20h.
A dlaczego się wykrzacza? Proste:
"deinstalacja nowej procedury obsługi"
masz tak:
mov dx, SEG wektor8
mov ds, dx
mov dx, offset wektor8
a powinno być tak:
mov dx, word ptr wektor8+2
mov ds, dx
mov dx, word ptr wektor8
Po prostu wpisywałeś adres zmiennej wektor8 jako adres procedury obsługi IRQ0.
Dzieki
Jesli tak zapamietujesz:
<asm>
mov [word PTR wektor8], bx
mov [word PTR wektor8 + 2], es ;zapamietanie starej
;procedury obslugi
<asm>
to raczej bedzie tak a nie jak pisze Marooned :
<asm>
mov dx, word ptr wektor8+2
mov ds, dx
mov dx, word ptr wektor8
<asm>
to raczej bedzie tak a nie jak pisze Marooned :
Hmm, no wybacz stary, ale po pierwsze to mi działa, a po drugie napisałeś to samo, co ja. Czytaj uważniej.
Hmm no sorry stary najwidoczniej zdarzyles go zmodyfikowac zanim odpisalem ;) (bo z tego co pamietam to na poczatku bylo zle ?!)
(poslizg 2 dni :( ) i drugi raz widocznie przeoczylem poprawke :(
Moja wina :-8
EOT
1) Ostatnio zmodyfikowany: 12-09-2003 20:58 przez Marooned
2) snaj 14-09-2003 00:14
(poslizg 2 dni) ... Moja wina
[browar]
/* Dlaczego ja widzę na biało napis o modyfikacji? OK. Już wiem. Marooned: nieładnie :P */
//Niby dlaczego? - m.M