[ Pobierz całość w formacie PDF ]
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.
256 Bogdan Drozdowski
2009-02-25 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 257
Bogdan Drozdowski Język asembler dla każdego 2009-02-25
258 Bogdan Drozdowski
2009-02-25 Język asembler dla każdego Bogdan Drozdowski
Uruchamianie innych programów
Czasem zdarza się, że z poziomu naszego własnego programu musimy uruchomić jakiś inny program lub
polecenie systemowe. Służy do tego funkcja systemowa AH=4B przerwania DOS-a 21h. Jej argumenty to
kolejno:
" w AL - typ uruchomienia. Najczęściej AL=0, czyli załaduj i uruchom
" w ES:BX - adres struktury dotyczącej środowiska uruchamianego programu. Pola struktury to
kolejno:
f& (WORD) segment zawierający zmienne środowiska. Można wpisać 0 (wtedy będzie
skopiowany nasz segment środowiska).
f& (DWORD) adres linii poleceń uruchamianego programu
f& (DWORD) adres pierwszego File Control Block (FCB) uruchamianego programu
(nieużywane)
f& (DWORD) adres drugiego FCB uruchamianego programu (nieużywane)
" w DS:DX - adres nazwy uruchamianego programu
Po więcej szczegółów odsyłam do listy przerwań Ralfa Brown'a (RBIL)
Spróbujmy teraz napisać jakiś prosty przykład - uruchomienie samego NASMa (powinien się wyświetlić błąd,
że nie podano plików wejściowych). Program jest w składni NASM.
(przeskocz przykładowy program)
; Program uruchamiający inny program.
;
; Autor: Bogdan D.
; kontakt: bogdandr (at) op (dot) pl
;
; nasm -O999 -o exec_dos.com -f bin exec_dos.asm
section .text
org 100h
start:
mov ax, cs
mov es, ax ; będziemy zmieniać rozmiar segmentu kodu
mov bx, koniec ; BX = rozmiar segmentu kodu
shr bx, 4 ; BX /= 16 - rozmiar w paragrafach
inc bx ; żeby nie obciąć naszego programu
mov ah, 4ah ; funkcja zmiany rozmiaru
int 21h
; zwolnienie miejsca na ładowany program
mov [kom_ln+2], cs ; uzupełniamy pola potrzebnych struktur
mov [fcb1+2], cs
mov [fcb2+2], cs
mov [sssp], sp ; zachowujemy nasz stos
mov [sssp+2], ss
mov ax, 4b00h ; funkcja uruchomienia programu
mov dx, program ; adres nazwy programu
mov bx, srod ; adres struktury środowiska
int 21h ; uruchamiamy
cli ; przywracamy nasz stos
Bogdan Drozdowski 259
Bogdan Drozdowski Język asembler dla każdego 2009-02-25
mov sp, [sssp]
mov ss, [sssp+2]
sti
mov ax, 4c00h
int 21h
sssp dd 0 ; miejsce na SS i SP
; linia poleceń uruchamianego programu
linia_kom db 0, " ", 0dh
; File Control Block - juz nieużywana przez DOS
; struktura, tu ustawiona na jakieś bezpieczne domyślne wartości
; (zgodnie z książką Art of Assembler)
fcb db 3," ",0,0,0,0,0
; nazwa programu do uruchomienia
program db "nasm.exe", 0
; struktura środowiska
srod dw 0 ; segment środowiska. Nasz własny
; jest pod DS:[2ch]
kom_ln dw linia_kom, 0 ; offset i segment linii poleceń
fcb1 dw fcb, 0 ; offset i segment pierwszego FCB
fcb2 dw fcb, 0 ; offset i segment drugiego FCB
[ Pobierz całość w formacie PDF ]