sw sprawozdanie lab2 v2


WOJSKOWA AKADEMIA TECHNICZNA
SYSTEMY WBUDOWANE
SPRAWOZDANIE
Z ĆWICZENIA LABORATORYJNEGO
NR 2
TEMAT: Tryby pracy procesorów firmy INTEL
Prowadzący laboratorium: dr inż. Artur Arciuch, mgr inż. Waldemar Szylberg
Celem ćwiczenia laboratoryjnego było zapoznanie się z trybami pracy procesora firmy
INTEL ( Real Mode i  Protected Mode ) oraz napisanie odpowiedniego programu, który
zarzÄ…dza:
- 3 zadaniami uruchamianymi w trybie  Normal Mode
- 3 zadaniami uruchamianymi w trybie  Protected Mode
Tryb chroniony stwarza możliwość użycia naprawdę dużej ilości pamięci (do 4 GB na
386, w przeciwieństwie do dotychczasowego 1 MB). Nie trzeba już używać powolnych EMS
i XMS by dostać się do pamięci rozszerzonej. Niestety wszystkie przerwania BIOS lub
DOS'a, których używa się w RM, przykładowo, do obsługi plików, staja się bezużyteczne bo
nie mogą działać w PM, dlatego trzeba napisać własne handlery do klawiatury, zegara etc.
Wprowadzenie mechanizmów ochrony pamięci wymagało podjęcia specjalnych
środków. Każdy segment (kod, dane, stos) opisywany jest przez tzw. deskryptor. Zadaniem
deskryptora jest określenie BAZY SEGMENTU (jego fizycznego adresu w pamięci, np. dla
bufora VGA adres bazowy wynosi 0A0000h), LIMITU (rozmiaru segmentu - może wynosić
od 1B do 4GB) oraz jego TYPU/FLAG (czy segment zawiera dane, kod, etc.)
Technicznie rzecz biorąc deskryptor jest to 8-bajtowa struktura danych, która rezyduje gdzieś
w pamięci operacyjnej i ma następujący format:
Znaczenie kolejnych bajtów jest następujące:
0, 1 - młodsze słowo długości segmentu (limitu)
2, 3 - młodsze słowo adresu bazowego segmentu
4 - młodszy bajt starszego słowa adresu bazowego
5 - flagi segmentu
6 - starszy półbajt limitu i tzw. flagi dostępu
7 - starszy bajt starszego słowa adresu bazowego
Postanowiono grupować deskryptory w tablice tzn. kolejno następujące po sobie deskryptory,
np:
desc_null db 0, 0, 0, 0, 0, 0, 0, 0
desc_code32 db 0FFh, 0FFh, 0h, 0h, 0h, 0FAh, 0CFh, 0h
desc_data32 db 0FFh, 0FFh, 0h, 0h, 0h, 0F2h, 0CFh, 0h
Wyróżniamy 3 typy tablic: GDT (Globalna Tablica Deskryptorów), LDT (Lokalna
Tablica Deskryptorów; używana przez pojedynczy proces w systemie) oraz IDT (Tablica
Deskryptorów Przerwań). Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego
dysponuje specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy
oraz jej długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
W RM pojawienie się przerwania (wywołanego przez instrukcje INT lub urządzenie
zewnętrzne typu klawiatura) powodowało, ze procesor, po odłożeniu na stos rejestru flag oraz
CS i IP, skakał pod adres określony w tablicy wektorów przerwań. Tablica ta znajduje się
zawsze na początku pamięci pod adresem 0000:0000 i ma długość 1kB (256 przerwań * 4
czyli rozmiar wektora CS:IP). W pmode , ta tablica jest już bezużyteczna. Rejestr IDTR,
podobnie jak omawiany GDTR, zawiera adres fizyczny i długość nowej tablicy. Jest to tzw.
Interrupt Descriptor Table czyli Tablica Deskryptorów Przerwań. W przeciwieństwie do RM,
tablica ta może znajdować się w dowolnym miejscu w pamięci. Maksymalnie zawiera 256
deskryptory. Gdy w PM ma miejsce przerwanie, procek odszukuje dany deskryptor mnożąc
numer przerwania przez 8 i dodajÄ…c adres tablicy zawarty w IDTR.
Rejestr CR0  odpowiada za sterowanie pracÄ… procesora.
Budowa rejestru CR0 dla procesora zgodnego z i386,
gdzie:
PG  (ang. Paging Enable) - bit stronicowania
ET  (ang. Procesor Extension Type) - bit typu koprocesora,
TS  (ang. Task Switched) - bit przełączania zadania,
EM  (ang. Emulate Coprocessor) - bit trybu emulacji koprocesora,
MP  (ang. Monitor Coprocessor) - bit monitorowania koprocesora,
PE  (ang. Protected Mode Enable) - bit trybu chronionego
Aby procesor pracował w protected mode zerowy bit z rejestru CR0 musi być ustawiony na
 1 . Można tego dokonać prostym kodem:
