(Asm) Obsługa przerwan i wyjatkow procesora

0

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

0

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.

0

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 :>

0

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 
0

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.

0

Dzieki

0

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>

0

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.

0

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

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1