Opis najczęściej używanych funkcji podstawowych przerwań
Najlepszy opis wszystkich funkcji wszystkich przerwań można znaleźć w
Ralf Brown's Interrupt List
(RBIL).
Po ściągnięciu RBIL należy rozpakować wszystkie archiwa i uruchomić
COMBINE .
aby zbudować listę przerwań, oraz
COMBINE -p .
aby zbudować listę portów. Lista przerwań znajduje się w pliku INTERRUP.LST
,
a można ją przeglądać programem INTERHLP.EXE
lub dowolnym edytorem.
Lista portów znajduje się w pliku PORTS.LST
,
a można ją przeglądać programem II.EXE
lub dowolnym edytorem.
UWAGA: Niektóre debugery mogą wpływać na wartości widziane w rejestrach. Może
się tak stać na przykład wtedy, gdy przerwanie, które wywołujemy, jest wewnętrznie wykorzystywane przez debuger.
W szczególności, może to mieć miejsce w przypadku Turbo Debuggera
i funkcji 3Fh
i 40h
przerwania
DOS-a (int 21h
).
Spis treści tej strony:
- int 10h (funkcje 0, 2, 3, E, F i 13h)
- int 13h (funkcje 2 i 3)
- int 15h (funkcja 86h)
- int 16h (funkcje 0, 1, 2 i 4)
- int 21h (funkcje 1, 2, 9, 2a+2b, 2c+2d, 3c, 3d, 3e,
3f, 40h, 41h, 42h, 4b i 4c)
- funkcja 2 - czytaj sektory dysku do pamięci:
Argumenty:
- AH = 2
- AL = liczba sektorów do odczytania (musi być niezerowa)
- CH = najmłodsze 8 bitów numeru cylindra
- CL =
bity 0-5: numer sektora (1-63)
bity 6-7: najstarsze 2 bity numeru cylindra (tylko dla twardych dysków)
- DH = numer głowicy
- DL = numer dysku, dla dysków twardych bit7=1 (0=dysk A:, 1=B:, 80h=C:, 81h=D:, ...)
- ES:BX = adres miejsca, gdzie będą zapisane dane odczytane z dysku
Zwraca:
- flaga CF=1, jeśli wystąpił błąd; CF=0, gdy nie było błędu
- AH=status (patrz niżej)
- AL=liczba przeczytanych sektorów (nie zawsze prawidłowy)
Podstawowe wartości statusu:
- 0 - operacja zakończyła się bez błędów
- 3 - dysk jest chroniony przed zapisem
- 4 - sektor nie znaleziony / błąd odczytu
- 6 - zmiana dyskietki. Najczęściej spowodowany tym, że napęd nie zdążył się
rozpędzić. Ponowić próbę.
- 80h - przekroczony limit czasu operacji. Dysk nie jest gotowy.
Przykład (czytanie bootsektora):
mov ax, 0201h ; funkcja czytania sektorów
xor dx, dx ; głowica 0, dysk 0 = A:
mov cx, 1 ; numer sektora
mov bx, bufor ; dokąd czytać
int 13h ; czytaj
jnc czyt_ok ; sprawdź, czy błąd
- funkcja 3 - zapisz dane z pamięci na sektorach dysku:
Argumenty:
- AH = 3
- AL = liczba sektorów do zapisania (musi być niezerowa)
- CH = najmłodsze 8 bitów numeru cylindra
- CL =
bity 0-5: numer sektora (1-63)
bity 6-7: najstarsze 2 bity numeru cylindra (tylko dla twardych dysków)
- DH = numer głowicy
- DL = numer dysku, dla dysków twardych bit7=1 (0=dysk A:, 1=B:, 80h=C:, 81h=D:, ...)
- ES:BX = adres miejsca, skąd będą pobierane dane do zapisania na dysk
Zwraca:
- flaga CF=1, jeśli wystąpił błąd; CF=0, gdy nie było błędu
- AH=status (patrz wyżej)
- AL=liczba zapisanych sektorów (nie zawsze prawidłowy)
Przykład (zapisywanie bootsektora):
mov ax, 0301h ; funkcja zapisu sektorów
xor dx, dx ; głowica 0, dysk 0 = A:
mov cx, 1 ; numer sektora
mov bx, bufor ; skąd brać dane do zapisu
int 13h ; zapisz
jnc blad ; sprawdź, czy błąd
- funkcja 86h - czekaj określoną liczbę milisekund:
Argumenty:
- AH = 86h
- CX:DX = czas w milisekundach
Zwraca:
- flaga CF=0, gdy nie wystąpił błąd; CF=1 po błędzie
- AH = status:
80h nieprawidłowa komenda (PC,PCjr)
83h funkcja już trwa
86h funkcja nie jest obsługiwana (XT)
- funkcja 0 - pobierz kod naciśniętego klawisza (lub czekaj na naciśnięcie):
Argumenty:
Zwraca:
- AH = BIOSowy kod klawisza (skankod)
- AL = kod klawisza ASCII
- funkcja 1 - sprawdź, czy naciśnięto klawisz:
Argumenty:
Zwraca:
- gdy nie naciśnięto klawisza:
- gdy naciśnięto klawisz:
- flaga ZF=0
- AH = BIOSowy kod klawisza (skankod)
- AL = kod klawisza ASCII
- funkcja 2 - pobierz stan klawiszów przełączających:
Argumenty:
Zwraca:
- AL = flagi:
bit7 = klawisz Insert jest aktywny
bit6 = Caps Lock aktywny
bit5 = Num Lock aktywny
bit4 = Scroll Lock aktywny
bit3 = naciśnięty klawisz ALT
bit2 = naciśnięty klawisz CTRL
bit1 = naciśnięty lewy klawisz SHIFT
bit0 = naciśnięty prawy klawisz SHIFT
- funkcja 4 (Tandy 2000, ale chyba nie tylko) - opróżnij bufor klawiatury:
Argumenty:
- funkcja 1 - czytaj klawisz:
Argumenty:
Zwraca:
- funkcja 2 - wyświetl znak:
Argumenty:
- AH = 2
- DL = kod ASCII znaku do wypisania
- funkcja 9 - wyświetl napis:
Argumenty:
- AH = 9
- DS:DX = adres łańcucha znaków zakończonego znakiem dolara
$
- funkcja 2A - pobierz datę systemową:
Argumenty:
Zwraca:
- CX = rok (1980-2099)
- DH = miesiąc
- DL = dzień
- podobno AL = dzień tygodnia (0=niedziela)
- funkcja 2B - ustaw datę systemową:
Argumenty:
- AH = 2Ah
- CX = rok (1980-2099)
- DH = miesiąc (1-12)
- DL = dzień (1-31)
Zwraca:
- AL = status (0=sukces, FF=błąd)
- funkcja 2C - pobierz czas systemowy:
Argumenty:
Zwraca:
- CH = godzina
- CL = minuta
- DH = sekunda
- DL = setne sekundy (nie zawsze)
- funkcja 2D - ustaw czas systemowy:
Argumenty:
- AH = 2Dh
- CH = godzina
- CL = minuta
- DH = sekunda
- DL = setne sekundy
Zwraca:
- AL = status (0=sukces, FF=błąd)
- funkcja 3C - utwórz plik (jeśli istnieje, skróć do zerowej długości):
Argumenty:
- AH = 3Ch
- CX = atrybuty (patrz niżej)
- DS:DX = wskaźnik na nazwę pliku, zakończoną bajtem zerowym
Zwraca:
- gdy brak błędu:
- flaga CF=0
- AX = uchwyt do pliku
- gdy błąd:
- flaga CF=1
- AX = numer błędu: 3, 4 lub 5 (patrz niżej)
Atrybuty pliku:
- bit0 = plik tylko do odczytu
- bit1 = ukryty
- bit2 = systemowy
- bit3 = etykieta dysku (ignorowane)
- bit4 = zarezerwowany, musi być równy 0 (katalog)
- bit5 = bit archiwalny
- bit7 = udostępnialność w Novell NetWare
Najczęstsze zwracane kody:
- 0 = brak błędu
- 1 = nieprawidłowy numer funkcji
- 2 / 3 = plik / ścieżka nie znaleziona
- 4 = za dużo otwartych plików
- 5 = brak dostępu
- 6 = niewłaściwy uchwyt do pliku
- 8 = za mało pamięci
- A = nieprawidłowe środowisko
- B = nieprawidłowy format
- C = nieprawidłowy kod dostępu
- 56h = nieprawidłowe hasło
Przykład:
mov ah, 3ch ; utwórz plik
xor cx, cx ; żadnych atrybutów
mov dx, plik ; DS:DX = adres nazwy pliku
int 21h
jnc plik_ok ; sprawdź, czy wystąpił błąd
- funkcja 3D - otwórz istniejący plik:
Argumenty:
- AH = 3Dh
- AL = tryb dostępu (patrz niżej)
- DS:DX = adres nazwy pliku zakończonej bajtem zerowym
- CL = maska atrybutów pliku do wyszukiwania (tylko serwery)
Zwraca:
- gdy brak błędu:
- flaga CF=0
- AX = uchwyt do pliku
- gdy błąd:
- flaga CF=1
- AX = numer błędu: 1, 2, 3, 4, 5, C, 56h (patrz wyżej)
Tryb dostępu do pliku:
- bit0-2 = tryb dostępu:
000 = tylko do odczytu
001 = tylko do zapisu
010 = odczyt/zapis
- bit3 = 0
- bit4-6 = tryb współdzielenia:
000 = tryb kompatybilności
001 = zabroń innym odczytu i zapisu
010 = zabroń innym zapisu
011 = zabroń innym odczytu
100 = nie zabraniaj nikomu niczego
- bit7 = prywatność. Plik nie będzie dziedziczony przez procesy potomne
Przykład:
mov ax, 3d02h ; otwórz plik R/W, tryb zgodności
mov dx, plik ; DS:DX = adres nazwy pliku
int 21h
jnc otw_ok
- funkcja 3E - zamknij plik:
Argumenty:
- AH = 3Eh
- BX = uchwyt do pliku
Zwraca:
- gdy brak błędu:
- gdy błąd:
- funkcja 3F - czytaj z pliku:
Argumenty:
- AH = 3Fh
- BX = uchwyt do pliku
- CX = liczba bajtów do odczytania
- DS:DX = adres bufora, który ma przyjąć dane
Zwraca:
- gdy brak błędu:
- flaga CF=0
- AX = liczba przeczytanych bajtów
- gdy błąd:
- funkcja 40h - zapisz do pliku:
Argumenty:
- AH = 40h
- BX = uchwyt do pliku
- CX = liczba bajtów do zapisania
- DS:DX = adres bufora zawierającego dane do zapisania
Zwraca:
- gdy brak błędu:
- flaga CF=0
- AX = liczba zapisanych bajtów
- gdy błąd:
- funkcja 41h - skasuj plik:
Argumenty:
- AH = 41h
- DS:DX = adres nazwy pliku, zakończonej bajtem zerowym
- maska atrybutów (tylko serwery)
Zwraca:
- gdy brak błędu:
- gdy błąd:
- funkcja 42h - ustaw bieżącą pozycję w pliku:
Argumenty:
- AH = 42h
- AL = skąd odliczamy pozycję:
0 = początek pliku
1 = bieżąca pozycja w pliku
2 = koniec pliku
- BX = uchwyt do pliku
- CX:DX = liczba bajtów, o które chcemy się przesunąć (może być ujemna)
Zwraca:
- gdy brak błędu:
- flaga CF=0
- DX:AX = nowa pozycja, w bajtach od początku pliku
- gdy błąd:
- funkcja 4B - załaduj i/lub uruchom inny program:
Argumenty:
- AH = 4Bh
- AL = rodzaj działania:
0 = załaduj i uruchom
1 = załaduj, ale nie uruchamiaj
3 = załaduj, nakładając na aktualny program
4 = załaduj i uruchom w tle (tylko European MS-DOS 4.0)
- DS:DX = adres nazwy programu, zakończonej bajtem zerowym. Nazwa musi
uwzględniać rozszerzenie pliku.
- ES:BX = adres bloku parametrów (patrz niżej)
- CX = tryb (tylko dla AL=4):
0 = proces potomny po zakończeniu zostaje umieszczony w stanie zombie
1 = kod zakończenia procesu potomnego jest odrzucany
Zwraca:
- gdy brak błędu:
- gdy błąd:
- flaga CF=1
- AX = numer błędu: 1, 2, 5, 8, A, B (patrz wyżej)
Blok parametrów (AL=0,1,4):
- WORD: segment zmiennych środowiska dla procesu potomnego (0 = użyć środowiska
rodzica)
- DWORD: wskaźnik na linię poleceń dla programu uruchamianego
- DWORD: wskaźnik na pierwszy FCB dla procesu potomnego (nieaktualne)
- DWORD: wskaźnik na drugi FCB dla procesu potomnego (nieaktualne)
- (dla AL=1) DWORD: po zakończeniu będzie zawierać początkowe SS:SP
- (dla AL=1) DWORD: po zakończeniu będzie zawierać początkowe CS:IP
Przykład:
mov [kom_ln+2], cs ;uzupełniamy pola potrzebnych struktur
mov [fcb1+2], cs
mov [fcb2+2], cs
mov ax, 4b00h ; funkcja uruchomienia programu
mov dx, program ; adres nazwy programu
mov bx, srod ; środowisko i cała reszta
int 21h ; uruchamiamy
....
fcb db 3, " ", 0, 0, 0, 0, 0
linia_kom db 0
times 7fh db 0dh
srod dw 0
kom_ln dw linia_kom, 0
fcb1 dw fcb, 0
fcb2 dw fcb, 0
- funkcja 4Ch - zakończ działanie bieżącego programu:
Argumenty:
- AH = 4Ch
- AL = kod wyjścia (errorlevel)
zwracany systemowi operacyjnemu (przyjmuje
się, że AL=0 oznacza zakończenie bez błędów)