MINI KURS PISANIA
PROGRAMÓW TSR W ASEMBLERZE
Autor:
Adam Dybkowski
adybkows@elka.pw.edu.pl
http://www.amwaw.edu.pl/~adybkows
MINI KURS PISANIA
PROGRAMŁW TSR W ASEMBLERZE
0. Wstęp
1. Podstawy językowe naszych przykładowych programów TSR
2. Przerwania w programach TSR, pamięć i zegar CMOS
3. Usuwanie rezydenta z pamięci i jakie są z tym związane problemy
4. Wady i zalety Multiplex Interrupt
5. Wywoływanie przerwań dosowych w czasie pracy TSR'a
MINI KURS PISANIA PROGRAMŁW TSR W ASEMBLERZE
0. WSTP
Na początku zapoznajmy się z podstawowym pojęciem - czym właściwie jest
ten TSR. Otóż TSR to skrót od Terminate and Stay Resident (ang.), czyli
"Zakończ i pozostań rezydentem". Można też się spotkać z innymi
tłumaczeniami, ale w sumie chodzi o program, który po oddaniu sterowania
(czyli po powrocie do DOSu) zostawia pewną część swojego kodu w pamięci.
Pojawia się pytanie: tylko po co zagracać pamięć niepotrzebnymi programami,
które już wykonały swoje zadanie ? Otóż TSR prócz stałej obecności w pamięci
komputera może wykonywać pewne zadania w zależności od wyobraŚni autora - na
przykład po przechwyceniu przerwania zegara, kod TSRa będący cały czas w
pamięci może zająć się wyświetlaniem aktualnego czasu w prawym górnym rogu
ekranu, gdy podstawimy swoją procedurę pod przerwanie klawiatury - możemy
zmieniać kody znaków przekazywane na drodze klawiatura-edytor tekstu. Na tej
zasadzie działają liczne programy udostępniające kody polskich znaków na
klawiaturze i ekranie. I tak dalej, przykłady można mnożyć - driver do
obsługi odtwarzacza kompaktów, TSR grający w tle muzykę, zmieniający czcionkę
na ekranie czy też większy system, uaktywniany pewną kombinacją klawiszy, jak
np. SideKick lub dowolny rezydentny kalkulator. Wszystkie wymienione programy
mają jedną wspólną cechę - instalują się rezydentnie w pamięci (czyli są
programami TSR).
Wbrew powszechnemu przekonaniu pisanie programów rezydentnych nie jest
jedynie domeną "rasowych" programistów czy super-c00l-coderów, każdy z nas
posługujący się w miarę dobrze asemblerem i dysponujący potrzebną
dokumentacją (jak np. spis przerwań BIOSu i DOSu) może zabrać się za
napisanie TSRa. Co to będzie ? Na początku pewnie zegar, w miarę wzrostu
doświadczenia może z tego wyjść dobry rezydentny edytor tekstów. Aha, jeszcze
o tym, co nam będzie potrzebne: na pewno edytor tekstów (to chyba każdy ma,
wystarczy dobry edytor z Nortona Commandera lub Dos Navigatora, ale można też
używać bardziej zaawansowanych narzędzi, ja preferuję edytor o dŚwięcznej
nazwie: bingo), do tego niezastąpiony będzie asembler (tasm lub masm) oraz
linker (tlink lub link). W niektórych skomplikowanych przypadkach przyda się
też util o nazwie: exe2bin, ale można się bez niego obejść. Ale dość już
tego wstępu, przystąpmy do części praktycznej.
Jeszcze jedno: wszystkie przytoczone opisy funkcji DOSu i innych
przerwań (oczywiście po dokonaniu niezbędnych skrótów) zostały zaczerpnięte z
książki Andrzeja Dudka pod tytułem: "Jak pisać wirusy", wydanie pierwsze,
Jelenia Góra 1993.
MINI KURS PISANIA PROGRAMŁW TSR W ASEMBLERZE
1. PODSTAWY JZYKOWE 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):
----------> Obciąć <----------
.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
----------> Obciąć <----------
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
----------> Obciąć <----------
.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
----------> Obciąć <----------
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).
.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
.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
Wyszukiwarka
Podobne podstrony:
Kurs1excel kurs1kurs1kurs1 (2)kurs1Asembler w TSR KURS1frywolitki kurs1kurs1excel kurs1 ebdff4q66epyf6slzofptg754sddsc3g7ytg5aqwięcej podobnych podstron