|
 |
|
MENU |
|
|
|
|
|
 |
|
Czas i data |
|
|
|
|
|
|
|
|
|
|
|
Oprócz wielu innych funkcji , komputer posiada wewnętrzne urządzenia do odmierzania czasu. Możliwość precyzyjnego odmierzania odcinków czasowych ma istotne znaczenie w pracy komputera. Czas wykonania pewnych operacji musi być niezależny od procesora i urządzeń peryferyjnych, w oparciu o zegar czasu rzeczywistego systemy operacyjne prowadzą ewidencje plików oraz wiele innych funkcji systemowych.
Podstawowym źródłem informacji o upływającym czasie , wykorzystywanym przez system operacyjny jest systemowy. Zlicza on czas od momentu startu systemu impulsami generowanymi 18.2 razy na sekundę. odpowiedzialne jest za to przerwanie int 08H.Licznik ten kest zlokalizowany począwszy od adresu 0040:006CH. dzięki tym informacjom możemy określić kiedy komputer został załączony(zrestartowany).
W komputerze znajduje się także zegar czasu rzeczywistego. Pokazuje on czas w takiej formie do jakiej przyzwyczajeni są ludzie. Do obsługi zegarów służy przerwanie 1AH oraz funkcje 2AH-2DH przerwania 21H. Podstawowym przerwaniem jest oczywiście 1AH które składa się z kilku funkcji. Funkcja 00H przerwania 1Ah odczytuje licznik zegara systemowego
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
00H
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
Powrót po INT 1AH
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
00H-brak przepełnienia
|
-
|
-
|
Licznik (najstarsza część)
|
Licznik (starsza część)
|
Licznik (młodsza część)
|
Licznik (najmłodsza część)
|
-
|
-
|
Do ustalenia nowej wartości licznika zegara systemowego służy funkcja 01H przerwania 1AH.
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
01H
|
-
|
-
|
-
|
Licznik (najstarsza część)
|
Licznik (starsza część)
|
Licznik (młodsza część)
|
Licznik (najmłodsza część)
|
-
|
-
|
Powrót po INT 1AH
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
Przerwanie 1AH obsługuje również zegar czasu rzeczywistego RTC. Funkcja 02H przeznaczona jest do odczytu aktualnego czasu zegara RTC.
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
02H
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
Powrót po INT 1AH
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
-
|
-
|
-
|
Godziny w kodzie BCD
|
Minuty w kodzie BCD
|
Sekundy w kodzie BCD
|
-
|
-
|
Jeśli znacznik CF jest równy jeden to zegar nie pracuje
|
Kolejna funkcja służy do ustawienia czasu RTC AT.
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
03H
|
-
|
-
|
-
|
Godziny w kodzie BCD
|
Minuty w kodzie BCD
|
Sekundy w kodzie BCD
|
1 - czas letni
|
-
|
-
|
Powrót po INT 1AH
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
Poza zegarami przerwanie 1AH obsługuje także kalendarz.Do odczytu daty RTC przeznaczona jest funkcja 04H.
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
04H
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
Powrót po INT 1AH
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
-
|
-
|
-
|
Wiek w kodzie BCD
|
Rok w kodzie BCD
|
Miesiąc w kodzie BCD
|
Dzień w kodzie BCD
|
-
|
-
|
Przerwanie 1AH pozwala na też na ustawienie daty RTC AT. Przeznaczona jest do tego celu funkcja 05H.
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
05H
|
-
|
-
|
-
|
Wiek w kodzie BCD
|
Rok w kodzie BCD
|
Miesiąc w kodzie BCD
|
Dzień w kodzie BCD
|
-
|
-
|
Powrót po INT 1AH
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
Poza obsługą zegarów i kalendarza w komputerze znajduje się alarm (budzik RTC AT) który możemy ustawić na konkretny czas. W wybranym czasie zostanie uruchomione przerwanie 4AH z procedurą reakcji alarmu, z reguły jest to sygnał dźwiękowy.
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
06H
|
-
|
-
|
-
|
godziny w kodzie BCD
|
minuty w kodzie BCD
|
sekundy w kodzie BCD
|
-
|
-
|
-
|
Powrót po INT 1AH
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
ustawiony znacznik CF - RTC nie pracuje lub budzik już nastawiony
|
Do wyłączenia budzika RTC AT służy funkcja 07H przerwania 1Ah.
Zegar RTC i datę możemy ustawiać oraz odczytywać także funkcjami przerwania 21H. Różnią się one tym od funkcji przerwania 1AH tym , że operują na liczbach w systemie dziesiętnym. Funkcja 2AH zwraca aktualną datę.
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
2AH
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
Powrót po INT 21H
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
dzień tygodnia(0-niedziela ,..., 6-sobota)
|
-
|
-
|
starsza część roku
|
młodsza część roku
|
miesiąc
|
dzień
|
-
|
-
|
Funkcja 2BH perwrwania 21H ustawia aktualną datę.
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
2BH
|
-
|
-
|
-
|
Starsza część roku
|
Młodsza część roku
|
Miesiąc
|
Dzień
|
-
|
-
|
Powrót po INT 21H
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
0H-prawidłowa data
0FFH-błąd
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
Funkcja 2CH zwraca aktualny czas.
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
2CH
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
Powrót po INT 21H
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
-
|
-
|
-
|
godziny
|
minuty
|
sekundy
|
setne sekundy
|
-
|
-
|
Natomiast do ustalania czasu służy funkcja 2DH.
Wywołanie
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
Bufor |
inne |
2DH
|
-
|
-
|
-
|
godziny
|
minuty
|
sekundy
|
setne sekundy
|
-
|
-
|
Powrót po INT 21H
|
AH
|
AL
|
BH
|
BL
|
CH
|
CL
|
DH
|
DL
|
Bufor
|
inne
|
-
|
0 - prawidłowy czas
0FFH-błąd
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
-
|
Poniżej podaję kod programu do przetrenowania poznanych wyżej wiadomości oraz jego analizę. cseg segment
assume cs:cseg, ds:dane
pisz_znak proc
; znak jest dany jako parametr w AL
push AX
push BX
;zapamietanie rejestrow modyfikowanych w procedurze
mov ah,0EH
mov bx,0
int 10h
;przywracamy poprzednią zawartość AX i BX
pop BX
pop AX
ret
endp
pisz_nr proc
;procedura wypisujaca dwucyfrowa liczbe ktora podajemy do procedury w
;AL; algorytm jest troche lamerski, ale do naszych celow starczy
;OK - najpierw zapamietajmy rejestry, ktore bedziemy zmieniac w
;procedurce coby nie namieszac
push AX
push BX
;Ten algorytm zadziala dla AL <=99 - czyli dwoch cyfr.
;1. Dzielimy al przez 10, wypisujemy dziesiatki i jednosci
mov ah,00h
mov bh,10h
div bh
;AL zawiera iloraz AX/10
;AH zawiera reszte.
add al,'0'
;dodanie do AL kod ASCII znaku zero tak, ze obecnie al zawiera kod
;ASCII pierwszej cyfry w liczbie
call pisz_znak
mov al,ah
;teraz AL zawiera reszte z dzielenia, wypisujemy ja tez na ekran
add al,'0'
call pisz_znak
pop bx
pop ax
ret
endp
piszdate proc
;wypisuje date
mov ah,09h
mov dx,offset(jestdata)
int 21h
mov ah,2ah
int 21h
;teraz: cx=rok, dh=mies, dl=dzien
;piszemy dzien
mov al,dl
call pisz_nr
mov al,'-'
call pisz_znak
;piszemy miesiac
mov al,dh
call pisz_nr
mov al,'-'
call pisz_znak
;napisalismy procedure dla dwoch cyfr tutaj trzeba
;wypisac rejestr dwubajtowy (rok jest w formacie 1980-2079), ale
;obejdziemy to bardzo prosto - odejmiemy 1900 od cx, i zostanie nam w
;formacie 80-179 tzn. po dwutysiecznym roku zaczalby źle działać, ale nie
;zacznie, gdyz odejmiemy 100 (179-100=79).
sub cx,1900
cmp cl,100
jb przed2tys
;porownujemy mlodszy bajt CL z wartoscia graniczna - 100.
;Jesli jest mniejsze od 100 to znaczy, ze jest przed
;dwutysiecznym; jesli jest inaczej, to jest po dwutysiecznym i najpierw
;wypiszemy '20' a pozniej cl-100, czyli np. 20 | 75 - oczywiscie bez |
;wyjdzie 2075.
;no to piszemy '20'
mov al,20
call pisz_nr
sub cl,100
przed2tys:
mov al,cl
;piszemy dwie ostatnie cyfry roku
call pisz_nr
mov ah,09h
Lea dx,crlf
int 21h
ret
endp
piszczas proc
mov ah,09h
mov dx,offset(jestgodz)
int 21h
mov ah,2ch
int 21h
;teraz: ch=godz, cl=min, dh=sek
mov al,ch
call pisz_nr
mov al,':'
call pisz_znak
mov al,cl
;minuta
call pisz_nr
mov al,':'
call pisz_znak
mov al,dh
;sekunda
call pisz_nr
mov ah,09h
LEA dx,crlf
int 21h
ret
endp;
start:
mov ax,dane;
mov ds,ax
call piszdate
call piszczas
mov ax,4c00h
int 21h
cseg ends
dane segment
crlf db 13,10,'$'
jestdata db 'Dzisiaj jest $'
jestgodz db 'Jest godzina $'
dane ends
end start
Przerwanie zegarowe użytkownika
Przerwanie zegarowe urzytkownika jest wywoływane przy każdej modyfikacji zegara systemowego(co ok 50ms) Początkowo procedura tazawiera tylko instrukcję IRET. Przechwyując to przerwanie musisz pamiętać że jest ono wywoływane przez przerwanie sprzętowe IRQ0 dlatego inne przerwania nie będą przyjmowane dopóki nie zostanie przekazany do kontrolera 8259A sygnał o zakończeniu tego przerwania. Powoduje to , że podczas trwania tego przerwania nie można np. czytać z klawiatury itp.
|
Teraz 11182 odwiedzający (25985 wejścia) |
|
|
|
|
|
 |
|
Logowanie |
|
|
|
|
|
|
|
|
|
|