Kurs Assemblera by Skowik- Lekcja 14
var napis=new Array("P","R","O","G","R","A","M","Y ","R","E","Z","Y","D","E","N","T","N","E");
var kolory=new Array("EE00EE","FF00DD","FF00CC","FF00BB","FF00AA","FF0099",
"EE00AA","EE00BB","EE00CC","EE00DD","EE00EE","DD00FF","CC00FF","AA00FF","8800FF","5500FF","2222FF","0000DD");
for(i=0; i< 18; i++)
document.write(napis[i].fontcolor(kolory[i]));
W tej części kursu postaram się opisać technikę tworzenia
programów rezydentnych.
TSR :
Terminate and Stay Resident, oznacza
programy, które wykonują swoje zadania w tle systemu, niezależnie od
programów działających "na pierwszym planie". Taki program po zakończeniu
typowego działania pozostawia w pamięci swoją część, która świadczy
określone usługi .Schemat działania
programu TSR:
sprawdzenie swojej obecności w pamięci (po ewentualnym zainstalowaniu się
wcześniej)
zainicjowanie części rezydentnej
pozostawienie tej części w pamięci
zakończenie programu Funkcje rezydentne programu mogą być
wywoływane z:
przerwań użytkownika
przerwań systemowych IRQ
stałych adresów procedur
przypadkowych odwołań systemu (DOS)
Jednym z bardziej standardowych sposobów na
wywoływanie funkcji jest doklejenie się do przerwania multiplex (2F). Pozwala to
na standardowe wykrywanie obecności i daje pewność, że inne programy nie będą
kolidowały z naszym. Wybierając numery-kody dla naszego programu powinno się
dokonać sprawdzenia, czy są one wolne. Takie sprawdzenie może i powinno wyglądać
tak:
;zerowanie rejestrów operacją XOR
xor bx,bx
xor cx,cx
xor dx,dx
mov ah,[kod_programu]
mov al,0 ;sprawdzenie czy kod jest wolny
int 2Fh
cmp al,0 ;Porównanie wyniku wywołania przerwania 2Fh z 0
je [wolne]
cmp al,1
je [nie_wolne] ;wolne, ale nie można używać
cmp al,0FFh ;Porównanie wyniku wywołania przerwania 2Fh z 0FFH
je [zajete] ;cx-wersja, dx:di-sygnatura
Dokonując takiego sprawdzenia trzeba pamiętać, że po powrocie z
przerwania, można polegać tylko na adresach CS:IP i SS:SP,gdyż inne rejestry mogą być
wymazane.Numery dla kodu należy wybierać z przedziału C0-FF.Przediał
0-7F jest zajęty przez system, a B8-BF przez obsługę sieci.To przerwanie
wykorzystują np.XMS,MSCDEX,DPMI,DRIVER i DISPLAY.SYSPisząc procedurę
opartą na przerwaniu 2Fh można użyć takiego schematu:
sygnatura db 'Skowico' ;8
db 'Program ' ;8
db 0 ;0 lub opis ASCIIZ
kod_programu db ?
stare_2F dd 0
Przerwanie:
pushf
cmp [kod_programu],ah
je Wykonaj
popf
jmp far ptr cs:[stare_2F]
Wykonaj:
popf
cmp al,0
je Czy_Wolne
cmp [numer_funkcji_x],al
je x
...
jmp Koniec
x:
...
jmp Koniec
y:
...
jmp Wolne
Czy_Wolne:
cmp [numer_funkcji_x],al
je Zajete
...
jmp Wolne
Zajete:
mov al,0FFh
mov cx,[wersja]
mov dx,cs
mov di,offset [sygnatura]
jmp Koniec
Wolne:
mov al,0
Koniec:
IRET
Powinno działać.. Ważną sprawą jest pozostawienie
programu w pamięci. Można to zrobić w ten sposób:
mov ah,31h
mov al,[kod_wyjscia]
mov dx,paragrafy_do_pozostawienia
int 21h
Innym sposobem jest użycie przerwania 27h:
mov dx,offset Koniec_Rezydenta ;od 100h
;cs-segment rezydenta
int 27h
Przy pisaniu procedur dla przerwań IRQ trzeba
pamiętać o paru sprawach:
zachowaniu stanu flags (pushf/popf)
przywróceniu stanu WSZYSTKICH rejestrów
zachowaniu i odtworzeniu stanu sprzętu
odwoływaniu się do własnych danych tylko względem cs:ip lub stałych
wartości
wysłaniu po zakończeniu obsługi sygnału EOI(End Of Interrupt) Schemat przerwania IRQ:
my_old_int dd 0
My_Int:
pushf
call far ptr cs:[my_old_int]
push ax
...
Koniec:
mov al,20h
out 20h,al
pop ax
popf
IRET
W razie korzystania z DTA trzeba go zachować i ustawić
własny. Przy instalowaniu lub nadpisywaniu wszelkich przerwań należy stosować
funkcje DOS -25h i 35h lub przy bezpośrednim zapisie do IDT (0:0) wstrzymywać
wykonywanie przerwań (cli/sti). Jeśli program jest pisany w assemblerze, dobrze
jest stosować model TINY.
Strona utworzona przez(c)2001-2
Wyszukiwarka
Podobne podstrony:
zestawy cwiczen przygotowane na podstawie programu Mistrz Klawia 6Międzynarodowy Program Badań nad Zachowaniami SamobójczymiCSharp Introduction to C# Programming for the Microsoft NET Platform (Prerelease)Instrukcja Programowania Zelio Logic 2 wersja polskaProgram wykładu Fizyka II 14 15roprm ćwiczenie 6 PROGRAMOWANIE ROBOTA Z UWZGLĘDNIENIEM ANALIZY OBRAZU ARLANGio port programming 3ogqzy3bscrrpgv753q3uywjfexgwwoiiffd46a 3ogqzy3bscrrpgv753q3uywjfexgwwoiiffd46a2009 12 Metaprogramowanie algorytmy wykonywane w czasie kompilacji [Programowanie C C ]Podstawy Programowania Wersja Rozszerzonakoło Programy GoofyPROGRAMYprogramator do Amigi1 02 Korzystanie z zalet zintegrowanego ¶rodowiska programiwięcej podobnych podstron