mov eax, cr0
or eax, 1
mov cr0, eax
Kod programu przełączającego zadania w trybach Real Mode i Protected Mode
Comment |
Program przelaczajacy w tryb protect mode
|
.386p
CR EQU 0DH
LF EQU 0AH
;-------------------------------------------------------------------------
; globalna tablica deskryptorow
segment_GDT SEGMENT use16
dq 0 ; poz. 0 - deskryptor zerowy (nieuzywany)
dq 0 ; poz. 1 - selektor 0008H
dq 0 ; poz. 2 - selektor 0010H - segment 'nowe_dane'
dq 0 ; poz. 3 - selektor 0018H
dq 0 ; poz. 4 - selektor 0020H
dq 0 ; poz. 5 - selektor 0028H
dq 0 ; poz. 6 - selektor 0030H
dq 0 ; poz. 7 - selektor 0038H
dq 0 ; poz. 8 - selektor 0040H
dq 0 ; poz. 9 - selektor 0048H
dq 0 ; poz.10 - selektor 0050H
dq 0 ; poz.11 - selektor 0050H
dq 0 ; poz.12 - selektor 0050H
dq 0 ; poz.13 - selektor 0050H
dq 0 ; poz.13 - selektor 0050H
segment_GDT_end LABEL byte
segment_GDT ENDS
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
;-------------------------------------------------------------------
; tablica deskryptorow przerwan
segment_IDT SEGMENT use16
; Tablica zawiera furtki prowadzace do procedur obslugi przerwań
; i wyjatkow o numerach 0 - 127. Pola 'offset' w kolejnych furtkach
; zawierac beda liczby 0, 7, 14, 21, itd.
xpom=0
REPT 128
dw xpom ; offset
dw 6 SHL 3 ; selektor
db 0 ; licznik
db 10000110B ; bajt dostepu
dw 0 ; rezerwa
xpom=xpom+7
ENDM
segment_IDT_end LABEL byte
segment_IDT ENDS
;-------------------------------------------------------------------------
; segment danych dla trybu chronionego - segment ten wskazywany jest przez
; selektor 2 * 8 = 0010H
nowe_dane SEGMENT use16
kom4 db 'Procesor pracuje w trybie chronionym '
db ' - wcisniecie czegos spowoduje wyjscie'
db ' - nacisniecie ESC spowoduje zakonczenia programu',0
kom5 db 'Nierozpoznane polecenie', 0
txt_czas db 'czas',13,0
bufor_klaw db 128 dup (?) ; bufor klawiatury
indeks_klaw dw 0
indeks_zeg dw 0
ekran_x db 0 ; wskaznik nr kolumny do zapisu na ekranie
ekran_y db 0 ; wskaznik nr wiersza do zapisu na ekranie
; tablica do przekodowania kodow pozycji na kody ASCII
pozycja dw 160*12+80
x dw 1
y dw 1
tabl_przekA db 0, 1BH, '1234567890-=',08H, 09H ; kody 0 - 15
db 'qwertyuiop[]', 0DH, 0, 'as' ; kody 16 - 31
db 'dfghjkl;''`',0,'\zxcv' ; kody 32 - 47
db 'bnm,./',0,'*',0,' ',0 ; kody 48 - ...
nowe_dane_end LABEL byte
nowe_dane ENDS
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
;-------------------------------------------------------------------------
nowy_stos SEGMENT use16 ; stos dla trybu chronionego
pstos dw 2048 dup (?)
nowy_stos_end LABEL byte
nowy_stos ENDS
;---------------------------------------------------------------------------
stos_RM SEGMENT use16 stack ; stos dla trybu rzeczywistego
dw 256 dup (?)
stos_RM ENDS
;---------------------------------------------------------------------------
ekran SEGMENT use16 at 0B800H ; segment imitujacy pamiec ekranu
db 4000 dup (?)
ekran_end LABEL byte
ekran ENDS
;---------------------------------------------------------------------------
rozkazy SEGMENT use16 ; rozkazy programu
; obszary 48-bitowe potrzebne do ladowania rejestrow GDTR oraz IDTR
zaw_GDTR dp 0
zaw_IDTR dp 0
rm_idt LABEL qword ; wskaznik do tabl. wekt. przerwan (tryb rzecz.)
dw 03FFH ; wielko?? tablicy IDT
dd 0
czy_koniec db 0
komunikat1 db 'Wcisnij cos aby przelaczyc w Protected Mode',CR, LF, '$'
komunikat2 db 'Real Mode', CR, LF, '$'
komunikat3 db 'Zakonczono program',CR,LF,'$'
zadania dw zy1,zy2,zy3Definicja globalnej tablicy deskryptorów. Każdy segment
(kod, dane, stos) opisywany jest przez tzw. deskryptor. Zadaniem deskryptora jest
określenie BAZY SEGMENTU (jego fizycznego adresu w pamięci, np. dla bufora VGA
adres bazowy wynosi 0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do
4GB) oraz jego TYPU/FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
komunikat1z db 'Zadanie1 w RealMode',CR,LF,'$'
komunikat2z db 'Zadanie2 w RealMode',CR,LF,'$'
komunikat3z db 'Zadanie3 w RealMode',CR,LF,'$'
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
;----------------------------------------------------------------------
; kod wykonywany ponownie w trybie rzeczywistym bezposrednio przed
; zakonczeniem wykonywania programu
ASSUME cs:rozkazy
ptt3:
lidt cs:rm_idt ; podanie adresu tabl. wektorow przerwan
; dla trybu rzeczywistego
mov ax, SEG stos_RM ; tworzenie stosu dla trybu rzecz.
mov ss, ax
mov sp, 80H
sti
call czysc_ekran
push cs
pop ds
mov dx, OFFSET komunikat2
mov ah, 09H
int 21H ; wyswietlenie komunikatu
mov al,byte ptr [czy_koniec]
cmp al,0
je pocz;
pelny_koniec:
mov dx, OFFSET komunikat3
mov ah, 09H
int 21H
mov ax,4C00H ; zakonczenie wykonywania programu
int 21H
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
;----------------------------------------------------------------------
; kod wykonywany w trybie rzeczywistym bezposrednio po uruchomieniu programu
pocz: nop
mov al,34h
out 43h,al
mov al,0ffh
out 40h,al
mov al,0ffh
out 40h,al
; Wyswietlanie komunikatow o przeznaczeniu programu i oczekiwanie
; na potwierdzenie dalszego wykonywania programu
call czysc_ekran
jmp cd_przyg
; czyszczenie ekranu - przewiniecie okna o zero wierszy
czysc_ekran PROC near
mov ah, 06 ; przewiniecie okna
mov al, 0 ; zero wierszy
mov bh, 07 ; atrybut
mov ch, 0 ; wspolrzedne okna
mov cl, 0 ; lewy gorny rog
mov dh, 24 ; prawy dolny rog
mov dl, 79
int 10H
mov ah, 2 ; ustawienie kursora w gornym lewym rogu ekranu
mov dl, 0
mov dh, 0
mov bh, 0
int 10H
ret
czysc_ekran ENDP
zy1:
mov dx, OFFSET komunikat1z
mov ah, 09H
int 21H
ret
zy2:
mov dx, OFFSET komunikat2z
mov ah, 09H
int 21H
ret
zy3:
mov dx, OFFSET komunikat3z
mov ah, 09H
int 21H
ret
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
cd_przyg:
push cs
pop ds
dalej_RM:
call [zadania]
call [zadania+2]
call [zadania+4]
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
mov dx, OFFSET komunikat1
mov ah, 09H
int 21H ; wyswietlenie komunikatu
mov ah, 07H ; oczekiwanie na nacisniecie klawisza
int 21H
cmp al,27
je pelny_koniec; nacisnieto Esc
call czysc_ekran;
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
; tworzenie deskryptorów w globalnej tablicy deskryptorów Definicja globalnej tablicy
deskryptorów. Każdy segment (kod, dane, stos) opisywany jest przez tzw. deskryptor.
Zadaniem deskryptora jest określenie BAZY SEGMENTU (jego fizycznego adresu w
pamięci, np. dla bufora VGA adres bazowy wynosi 0A0000h), LIMITU (rozmiaru
segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/FLAG (czy segment zawiera
dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
(na razie wszystkie
; pola w deskryptorach zawieraj? zera)
; we wszystkich deskryptorach bajt 6 (bity G, D, 0, AVL, rozmiar 19 - 16)
; pozostawiany jest bez zmian (zawiera zero)
; ASSUME ds:segment_GDT
mov ax, SEG segment_GDT
mov ds, ax ; ladowanie rejestru DS
; tworzenie deskryptora na pozycji 2 w GDT - deskryptor ten opisuje
; segment 'nowe_dane'
mov bx, 2 * 8 ; offset w segmencie segment_GDT
mov word PTR ds:[bx], OFFSET nowe_dane_end - 1 ; rozmiar segmentu
mov ax, SEG nowe_dane
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov ds:[bx]+2,ax ; adres bazowy 15 - 0
rol eax, 16 ; zamiana polowek EAX
mov ds:[bx]+4, al ; adres bazowy 23 - 16
mov ds:[bx]+7, ah ; adres bazowy 31 - 24
mov byte PTR ds:[bx]+5, 10010010B ; bajt dostepu
; tworzenie deskryptora na pozycji 3 w GDT - deskryptor ten opisuje
; segment 'ekran'
mov bx, 3 * 8 ; offset w segmencie segment_GDT
mov word PTR ds:[bx], OFFSET ekran_end - 1 ; rozmiar segmentu
mov ax, SEG ekran
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov ds:[bx]+2,ax ; adres bazowy 15 - 0
rol eax, 16 ; zamiana polowek EAX
mov ds:[bx]+4, al ; adres bazowy 23 - 16
mov ds:[bx]+7, ah ; adres bazowy 31 - 24
mov byte PTR ds:[bx]+5,10010010B ; bajt dostepu
; tworzenie deskryptora na pozycji 6 w GDT - deskryptor ten opisuje
; segment 'obsl_int'
mov bx, 6 * 8 ; offset w segmencie segment_GDT
mov word PTR ds:[bx], OFFSET obsl_int_end - 1 ; rozmiar segmentu
mov ax, SEG obsl_int
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov ds:[bx]+2,ax ; adres bazowy 15 - 0
rol eax, 16 ; zamiana polowek EAX
mov ds:[bx]+4, al ; adres bazowy 23 - 16
mov ds:[bx]+7, ah ; adres bazowy 31 - 24
mov byte PTR ds:[bx]+5,10011010B ; bajt dostepu
; tworzenie deskryptora na pozycji 7 w GDT
mov bx, 7 * 8 ; offset w segmencie segment_GDT
mov word PTR ds:[bx], OFFSET nowy_stos_end - 1 ; rozmiar segmentu
mov ax, SEG nowy_stos
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov ds:[bx]+2,ax ; adres bazowy 15 - 0
rol eax, 16 ; zamiana polowek EAX
mov ds:[bx]+4, al ; adres bazowy 23 - 16
mov ds:[bx]+7, ah ; adres bazowy 31 - 24
mov byte PTR ds:[bx]+5,10010010B ; bajt dostepu
; tworzenie deskryptora na pozycji 8 w GDT
mov bx, 8 * 8 ; offset w segmencie segment_GDT
mov word PTR ds:[bx], OFFSET rozkazy_end - 1 ; rozmiar segmentu
mov ax, SEG rozkazy
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov ds:[bx]+2,ax ; adres bazowy 15 - 0
rol eax, 16 ; zamiana polowek EAX
mov ds:[bx]+4, al ; adres bazowy 23 - 16
mov ds:[bx]+7, ah ; adres bazowy 31 - 24
mov byte PTR ds:[bx]+5,10011010B ; bajt dostepu
; tworzenie deskryptora na pozycji 9 w GDT - deskryptor uzywany jako
; atrapa przy przejsciu z trybu chronionego do rzeczywistego (w tym
; przypadku adres bazowy w deskryptorze nie ma zadnego znaczenia)
mov bx, 9 * 8 ; offset w segmencie segment_GDT
mov word PTR ds:[bx],0FFFFH ; wymagany rozmiar segmentu
; bajt dostepu musi opisywac segment danych (fikcyjny), w ktorym:
; P=1, ED=0, W=1
mov byte PTR ds:[bx]+5,10010010B ; bajt dostepu
; tworzenie deskryptora na pozycji 10 w GDT - deskryptor ten opisuje
; segment kodu 'roz_zak', ktory jest wykonywany bezposrednio przed
; przejsciem do trybu rzeczywistego (pole "wielkosc" = FFFFH)
mov bx, 10 * 8 ; offset w segmencie segment_GDT
mov word PTR ds:[bx], 0FFFFH ; rozmiar segmentu
mov ax, SEG roz_zak
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov ds:[bx]+2,ax ; adres bazowy 15 - 0
rol eax, 16 ; zamiana polowek EAX
mov ds:[bx]+4, al ; adres bazowy 23 - 16
mov ds:[bx]+7, ah ; adres bazowy 31 - 24
mov byte PTR ds:[bx]+5,10011010B ; bajt dosteu
; tworzenie deskryptora na pozycji 11 w GDT
mov bx, 8 * 11 ; offset w segmencie segment_GDT
mov word PTR ds:[bx], OFFSET zad1_end- 1 ; rozmiar segmentu
mov ax, SEG zad1
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov ds:[bx]+2,ax ; adres bazowy 15 - 0
rol eax, 16 ; zamiana polowek EAX
mov ds:[bx]+4, al ; adres bazowy 23 - 16
mov ds:[bx]+7, ah ; adres bazowy 31 - 24
mov byte PTR ds:[bx]+5,10011010B ; bajt dostepu
; tworzenie deskryptora na pozycji 11 w GDT
mov bx, 8 * 12 ; offset w segmencie segment_GDT
mov word PTR ds:[bx], OFFSET zad2_end- 1 ; rozmiar segmentu
mov ax, SEG zad2
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov ds:[bx]+2,ax ; adres bazowy 15 - 0
rol eax, 16 ; zamiana polowek EAX
mov ds:[bx]+4, al ; adres bazowy 23 - 16
mov ds:[bx]+7, ah ; adres bazowy 31 - 24
mov byte PTR ds:[bx]+5,10011010B ; bajt dostepu
; tworzenie deskryptora na pozycji 11 w GDT
mov bx, 8 * 13 ; offset w segmencie segment_GDT
mov word PTR ds:[bx], OFFSET zad3_end- 1 ; rozmiar segmentu
mov ax, SEG zad3
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov ds:[bx]+2,ax ; adres bazowy 15 - 0
rol eax, 16 ; zamiana polowek EAX
mov ds:[bx]+4, al ; adres bazowy 23 - 16
mov ds:[bx]+7, ah ; adres bazowy 31 - 24
mov byte PTR ds:[bx]+5,10011010B ; bajt dostepu
; tworzenie deskryptora na pozycji 11 w GDT
mov bx, 8 * 14 ; offset w segmencie segment_GDT
mov word PTR ds:[bx], OFFSET shed_end- 1 ; rozmiar segmentu
mov ax, SEG shed
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov ds:[bx]+2,ax ; adres bazowy 15 - 0
rol eax, 16 ; zamiana polowek EAX
mov ds:[bx]+4, al ; adres bazowy 23 - 16
mov ds:[bx]+7, ah ; adres bazowy 31 - 24
mov byte PTR ds:[bx]+5,10011010B ; bajt dostepu
; przygotowanie do wykonania rozkazu LGDT (ladowanie rejestru GDTRDefinicja globalnej
tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany jest przez tzw.
deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU (jego fizycznego
adresu w pamięci, np. dla bufora VGA adres bazowy wynosi 0A0000h), LIMITU
(rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/FLAG (czy
segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
)
mov ax, OFFSET segment_GDT_end ; rozmiar tablicy GDT
mov word PTR cs:zaw_GDTR+0, ax
mov ax, SEG segment_GDT ; adres (segmentowy) globalnej
; tablicy deskryptorow
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov dword PTR cs:zaw_GDTR+2, eax
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
; przygotowanie do wykonania rozkazu LIDT (ladowanie rejestru IDTR)
mov ax, OFFSET segment_IDT_end ; rozmiar tablicy GDT
mov word PTR cs:zaw_IDTR+0, ax
mov ax, SEG segment_IDT ; adres (segmentowy) tablicy
; deskryptorow przerwan
movzx eax, ax ; zerowanie starszej czesci EAX
shl eax, 4 ; w EAX adres bazowy segmentu
mov dword PTR cs:zaw_IDTR+2, eax
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
cli ; zablokowanie przyjmowania przerwan
lgdt cs:zaw_GDTR ; ladowanie rejestru GDTR
lidt cs:zaw_IDTR ; ladowanie rejestru IDTR
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
; przelaczenie do trybu chronionego
mov eax, CR0
or eax, 1
mov CR0, eax
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
jmp next ; oczyszczenie kolejki rozkazow
; oczekuj?cych na wykonanie
next: nopDefinicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos)
opisywany jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY
SEGMENTU (jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy
wynosi 0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz
jego TYPU/FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
; Skok daleki do nastepnej instrukcji - instrukcja ta powoduje zapisanie
; takze rejestru CS w taki sposob, ze selektor 0040H (czyli 8 * 8)
; wpisany do CS wskazuje na deskryptor w tablicy GDT, opisujacy
; niniejszy segment. Zatem bedzie dalej wykonywany kod z tego samego
; segmentu, ale rejestr CS zawiera teraz selektor, a nie adres segmentu.
; Rozkaz skoku dalekiego jest kodowany bajtowo poniewaz
; w asemblerze brak potrzebnego trybu adresowania 'jmp far PTR ca1'
DB 0EAH
DW tryb_PM
dw 8 * 8 ; selektor wskazujacy na deskryptor
; segmentu 'rozkazy'
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
tryb_PM: nop
;-------------------------------------------------------------------------
; przeprogramowanie uk?adu 8259, tak by przerwanie z zegara (nr 8 w trybie
; rzeczywistym) by?o zwi?zane z nr 32, przerwanie z klawiatury (nr 9)
; - z nr 33, itd.
call przestaw_8259Definicja globalnej tablicy deskryptorów. Każdy segment
(kod, dane, stos) opisywany jest przez tzw. deskryptor. Zadaniem deskryptora jest
określenie BAZY SEGMENTU (jego fizycznego adresu w pamięci, np. dla bufora VGA
adres bazowy wynosi 0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do
4GB) oraz jego TYPU/FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
; inicjalizacja stosu - segment stosu dla trybu chronionego
; opisany jest przez deskryptor 7
mov ax, 7 * 8
mov ss, ax
mov sp, 1000
; inicjalizacja rejestrow DS, ES, FS, GS - wpisanie selektora wskazujacego na
; segment 'nowe_dane'
mov ax, 2 * 8
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; call zeruj_bufor_klaw ; zerowanie bufora klawiatury
sti ; wlaczenie przyjmowania przerwan
; wyswietlenie komunikatu "Procesor pracuje w trybie chronionym"
mov bx, OFFSET kom4
call wyswietl
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
;-----------------------------------------------------------------------
; Glowna petla przyjmowania zlecen od uzytkownika w trybie chronionym
; sprawdz, czy w buforze klawiatury jest kod Enter (0DH) lub Esc (1BH)
czytaj_od_nowa:
mov ax, 2 * 8
mov ds, ax
; mov dx, 0 ; uzywany do sterowania wyswietlaniem
DB 0EAH
DW str1
dw 8 * 14
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
db 0
klaw14: mov cx, ds:indeks_klaw
jcxz klaw14 ; skok, gdy pusty bufor
mov ds:indeks_klaw,0
cmp cx,001Bh
jne klaw14b;
push ds
mov ax,8*8
mov ds,ax
mov al,1
mov byte ptr[czy_koniec],al
pop ds
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
klaw14b:
; przygotowanie do powrotu do trybu rzeczywistego - skok daleki
; do segmentu kodu (kodowany bajtowo, poniewaz
; w asemblerze brak potrzebnego trybu adresowania 'jmp far PTR przelacz_do_RM'
DB 0EAH
DW przelacz_do_RM
dw 10 * 8 ; nr pozycji deskryptora wskazujacego
; segment rozkazowy
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
; przeprogramowanie ukladu 8259, tak by przerwanie z zegara (nr 8 w trybie
; rzeczywistym) bylo zwiazane z nr 32, przerwanie z klawiatury (nr 9)
; - z nr 33, itd.
przestaw_8259 PROC
mov al,11H
out 20H,al ; ladowanie ICW1 (d4=1 - znacznik
; wskazujacy, ze programujemy ICW1
; bit d0=1 - znacznik ,ze wystapi ICW4
mov al,32
out 21H,al ; ustawienie bazowego wektora przerwan
; (ustawienie ICW2)
mov al,4
out 21H,al ; ICW3 - d2=1 - tryb niebuforowany, 8259 master
mov al,1
out 21H,al ; ICW4 - d0=1 - potwierdzenie ICW2 jako wektora
; przerwan
ret
przestaw_8259 ENDP
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
;--------------------------------------------------------------------------
; wyswietlanie tekstu na ekranie - tekst zawarty jest w segmencie danych
; dla trybu chronionego (selektor 0010H), a offset podany jest w BX
; tekst wyswietlany jest w wierszu wskazanym przez zmienna ekran_y
; ekran_x db 0 ; wskaznik nr kolumny do zapisu na ekranie
; ekran_y db 0 ; wskaznik nr wiersza do zapisu na ekranie
wyswietl PROCDefinicja globalnej tablicy deskryptorów. Każdy segment (kod, dane,
stos) opisywany jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie
BAZY SEGMENTU (jego fizycznego adresu w pamięci, np. dla bufora VGA adres
bazowy wynosi 0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB)
oraz jego TYPU/FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
; selektor 0010H (2 * 8) wskazuje deskryptor segmentu danych dla trybu
; chronionego ('nowe_dane')
push ds
push es
mov ax, 2 * 8
mov ds, ax
mov ax, 3 * 8 ; selektor pamieci ekranu
mov es,ax
mov al, 160
mul byte PTR ds:ekran_y ; w AX adres ekranu do zapisu
mov di, ax
mov ah,7 ; atrybut wyswietlania
ptl_kom: mov al,ds:[bx] ; pobranie kolejnego znaku komunikatu
or al, al
jz koniec_wysw ; bajt zerowy wskazuje koniec tekstu
mov es:[di],ax ; przeslanie znaku do pamieci ekranu
inc bx ; inkrementacja BX
inc di ; inkrementacja DI
inc di ; inkrementacja DI
jmp ptl_kom
koniec_wysw:
mov al, ds:ekran_y
inc al
cmp al, 23
jae przesun_ekran
mov ds:ekran_y, al
zak_wysw:
pop es
pop ds
ret
; przesuwanie calego ekranu o jeden wiersz w gore
przesun_ekran:
dec al
mov ds:ekran_y, al
mov ax, 3 * 8 ; selektor pamieci ekranu
mov ds, ax
mov es, ax
mov cx, 2000 - 240
mov si, 160
mov di, 0
cld
rep movsw
jmp zak_wysw
wyswietl ENDP
rozkazy_end LABEL near
rozkazy ENDS
;----------------------------------------------------------------------
roz_zak SEGMENT use16Definicja globalnej tablicy deskryptorów. Każdy segment
(kod, dane, stos) opisywany jest przez tzw. deskryptor. Zadaniem deskryptora jest
określenie BAZY SEGMENTU (jego fizycznego adresu w pamięci, np. dla bufora VGA
adres bazowy wynosi 0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do
4GB) oraz jego TYPU/FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
ASSUME cs:roz_zak
przelacz_do_RM: nopDefinicja globalnej tablicy deskryptorów. Każdy segment (kod,
dane, stos) opisywany jest przez tzw. deskryptor. Zadaniem deskryptora jest
określenie BAZY SEGMENTU (jego fizycznego adresu w pamięci, np. dla bufora VGA
adres bazowy wynosi 0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do
4GB) oraz jego TYPU/FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
; przywrØcenie tradycyjnych numerow przerwaÅ„
cli ; wylaczenie przyjmowania przerwan
mov al,11H
out 20H,al
mov al,8
out 21H,al
mov al,4
out 21H,al
mov al,1
out 21H,al ; ladowanie ICW4
mov al,0BCH
out 21H,al
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
; przed przejsciem do trybu rzeczywistego rejestry segmentowe powinny
; zawierac selektory wskazujace fikcyjny segment danych (zob. opis
; deskryptora 10)
mov ax, 9 * 8 ; deskryptor na pozycji nr 9 wskazuje
; fikcyjny segment danych
mov ds,ax
mov es,ax
mov ss,ax
mov fs, ax
mov gs, ax
; zerowanie bitu PG w CR0
mov eax, CR0
and eax, 7FFFFFFFH
mov CR0, eax
; zerowanie rejestru CR3
mov eax, 0
mov CR3, eax
; zerowanie bitu PE w rejestrze CR0 (wlaczenie trybu rzeczywistego)
mov eax, CR0
and eax,0FFFFFFFEHDefinicja globalnej tablicy deskryptorów. Każdy segment
(kod, dane, stos) opisywany jest przez tzw. deskryptor. Zadaniem deskryptora jest
określenie BAZY SEGMENTU (jego fizycznego adresu w pamięci, np. dla bufora VGA
adres bazowy wynosi 0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do
4GB) oraz jego TYPU/FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
mov CR0, eax
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
jmp far PTR ptt3Definicja globalnej tablicy deskryptorów. Każdy segment (kod,
dane, stos) opisywany jest przez tzw. deskryptor. Zadaniem deskryptora jest
określenie BAZY SEGMENTU (jego fizycznego adresu w pamięci, np. dla bufora VGA
adres bazowy wynosi 0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do
4GB) oraz jego TYPU/FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
roz_zak ENDS
;-----------------------------------------------------------------------
obsl_int SEGMENT use16
ASSUME cs:obsl_int
; Kazdemu przerwaniu odpowiadaj? 3 rozkazy zajmujace lacznie 7 bajtow.
; Pierwszy z tych rozkazow zapamietuje rejestr CX na stosie, zas nastepny
; wpisuje do CX nr przerwania lub wyjatku, co pozwala, w dalszej czesci
; procedury obslugi, zidentyfikowal przyczyne przerwania i ewentualnie
; podjal dzialania wlasciwe dla zaistnialego zdarzenia.
xpom=0
REPT 128
push cx ; nr przerwania lub wyjatku
mov cx,xpom
jmp proc_obsl
xpom=xpom+1
ENDM
ORG $+128 ; wymusza by nie wystepowaly JMP SHORT
proc_obsl: sti
push ds
push es
push ax
push bx
push dx
push si
cmp cx,33 ; czy przerwanie z klawiatury
je klawisze
sti
jmp przeskocz_klaw
; obsluga przerwania z klawiatury
klawisze:
in al,60H ; odczyt kodu pozycji klawisza
xor ah,ah ; zerowanie rejestru AH
push ax ; przechowanie rejestru AX
in al,61H
or al,82H
out 61H,al
and al,7FH
out 61H,al
pop ax ; odtworzenie rejestru AX
cmp al, 57
ja przeskocz_klaw ; nie sa obslugiwane klawisze o kodach
; pozycji > 55
mov bx, 2 * 8 ; selektor do segmentu 'nowe_dane'
mov ds, bx
mov si, OFFSET tabl_przekA
mov bl, al
xor bh, bh
mov al, ds:[si+bx]
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
dalej:
mov word PTR ds:indeks_klaw,ax
mov bx,3*8
mov es,bx
mov bx,ds:pozycja
mov es:[bx],al
jmp przeskocz_klaw
przeskocz_klaw:
mov al, 20H
out 20H, al ; end of interrupt (OCW2)
pop si
pop dx
pop bx
pop ax
pop es
pop ds
pop cx
iret
obsl_int_end LABEL near
obsl_int ENDS
shed SEGMENT use16
ASSUME cs:shed
z1 db 0
z2 db 0
z3 db 0
nz db 0
nzb db 0
str1:
DB 0EAH
DW s
dw 8 *11 ; selektor wskazujacy na deskryptorDefinicja globalnej tablicy
deskryptorów. Każdy segment (kod, dane, stos) opisywany jest przez tzw. deskryptor.
Zadaniem deskryptora jest określenie BAZY SEGMENTU (jego fizycznego adresu w
pamięci, np. dla bufora VGA adres bazowy wynosi 0A0000h), LIMITU (rozmiaru
segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/FLAG (czy segment zawiera
dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
za2:
DB 0EAH
DW ss1
dw 8 *12 ; selektor wskazujacy na deskryptorDefinicja globalnej tablicy
deskryptorów. Każdy segment (kod, dane, stos) opisywany jest przez tzw. deskryptor.
Zadaniem deskryptora jest określenie BAZY SEGMENTU (jego fizycznego adresu w
pamięci, np. dla bufora VGA adres bazowy wynosi 0A0000h), LIMITU (rozmiaru
segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/FLAG (czy segment zawiera
dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
za3:
DB 0EAH
DW sss
dw 8 *13 ; selektor wskazujacy na deskryptorDefinicja globalnej tablicy
deskryptorów. Każdy segment (kod, dane, stos) opisywany jest przez tzw. deskryptor.
Zadaniem deskryptora jest określenie BAZY SEGMENTU (jego fizycznego adresu w
pamięci, np. dla bufora VGA adres bazowy wynosi 0A0000h), LIMITU (rozmiaru
segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/FLAG (czy segment zawiera
dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
konza:
DB 0EAH
DW klaw14
dw 8 *8 ; selektor wskazujacy na deskryptor
; segmentu 'rozkazy'
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
shed_end label near
shed ENDS
Definicja globalnej tablicy deskryptorów. Każdy segment (kod, dane, stos) opisywany
jest przez tzw. deskryptor. Zadaniem deskryptora jest określenie BAZY SEGMENTU
(jego fizycznego adresu w pamięci, np. dla bufora VGA adres bazowy wynosi
0A0000h), LIMITU (rozmiaru segmentu - może wynosić od 1B do 4GB) oraz jego TYPU/
FLAG (czy segment zawiera dane, kod, etc.)
Definicja potrzebnych danych do działania programu w trybie chronionym
Adresy początku zadań
Komunikaty wyświetlane podczas przełączania między trybami Real i Protected Mode
Kończy działanie programu
Definicje zadań w trybie rzeczywistym
Wywołania procedur zadań
Wyświetla komunikat o możliwości przejścia w tryb Protected Mode lub wyjścia z
programu. Oczekuje na wciśnięcie klawisza, jeżeli wciśnięto ESC wychodzi z
programu, w przeciwnym przypadku przechodzi w tryb Protected
Rozpoczęcie uzupełniania globalnej tablicy deskryptorów tworzonymi deskryptorami
Procesor musi wiedzieć, gdzie takie tablice się znajdują i dlatego dysponuje
specjalnymi rejestrami, które zawierają 32-bitowy fizyczny adres danej tablicy oraz jej
długość. Są 3 rejestry: GDTR (przechowuje adres i długość GDT) oraz, analogicznie,
LDTR i IDTR. Każdy z tych rejestrów jest 48-bitowy.
Ustawienie wskazania na tablicę deskryptorów
Ustawienie wskazania na segment obsługi przerwań
Aadowanie obu wskazań do odpowiednich rejestrów
Uruchomienie trybu chronionego. Aby uruchomić ten tryb, pierwszy bit rejestru CR0
(stanu procesora) musi być ustawiony na 1
Czyszczenie kolejki rozkazów
Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, który trafia do rejestr CS
Wywołanie procedury, która maskuje oryginalne przerwania klawiatury i ustawia je na
wybrany przez nas numer, w tym przypadku przerwanie klawiatury przestawiane jest
z 9 na 33
Instrukcja mov ustawia adres komunikatu do wyświetlenia, a procedura wyświetl
realizuje wyświetlenie
Skok daleki do wykonywania zadań
Sprawdzanie czy nie został wciśnięty klawisz ESC przy próbie przełączenia z trybu
Protected Mode do Real, jeśli tak fakt ten zapisywany jest w zmiennej czy_koniec
Przełączenie do trybu Real Mode
Podmiana numerów przerwań dla zegara i klawiatury
Rozpoczęcie procedury wyświetlania na ekran określonego komunikatu, do BX należy
podać offset danego komunikatu przed wywołaniem procedury
Rozkazy zawarte w tym segmencie wykonywane są bezpośrednio przed przejściem z trybu
chronionego do trybu rzeczywistego
Rozpoczęcie przejścia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP
pozwala wyczyścić kolejkę rozkazów.
Przywracanie tradycyjnych numerów przerwań
Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przejście w tryb
rzeczywisty
Ustawianie odpowiednich bitów rejestrów potrzebnych do przejścia z trybu Protected
Mode do Real Mode
Daleki skok do poczÄ…tku programu w trybie rzeczywistym, gdzie sprawdzane jest czy
nie został wcześniej naciśnięty klawisz ESC, jeżeli tak następuje wówczas zakończenie
działania programu
Obsługa klawiatury w trybie Protected Mode
Instrukcja skoku do etykiety s w procedurze zad1
Instrukcja skoku do etykiety ss1 w procedurze zad2
Instrukcja skoku do etykiety sss w procedurze zad3
Skok do etykiety klaw14 w procedurze rozkazy
Sheduler zarzÄ…dzajÄ…cy zadaniami w trybie Protected Mode
zad1 SEGMENT use16
ASSUME cs:zad1
s:
push ds;
mov ax,8*3
mov ds,ax
mov al,'a'
mov bx,160*3
mov byte ptr ds:[bx],al
pop ds
DB 0EAH
DW za2
dw 8 * 14 ; selektor wskazujacy na deskryptor
; segmentu 'rozkazy'
zad1_end label near
zad1 ENDS
zad2 SEGMENT use16
ASSUME cs:zad2
ss1:
push ds;
mov ax,8*3
mov ds,ax
mov al,'b'
mov bx,160*4+2
mov byte ptr ds:[bx],al
pop ds
DB 0EAH
DW za3
dw 8 * 14 ; selektor wskazujacy na deskryptor
; segmentu 'rozkazy'
zad2_end label near
zad2 ENDS
zad3 SEGMENT use16
ASSUME cs:zad3
sss:
push ds;
mov ax,8*3
mov ds,ax
mov al,'c'
mov bx,160*5+4
mov byte ptr ds:[bx],al
pop ds
DB 0EAH
DW konza
dw 8 * 14 ; selektor wskazujacy na deskryptor
; segmentu 'rozkazy'
zad3_end label near
zad3 ENDS
END pocz
Wnioski
Tryb wykonywania przez procesory 8088 i 286 instrukcji 16-bitowych został
określony terminem trybu rzeczywistego (Real Mode). Wszystkie programy pracujące w
trybie rzeczywistym mogą korzystać tylko z instrukcji 16-bitowych i współpracować z
20-bitową architekturą pamięci (1 MB). Tego typu oprogramowanie z reguły jest
jednozadaniowe, co oznacza, że jednocześnie może być uruchomiony tylko jeden
program. Ponadto nie ma wbudowanej żadnego ochrony zapobiegającej wykorzystaniu
przez program obszaru pamięci już przydzielonego innemu programowi lub systemowi
operacyjnemu. Jeśli zatem uruchomiono więcej niż jeden program, dowolny z nich może
spowodować zawieszenie całego systemu.
Programy działające w trybie Protected Mode, 32-bitowym trybie pracy
procesora, otrzymują w odróżnieniu od trybu Real Mode własny obszar pamięci, przez co
nie dochodzi między nimi do konfliktów. Tego typu ochrona sprawia, że system jest o
wiele bardziej stabilny, ponieważ programy zawierające błąd nie mogą w prosty sposób
zaszkodzić innym programom lub samemu systemowi operacyjnemu. Poza tym program,
który się zawiesił, może być usunięty z pamięci bez szkody dla reszty systemu.
Zasadniczym celem ćwiczenia laboratoryjnego było napisanie programu
przełączającego zadania w powyższych trybach pracy procesora. Napisany program
uruchamiany był w środowisku DOSBox oraz TurboAssembler 5.0. Ponieważ realizuje
on wszystkie postawione założenia protokołu uważamy cel ćwiczenia laboratoryjnego za
osiągnięty.


Wyszukiwarka

Podobne podstrony:
sw sprawozdanie lab2 v5
sw sprawozdanie lab2 v4
sw sprawozdanie lab2 v1
sw sprawozdanie lab2 v1
tm sprawozdanie lab2 v2
sw sprawozdanie lab2 v3
Sprawozdanie lab2 Szewczak Piotr
sprawozdanie lab2
tm sprawozdanie lab2 v1
Mechanika płynów sprawozdanie z lab2
Sprawozdanie v2 OgarnijTemat com
lab2 sprawozdanie
SW LAB2 LukaszJanik
Różnice w sprawowaniu św Liturgii w prawosławnych Kościołach lokalnych
SW 3 Assembler 10 04 05 v2 cmaj

więcej podobnych podstron