252 9. Wykorzystanie procedur systemowych w programach użytkowych
ścieżkę dostępu do pliku o nowej nazwie. Po wykonaniu operacji CF = 1 informuje o błędzie: AX = 2 - pliku nie znaleziono, AX = 5 - niemożliwy dostęp do pliku, AX = 17 - niezgodność numeru stacji dysków. Jeżeli CF = 0, to operacja wykonała się prawidłowo (ang. move a directory entry; rename file ).
57H - pobranie (zmodyfikowanie) daty (godziny) ostatniego zapisu do pliku. Poszczególne rejestry oznaczają: AL = 0 - pobranie daty i godziny, AL=1 - zapisanie nowej daty i godziny, BX - numer kanału logicznego, CX - czas (pobrany lub do zapisu), DX - data (pobrana lub do zapisu). Jeżeli po wykonaniu operacji CF = 1, to wystąpił błąd: AX = 1 - zły numer w AL, AX = 6 - zły numer kanału. Jeżeli CF = 0, to operacja wykonana została prawidłowo (ang. gett set datę and time offile ). v'
• Przykład wykorzystania funkcji 2AH i 2BH przerwania INT 21H, związanych czasem systemowym.
Procedura DZIEŃ" pobiera datę z systemu, zwiększa o jeden numer dnia miesiąca i jeżeli potrzeba, także numer miesiąca oraz roku. Zmodyfikowana data jest ponownie wprowadzana do systemu.
miesiąc db 31,28,31,30,31,30,31,31,30, 31,30,31 DZIEŃ proc far
mov ah,2AH int 21H inc dl xor bx,bx mov bl,dh dec bx
emp dl,miesiac[bx]
jle koniec mov dl,l inc dh emp dh,12 jle koniec mov dh,l inc cx mov ah,2BH int 21H ret endp
start:
koniec:
DZIEŃ
; funkcja pobrania daty
zwiększenie o 1 numeru dnia rejestr BX będzie indeksem w rejestrze BL jest numer miesiąca tablica zaczyna się od indeksu 0
czy był ostatni dzień miesiąca ?
nie - wstaw więc nową datę tak - ustaw dzień równy "1" i zwiększ o 1 numer miesiąca czy był już grudzień ? nie - wstaw więc nową datę tak - ustaw miesiąc styczeń zwiększenie o 1 numeru roku funkcja wstawienia daty do systemu wg rejestrów DL,DH,CX
• Przykładowa procedura realizująca operację podobną do zlecenia TYPE w systemie MS-DOS.
Plik PROGRAM.ASM znajdujący się na dysku w stacji B, zostanie w wyniku działania procedury wyświetlony na ekranie monitora. Wyświetlanie kończy się po napotkaniu kodu znaku Ctrl-Z. W programie korzysta się z funkcji 02H, 09H, OFH, 10H, 14H, 1AH wywoływanych przerwaniem INT 21H.
feb db 2,PROGRAM ASM
db |
25 dup (?) | |
bufor |
db |
128 dup (?),"$" |
TYPEl |
proc |
far |
start: |
mov |
dx,offset bufor |
mov |
ah,lAH | |
int |
21H | |
mov |
dx,offset feb | |
mov |
ah,0FH | |
int |
21H | |
czytaj: |
mov |
dx,offset feb |
mov |
ah,14H | |
int |
21H | |
emp |
al,02H | |
je |
koniec | |
emp |
al,02H | |
jg |
trochÄ™ | |
mov |
dx,offset bufor | |
mov |
ah,09H | |
int |
21H | |
jmp |
czytaj | |
trochÄ™: |
emp |
al,03H |
jne |
koniec | |
xor |
si,si | |
eof? |
emp |
bufor[si],26 |
je |
koniec | |
mov |
dl,bufor[si] | |
mov |
ah,02H | |
int |
21H | |
inc |
si | |
jmp |
eof? | |
koniec: |
mov |
dx,offset feb |
mov |
ah,10H | |
int ret |
21H | |
TYPE 1 |
endp |
; blok FCB dla pliku ; bufor DTA do transmisji ; deklaracja adresu bufora DTA
; otworzenie pliku dyskowego
odczytanie sekwencyjne rekordu
czy koniec pliku ? lak, koniec procedury czy koniec pliku z częściowym rekordem ? tak nie, zatem wyświetlenie zawartości bufora na ekran monitora następny rekord częściowy rekord w buforze ? nie, więc koniec procedury SI będzie indeksem czy w buforze jest Ctrl-Z ?
tak, koniec procedury nie, pobierz znak wyświetlenie znaku
następny znak
zamknięcie pliku