[ Pobierz całość w formacie PDF ]

mov ax, 3100h
shr dx, 4 ; DX=kod/16=ilość paragrafów do
; zachowania w pamięci
inc dx
int 21h ; int 21h, AX = 3100h - TSR
juzjest: ; jeśli nasz program już jest w
; pamięci, to drugi raz się nie
; zainstalujemy
; TASM: mov dx, offset juz_jest
mov dx, juz_jest
mov ah, 9
int 21h
mov ax, 4c02h
int 21h ; wyjście z kodem błędu = 2
nie_ma db "Programu nie ma w pamieci.$"
juz_niema db "Program odinstalowano.$"
juz_jest db "Program juz zainstalowany.$"
zainst db "Program zainstalowano.$"
; TASM: end start
Teraz omówię kilka spraw, o które moglibyście zapytać:
" Zaraz po starcie jest skok do kodu. Dlaczego?
Funkcja 31h przerwania 21h musi dostać informację, ile paragrafów (od miejsca, gdzie zaczyna się
program) ma zachować w pamięci. Dlatego więc najpierw w programie zapisujemy kod rezydentny a
potem resztę (instalacja / dezinstalacja), która nie będzie potem potrzebna w pamięci.
" Po co ten znacznik?
Aby upewnić się przy próbie odinstalowania, że to rzeczywiście naszą procedurę chcemy
odinstalować. Niedobrze byłoby, gdyby jakiś inny program potem przejął to przerwanie, a my byśmy
go wyrzucili z pamięci...
Bogdan Drozdowski 233
Bogdan Drozdowski Język asembler dla każdego 2007-11-12
Treść znacznika może oczywiście być dowolna.
" Czemu uruchomienie starej procedury jest w środku naszej (a nie na początku czy na końcu) i czemu
jest postaci call dword ... ?
Chodzi o to, aby najpierw zapalić Scroll Lock, potem wykonać operację na dysku (do czego posłuży
nam prawdziwa procedura int13h) i na końcu przywrócić stan diód na klawiaturze. Użycie CALL a
nie JMP spowoduje, że odzyskamy kontrolę po tym, jak uruchomimy stare przerwanie. Zaś adres
starego przerwania to segment i offset, czyli razem 4 bajty (stÄ…d: DWORD).
" Czemu wszędzie jest CS: ?
Gdy jesteśmy w naszej procedurze, nie wiemy, ile wynosi DS. Wiemy, że CS pokazuje na naszą
procedurę. Są więc 2 wyjścia:
f& Zachować DS na stosie, po czym zmienić go na nasz segment
f& Zamiast nieznanego DS, używać znanego CS
Wybrałem to drugie.
" Gdzie się dowiedzieć, jak zapalać diody na klawiaturze?
Instrukcje znajdujÄ… siÄ™ w moim innym kursie. Polecam.
" Co robi instrukcja IRET ?
Interrupt Return robi tyle, co zwykły RET, ale jeszcze zdejmuje flagi ze stosu. Polecam opis instrukcji
INT z drugiej części mojego kursu.
" Co znajduje siÄ™ pod ds:[80h] ?
Liczba bajtów linii poleceń programu.
" Gdzie znajduje się linia poleceń programu?
Od ds:[81h] maksymalnie do ds:[0ffh] (od ds:[100h] zwykle zaczyna siÄ™ kod programu). Napotkanie
Carriage Return (13 = 0Dh) po drodze oznacza koniec linii poleceń.
" Czemu w kodzie jest [es:13h*4] zamiast [es:4ch] ?
Czytelniejsze, bo oznacza, że chcemy adres przerwania 13h.
" Czemu int 21h jest otoczone przez CLI ?
Nie chciałem ryzykować, że w chwili zmiany adresu lub zwalniania pamięci rezydenta trafi się jakieś
przerwanie, które mogłoby chcieć uruchomić int13h (którego już nie ma po tym int21h lub którego
adres jest niespójny - zmieniliśmy już segment, ale jeszcze nie offset itp.).
" Czemu program sprawdza znacznik itp. przy dezinstalacji ?
Głupio byłoby odinstalować nie swoją procedurę...
Tym bardziej, że najbliższe int13h spowodowałoby nieprzewidywalne skutki.
" Czemu program sprawdza znacznik przy instalacji ?
Nie chcę, aby program instalował się wielokrotnie, gdyż potem odzyskanie adresu starej procedury
zajęłoby tyle samo dezinstalacji, co instalacji.
" Co znajduje siÄ™ w DS:[2ch] ?
Numer segmentu pamięci, w którym trzymane są zmienne środowiskowe (jak PATH, BLASTER, i
wszystkie inne ustawiane komendą SET, np. w pliku autoexec.bat). Możemy go zwolnić, bo dla
każdego programu tworzona jest oddzielna kopia.
234 Bogdan Drozdowski
2007-11-12 Język asembler dla każdego Bogdan Drozdowski
" Paragraf to 16 bajtów, więc dzielimy DX przez 16. Ale czemu dodajemy 1?
Jeżeli kod wystaje ponad adres podzielny przez 16, to część jego zostanie utracona. Procesor będzie
wykonywał nieznane instrukcje z nieprzewidywalnym skutkiem.
Chociaż DOS jest już rzadko używany, to jednak umiejętność pisania TSR-ów może się przydać, np. jeśli
chcemy oszukać jakiś program i podać mu np. większy/mniejszy rozmiar dysku lub coś innego. Można też
napisać DOS-owy wygaszacz ekranu jako TSR, program który będzie wydawał dzwięki po naciśnięciu
klawisza, wyświetlał czas w narożniku ekranu i wiele, wiele innych ciekawych programów. Nawet jeśli
nikomu oprócz nas się nie przydadzą lub nie spodobają, to zawsze i tak zysk jest dla nas - nabieramy
bezcennego doświadczenia i pisaniu i znajdowaniu błędów w programach rezydentnych. Takie umiejętności
mogą naprawdę się przydać, a z pewnością nikomu nie zaszkodzą.
Spis treści off-line (Alt+1)
Spis treści on-line (Alt+2)
Ułatwienia dla niepełnosprawnych (Alt+0)
Bogdan Drozdowski 235
Bogdan Drozdowski Język asembler dla każdego 2007-11-12
236 Bogdan Drozdowski [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • domowewypieki.keep.pl