244
9. Wykorzystanie procedur systemowych w programach użytkowych
Program użytkowy kończy się przekazaniem sterowania do systemu operacyjnego. Może to być zrealizowane jednym z podanych sposobów
• Wywołanie funkcji 4CH za pośrednictwem INT 21H (33)
MOV AH,4CH INT 21H
Ten sposób jest zalecany, jest jednak dostępny dopiero dla systemu MS-DOS wersji 2.00 i późniejszych.
• Wywołanie przerwania 20H
INT 20H
Sposób stosowany najczęściej w plikach o rozszerzeniu COM. Warunkiem wywołania jest, to aby rejestr segmentu programu CS wskazywał początek obszaru PSP. Wymaganie to dotyczy także dwóch kolejnych sposobów.
• Skok do początku nagłówka segmentu programu
JMP 0
Komórka pamięci 0 w nagłówku segmentu programu zawiera rozkaz INT 20H, tak więc sposób ten jest równoważny drugiemu.
• Wywołanie funkcji 00H za pośrednictwem INT 21H (33)
MOV AH,0 INT21H
Funkcja 00H jest wywoływana przez INT 20H - oba sposoby są identyczne.
• Nadanie odpowiedniej wartości rejestrowi AH i skok (długi) pod adres 50H liczony względem początku obszaru PSP (zob. tabl. 8.2). Pod adresem tym znajdują się rozkazy INT 21H oraz RETF (co pozwala wywołać każdą funkcję MS-DOS). Zmiana rozkazów umieszczonych pod adresem względnym 50H pozwala na komunikowanie się przez ten łącznik z innymi modułami programowymi. Jeżeli nie zostały one odpowiednio skonsolidowane, a łącznik zmodyfikowany, to następuje wywołanie przerwania INT 21H i w naszym przypadku zakończenie programu.
Z pośród wymienionych przerwań systemowych MS-DOS w programach użytkowych można korzystać jedynie z przerwań: 20H, 21H, 25H, 26H oraz 27H
INT20H (32) - zakończenie programu użytkowego (ang.program tenninate ),
INT 21H (33) - wywołanie uniwersalych funkcji systemowych (ang. function request). INT 22H (34) - adres, do którego nastąpi skok po zakończeniu aktualnie wykonywanego programu (ang. tenninate address ); bajty 0000:0088H - 0000:008BH,
INT 23H (35) - adres, do którego nastąpi skok po naciśnięciu Ctrl-C (ang. Control-C exit address ); bajty 0000:008CH - 0000:008FH,
INT 24H (36) - adres, do którego nastąpi skok po napotkaniu istotnego błędu (ang. fatal error abort address ); bajty 0000:0090H - 0000:0093H,
INT 25H (37) - fizyczny odczyt kolejnych sektorów (ang. absolute disk read ),
powered by
9.2. Procedury systemowe MS-DOS
INT 26H (38) - fizyczny zapis kolejnych sektorów (ang. absolute disk write ),
INT 27H(39) - zakończenie wykonywanego programu, przy czym program pozostaje w pamięci operacyjnej i może być ponownie uruchomiony. Rejestry CS:DX powinny zawierać adres następnego bajtu po ostatnim bajcie kodu programu.
Przykład
MOV DX, OFFSET OSTATNIAJNSTRUKCJA INC DX
INT 27H ; Zobacz funkcjÄ™ AH = 31H dla INT 21H,
; która jest obecnie zalecana 4
INT 28H-40H (40-64) - zarezerwowane.
Szczegółowe omówienie wszystkich wymieniowych przerwań systemowych oraz funkcji wywoływanych za pośrednictwem INT 21H Czytelnik znajdzie w pozycjach literaturowych takich, jak [3], [9], [11] lub w przeglądowych artykułach w czasopismach profesjonalnych. W książce zostaną wymienione jedynie funkcje przerwania 21H, które pozwolą zorientować się w działaniu funkcji, ponadto umożliwią analizę programów publikowanych w większości czasopism poświęconych profesjonalnej informatyce. W dalszym ciągu pod pojęciem numeru funkcji będziemy rozumieć zawartość rejestru AH ustawianą w programie przed wywołaniem rozkazu INT 21H.
Wśród funkcji systemowych wyróżnia się funkcje zgodne z funkcjami systemu operacyjnego CP/M(R) oraz zgodne z funkcjami systemu XENIX. Te drugie są bezwzględnie zalecane, prostsze w użyciu, a ponadto pozwalają na pełne wykorzystanie cech systemu MS-DOS w wersji 2.0 i późniejszych, związanych z organizacją hierarchicznych systemów plików dyskowych z podrzędnymi katalogami (ang. sub-directońes ). Dopuszcza się, że przyszłe wersje systemu MS-DOS mogą nie realizować funkcji CP/M(R).
Funkcje wywoływane za pośrednictwem przerwania INT 21H
Zapis, np. 00H poprzedzający opis funkcji należy rozumieć jako AH = 00H.
Funkcje zgodne z funkcjami systemu CPIM (00H-24H)
00H - zakończenie wykonywanego programu (ang. terminal program ),
01H - oczekiwanie na naciśnięcie klawisza, odczytanie znaku z klawiatury i wysłanie echa na ekran. Kod znaku pozostaje w rejestrze AL (ang. read keyboard and echo ),
02H - wysłanie znaku na ekran. Kod znaku zostaje pobrany z rejestru DL (ang. display character),
03H - oczekiwanie na znak i odczytanie znaku z wejścia szeregowego AUX. Kod znaku pozostaje w AL, brak informacji o ewentualnych błędach (ang. aicdliary input),
04H - wysłanie znaku do wyjścia szeregowego AUX. Kod znaku zostaje pobrany z rejestru DL (ang. auxiliary output),
05H - wysłanie znaku pobranego z DL do standardowego równoległego sprzęgu drukarki PRN (ang.pn/i/ character),