Mini kurs pisania programów TSR w asemblerze
Podstawy językowe naszych przykładowych programów TSR
Na początku załóżmy, że plik wynikowy naszego rezydenta nie będzie
przekraczał 64k, co umożliwi skompilowanie go do zbioru z rozszerzeniem COM.
Wszystkie podane przykłady można skompilować po wydaniu poleceń:
tasm plik.asm
tlink /t plik.obj
Zamiast tasm można wstawić masm (jeżeli ktoś dysponuje takim asemblerem),
podobnie zamiast tlink - link. W wyniku wykonania wyżej podanych komend
powinniśmy otrzymać zbiór plik.com, dysponując wcześniej oczywiście zbiorem
źródłowym: plik.asm. Pozostałe zbiory: plik.map oraz plik.obj możemy ze
spokojem w sercu skasować - nie będą nam do niczego przydatne. Oto przykład
najprostszego programu, który właściwie nic nie robi poza wypisaniem napisu
na ekran (nie jest to jeszcze TSR):
.model tiny
.code
.386
org 100h
Start:
mov ah,9 ; numer funkcji wypisującej ciąg znaków
mov dx,offset Napis ; adres tego ciągu do rejestru DX
int 21h ; teraz wywołujemy przerwanie dosowe
mov ax,4c00h ; funkcja: zakończ program, 00 to kod błędu
int 21h ; po tym wywołaniu już tu nie wrócimy
Napis db 'Pierwszy program z kursu TSRów.',13,10,'$'
end Start
Wytłumaczenia wymaga tylko 00 (w napisie: mov ax,4c00h), jest to tzw. kod
błędu zwracany DOSowi po wyjściu z naszego programu, możliwy do sprawdzenia
między innymi w batch'ach (.BAT). My przyjmiemy konwencję, że 0 oznacza brak
błędu, 3 - zainstalowanie się programu w pamięci, 2 - usunięcie z pamięci, a
wyższe od 3 wartości będą oznaczać błąd. Należy jeszcze pamiętać, aby napis
do wyświetlenia funkcją 9 (jak w przykładzie) był zakończony znakiem dolara
($), jest to oznaczenie końca napisu, natomiast 13 i 10 to kody CR i LF -
czyli przejścia kursora na początek następnej linii. Jak ktoś czegoś więcej
nie rozumie to odsyłam do kursu podstaw asemblera jako takiego.
Pora przejść do właściwego programu TSR, który pozostaje w pamięci (albo
zostawia swój fragment, dane, itp). Trzeba do tego poznać funkcję, przy
pomocy której będzie realizowany powrót do DOSu z pozostawieniem części
programu w pamięci. Jedną z przydatnych metod jest wywołanie przerwania 27h:
Nazwa: Kończenie programu i pozostawanie w pamięci
Wywołanie: CS - adres segmentu PSP
DX - adres pierwszego bajtu powyżej programu liczony wobec CS
Powrót: Brak
Opis: Przerwanie powoduje zakończenie programu i pozostawienie go w
pamięci. Maksymalny rozmiar programu pozostawianego w pamięci
może wynosić 64 kB.
Uwagi: Nie należy stosować tej funkcji do instalowania procedur
obsługi przerwań 22h, 23h, 24h
Z powyższego opisu widać, że do naszych potrzeb jest to przerwanie w
zupełności wystarczające, istnieje również funkcja 31h przerwania DOSu (21h),
która wykonuje to zadanie, ale o niej na razie tylko powiem, że jest.
Nauczymy się ją stosować gdy zajdzie potrzeba. A oto i przykład programu TSR,
który jak narazie ogranicza się do wypisania komunikatu na ekran i
pozostawienia w pamięci fragmentu z napisem. Jeszcze jedna uwaga: programy w
plikach .COM muszą się uruchamiać od adresu 100h, dlatego też chcąc
pozostawić fragment naszego programu w pamięci musimy wstawić skok
(instrukcja jmp) do procedury instalacyjnej, aby tylko niezbędne bajty
pozostały w pamięci. Wygląda to mniej więcej w ten sposób:
początek programu (adres 100h): skok do procedury instalacyjnej -+
++++++++++ |
Blok zaznaczony plusami ++++++++++ |
pozostawiamy w pamięci po ++++++++++ |
powrocie do DOSu ++++++++++ |
++++++++++ |
procedura instalacyjna: zaczyna się od tego miejsca --+
----------
----------
i tu się kończy
Mam nadzieję, że to w miarę prosty sposób wyjaśniłem. A oto i zapowiadany
program, po uruchomieniu proponuję sprawdzić, czy się dobrze zainstalował -
przez wydanie polecenia mem /c /p
.model tiny
.code
.386
org 100h
Start:
jmp Instaluj
; to co wpiszemy pomiędzy etykietami: Start oraz Instaluj pozostanie w
; pamięci po powrocie do DOSu
db 'To zostało w pamięci i leży odłogiem.'
; koniec części rezydentnej
Instaluj:
mov ah,9
mov dx,offset Napis
int 21h
mov dx,offset Instaluj ; do DX wpisujemy adres pierwszego bajtu,
int 27h ; który ma być zwolniony, wcześniejsze
; zostają w pamięci na stałe
Napis db 'Program zainstalowany w pamięci.',13,10,'$'
end Start
Wystarczy tyle wiadomości jak na początek. W drugiej części kursu dowiemy
się, jak sprawić, by TSR nie leżał odłogiem w pamięci, ale wykonywał jakąś
przydatną czynność (np. coś wyświetlał w rogu ekranu) oraz co z nim zrobić,
jak już się nam znudzi (czyli jak się odinstalowuje programy TSR).
Powrót na główną stronę kursu.