254 9. Wykorzystanie procedur systemowych w programach użytkowych
• Przykład ilustrujący wykorzystanie funkcji 05H, 09H, OAH, OCH przerwania systemowego 21H.
Procedura uruchamia prosty test drukarki, polegający na wydrukowaniu 80 kolejnych znaków w wierszu, rozpoczynając pierwszy wiersz od spacji (20H), drugi od wykrzyknika ! (21H) itd. Test może zostać przerwany przez naciśnięcie dowolnego klawisza.
tekstl db Test drukarki rozpoczęty*, 10,13,’$’ tekst_2 db Test został przerwany !*,10,13,’$’
TEST |
proc far | |
start: |
mov ah,0CH |
; wyzerowanie bufora klawiatury |
mov al,0FFH |
; i powrót do programu | |
int 21H . | ||
mov dx,offset tekst l |
; wyświetlenie komunikatu na | |
mov ah,09H |
; na ekranie monitora | |
int 21H | ||
poczat: |
mov bl,20H |
; kod pierwszego znaku zainicjowany |
powtorz: |
mov dl,bl | |
mov cx,80 |
80 znaków w wierszu | |
mov ah,05H |
drukuj jeden znak z rejestru dl | |
pętla: |
int 21H | |
inc dl |
następny znak | |
emp dl,7FH |
czy wszystkie znaki wydrukowano ? | |
jnz dalej |
nie, drukuj dalej | |
mov dl,20H |
dla znaków o kodach 00H-1FH | |
or dl,dl |
ZF«-0 | |
dalej: |
loopnz pętla |
pętla dla 80 znaków |
mov dl, 13 |
koniec wiersza, wysłanie znaku CR | |
int 21H |
ah = 05H ! | |
mov dl, 10 |
wysłanie znaku LF | |
int 21H |
ah = 05H ! | |
mov ah,0BH |
czy bufor klawiatury jest | |
int 21H |
w dalszym ciÄ…gu pusty ? | |
or al,al |
al = 0 ? (czy w buforze jest znak?) | |
jz linia |
nie, drukuj następny wiersz | |
mov dx,offset tekst J2 |
tak, wyświetlenie komunikatu | |
mov ah,09H |
na ekranie monitora | |
int 21H | ||
jmp koniec ; |
zakończenie procedury | |
linia: |
inc bl |
pierwszy znak następnego wiersza |
emp bl,7FH ; |
czy koniec znaków ? | |
jnz powtorz ; |
nie, kolejny wiersz | |
jmp poczat ; tak, test od poczÄ…tku | ||
koniec: |
ret | |
TEST |
endp |
powered by
Przykłady programów przedstawione w tym rozdziale zostały przygotowane i uruchomione na mikrokomputerze IBM XT, przy wykorzystaniu makroasemblera MASM wersja 4.0. Przykłady są kompletne, sprawdzone i mogą być pomocne Czytelnikowi do zrozumienia zagadnień przedstawionych w poprzednich rozdziałach. Przykłady zostały tak dobrane, aby zilustrować działanie jak największej liczby dyrektyw języka oraz rozkazów mikroprocesora.
Prezentowany program oblicza 1000 liczb pierwszych, rejestruje czas obliczeń i w zależności od sposobu wywołania, wyświetla obliczone liczby pierwsze na ekranie monitora. Może służyć jako prosty test (ang. benchmark program ), pozwalający porównać szybkości różnych mikrokomputerów, a także szybkość obsługi ekranu monitora do wyświetlania prostych komunikatów. Program wykorzystuje funkcje systemu MS-DOS wywoływane rozkazem przerwania INT 21H i jest przygotowany jako program w pliku o rozszerzeniu EXE. Przedstawiono sposób konstrukcji segmentu programu, segmentu danych i segmentu stosu. Zastosowano standardowy algorytm generowania liczb pierwszych. Poszukiwanie rozpoczyna się od liczby 2, która jest umieszczona na końcu tablicy liczb pierwszych. Następnie sprawdza się, czy liczba o jeden większa od ostatniej znalezionej liczby pierwszej, dzieli się bez reszty przez wszystkie znalezione wcześniej, mniejsze od niej liczby pierwsze. Zamieszczony wydruk programu jest bogato skomentowany i zdaniem autora nie wymaga dodatkowego opisu. Uruchomienie gotowego testu (programu) może być następujące X > TEST 1
dla opcji programu bez wyświetlania liczb na ekranie, lub też X > TEST 2
dla opcji programu z wyświetlaniem wygenerowanych liczb na ekranie monitora. X > jest zgłoszeniem bieżącego dysku. Uruchomienie programu bez parametru, lub