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.