plik


ÿþWOJSKOWA AKADEMIA TECHNICZNA SYSTEMY WBUDOWANE SPRAWOZDANIE Z DWICZENIA LABORATORYJNEGO NR 2 TEMAT: Tryby pracy procesorów firmy INTEL Prowadzcy laboratorium: dr in|. Artur Arciuch, mgr in|. Waldemar Szylberg Cel dwiczenia laboratoryjnego Celem dwiczenia laboratoryjnego byBo zapoznanie si z trybami pracy procesora firmy INTEL ( Real Mode i  Protected Mode ) oraz napisanie odpowiedniego programu, który zarzdza: - 3 zadaniami uruchamianymi w trybie  Normal Mode - 3 zadaniami uruchamianymi w trybie  Protected Mode Wstp teoretyczny Tryb chroniony stwarza mo|liwo[d u|ycia naprawd du|ej ilo[ci pamici (do 4 GB na 386, w przeciwieostwie do dotychczasowego 1 MB). Nie trzeba ju| u|ywad powolnych EMS i XMS by dostad si do pamici rozszerzonej. Niestety wszystkie przerwania BIOS lub DOS'a, których u|ywa si w RM, przykBadowo, do obsBugi plików, staja si bezu|yteczne bo nie mog dziaBad w PM, dlatego trzeba napisad wBasne handlery do klawiatury, zegara etc. Wprowadzenie mechanizmów ochrony pamici wymagaBo podjcia 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 pamici, np. dla bufora VGA adres bazowy wynosi 0A0000h), LIMITU (rozmiaru segmentu - mo|e wynosid od 1B do 4GB) oraz jego TYPU/FLAG (czy segment zawiera dane, kod, etc.) Technicznie rzecz biorc deskryptor jest to 8-bajtowa struktura danych, która rezyduje w pamici operacyjnej i ma nastpujcy format: Znaczenie kolejnych bajtów jest nastpujce: 0, 1 - mBodsze sBowo dBugo[ci segmentu (limitu) 2, 3 - mBodsze sBowo adresu bazowego segmentu 4 - mBodszy bajt starszego sBowa adresu bazowego 5 - flagi segmentu 6 - starszy póBbajt limitu i tzw. flagi dostpu 7 - starszy bajt starszego sBowa adresu bazowego Postanowiono grupowad deskryptory w tablice tzn. kolejno nastpujce 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 Przerwao). Procesor musi wiedzied, gdzie takie tablice si znajduj i dlatego dysponuje specjalnymi rejestrami, które zawieraj 32-bitowy fizyczny adres danej tablicy oraz jej dBugo[d. S 3 rejestry: GDTR (przechowuje adres i dBugo[d GDT) oraz, analogicznie, LDTR i IDTR. Ka|dy z tych rejestrów jest 48-bitowy. W RM pojawienie si przerwania (wywoBanego przez instrukcje INT lub urzdzenie zewntrzne typu klawiatura) powodowaBo, ze procesor, po odBo|eniu na stos rejestru flag oraz CS i IP, skakaB pod adres okre[lony w tablicy wektorów przerwao. Tablica ta znajduje si zawsze na pocztku pamici pod adresem 0000:0000 i ma dBugo[d 1kB (256 przerwao * 4 czyli rozmiar wektora CS:IP). W pmode , ta tablica jest ju| bezu|yteczna. Rejestr IDTR, podobnie jak omawiany GDTR, zawiera adres fizyczny i dBugo[d nowej tablicy. Jest to tzw. Interrupt Descriptor Table czyli Tablica Deskryptorów Przerwao. W przeciwieostwie do RM, tablica ta mo|e znajdowad si w dowolnym miejscu w pamici. Maksymalnie zawiera 256 deskryptory. Gdy w PM ma miejsce przerwanie, procesor odszukuje dany deskryptor mno|c numer przerwania przez 8 i dodajc 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 przeBczania 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 pracowaB w protected mode zerowy bit z rejestru CR0 musi byd ustawiony na  1 . Mo|na tego dokonad prostym kodem: mov eax, cr0 or eax, 1 mov cr0, eax Kod programu przeBczajcego zadania w trybach Real Mode i Protected Mode Comment | Program przelaczajacy w trybach real i protected 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 Komentarz [M1]: 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 pamici, np. dla ; tablica deskryptorow przerwan bufora VGA adres bazowy wynosi 0A0000h), LIMITU (rozmiaru segmentu - mo|e wynosid od 1B do 4GB) oraz jego segment_IDT SEGMENT use16 TYPU/FLAG (czy segment zawiera dane, ; Tablica zawiera furtki prowadzace do procedur obslugi przerwa¤ kod, etc.) ; 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 Komentarz [M2]: Definicja potrzebnych danych do dziaBania programu w trybie ;------------------------------------------------------------------------- chronionym 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 ; wielkosc 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,zy3 Komentarz [M3]: Zbiór etykiet zadao do wykonania dla trybu Real Mode komunikat1z db 'Zadanie1 w RealMode',CR,LF,'$' komunikat2z db 'Zadanie2 w RealMode',CR,LF,'$' komunikat3z db 'Zadanie3 w RealMode',CR,LF,'$' Komentarz [M4]: Komunikaty wy[wietlane podczas przeBczania midzy trybami Real i 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 Komentarz [M5]: Kooczy dziaBanie programu ;---------------------------------------------------------------------- ; 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 Komentarz [M6]: Definicje zadao w trybie rzeczywistym cd_przyg: push cs pop ds dalej_RM: call [zadania] call [zadania+2] call [zadania+4] Komentarz [M7]: WywoBania procedur zadao 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; Komentarz [M8]: Wy[wietla komunikat o mo|liwo[ci przej[cia w tryb Protected Mode lub wyj[cia z programu. Oczekuje na ; tworzenie deskryptorów w globalnej tablicy deskryptorów (na razie wszystkie wci[nicie klawisza, je|eli wci[nito ESC ; pola w deskryptorach zawieraj? zera) wychodzi z programu, w przeciwnym ; we wszystkich deskryptorach bajt 6 (bity G, D, 0, AVL, rozmiar 19 - 16) przypadku przechodzi w tryb Protected ; pozostawiany jest bez zmian (zawiera zero) Komentarz [M9]: Rozpoczcie ; ASSUME ds:segment_GDT uzupeBniania globalnej tablicy mov ax, SEG segment_GDT deskryptorów tworzonymi deskryptorami 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 dostepu ; 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 GDTR) Komentarz [M10]: Procesor musi wiedzied, gdzie takie tablice si znajduj i mov ax, OFFSET segment_GDT_end ; rozmiar tablicy GDT dlatego dysponuje specjalnymi rejestrami, mov word PTR cs:zaw_GDTR+0, ax które zawieraj 32-bitowy fizyczny adres mov ax, SEG segment_GDT ; adres (segmentowy) globalnej danej tablicy oraz jej dBugo[d. S 3 rejestry: ; tablicy deskryptorow GDTR (przechowuje adres i dBugo[d GDT) movzx eax, ax ; zerowanie starszej czesci EAX oraz, analogicznie, LDTR i IDTR. Ka|dy z shl eax, 4 ; w EAX adres bazowy segmentu tych rejestrów jest 48-bitowy. mov dword PTR cs:zaw_GDTR+2, eax ; 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 Komentarz [M12]: Ustawienie wskazania na segment obsBugi przerwao cli ; zablokowanie przyjmowania przerwan lgdt cs:zaw_GDTR ; ladowanie rejestru GDTR lidt cs:zaw_IDTR ; ladowanie rejestru IDTR Komentarz [M13]: Aadowanie obu wskazao do odpowiednich rejestrów ; przelaczenie do trybu chronionego mov eax, CR0 or eax, 1 mov CR0, eax Komentarz [M14]: Uruchomienie trybu chronionego. Aby uruchomid ten tryb, jmp next ; oczyszczenie kolejki rozkazow zerowy bit rejestru CR0 (stanu procesora) ; oczekujacych na wykonanie musi byd ustawiony na 1 next: nop ; Skok daleki do nastepnej instrukcji - instrukcja ta powoduje zapisanie Komentarz [M15]: Czyszczenie kolejki rozkazów ; 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' Komentarz [M16]: Kod w Hexa skoku dalekiego, skok (Jump Far) oraz selektor, tryb_PM: nop który trafia do rejestr CS ;------------------------------------------------------------------------- ; 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. call przestaw_8259 Komentarz [M17]: WywoBanie procedury, która maskuje oryginalne ; inicjalizacja stosu - segment stosu dla trybu chronionego przerwania klawiatury i ustawia je na ; opisany jest przez deskryptor 7 wybrany przez nas numer, w tym mov ax, 7 * 8 przypadku przerwanie klawiatury mov ss, ax przestawiane jest z 9 na 33 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 Komentarz [M18]: Instrukcja mov ustawia adres komunikatu do ;----------------------------------------------------------------------- wy[wietlenia, a procedura wy[wietl ; Glowna petla przyjmowania zlecen od uzytkownika w trybie chronionym realizuje wy[wietlenie ; 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 Komentarz [M19]: Skok daleki do wykonywania zadao 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 Komentarz [M20]: Sprawdzanie czy nie zostaB wci[nity klawisz ESC przy próbie przeBczenia z trybu Protected Mode do klaw14b: Real, je[li tak fakt ten zapisywany jest w zmiennej czy_koniec ; 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 Komentarz [M21]: Skok daleki do procedury przeBczajcej w tryb Real 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 Komentarz [M22]: Podmiana numerów przerwao dla zegara i klawiatury ;-------------------------------------------------------------------------- ; 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 PROC Komentarz [M23]: Rozpoczcie procedury wy[wietlania na ekran ; selektor 0010H (2 * 8) wskazuje deskryptor segmentu danych dla trybu okre[lonego komunikatu, do BX nale|y ; chronionego ('nowe_dane') podad offset danego komunikatu przed push ds wywoBaniem procedury 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 use16 Komentarz [M24]: Rozkazy zawarte w tym segmencie wykonywane s bezpo[rednio przed przej[ciem z trybu ASSUME cs:roz_zak chronionego do trybu rzeczywistego przelacz_do_RM: nop Komentarz [M25]: Rozpoczcie przej[cia z trybu chronionego do trybu rzeczywistego. Rozkaz NOP pozwala wyczy[cid kolejk rozkazów. ; przywracenie tradycyjnych numerow przerwan 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 Komentarz [M26]: Przywracanie tradycyjnych numerów przerwao ; 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,0FFFFFFFEH Komentarz [M27]: Ustawienie pierwszego bitu rejestru CR0 na 0, co powoduje przej[cie w tryb rzeczywisty mov CR0, eax Komentarz [M28]: Ustawianie odpowiednich bitów rejestrów potrzebnych do przej[cia z trybu Protected Mode do Real Mode jmp far PTR ptt3 Komentarz [M29]: Daleki skok do pocztku programu w trybie rzeczywistym, gdzie sprawdzane jest czy nie zostaB wcze[niej naci[nity klawisz ESC, je|eli tak roz_zak ENDS nastpuje wówczas zakooczenie dziaBania programu ;----------------------------------------------------------------------- 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] Komentarz [M30]: ObsBuga klawiatury 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 deskryptor Komentarz [M31]: Instrukcja skoku do etykiety s w procedurze zad1 za2: DB 0EAH DW ss1 dw 8 *12 ; selektor wskazujacy na deskryptor Komentarz [M32]: Instrukcja skoku do etykiety ss1 w procedurze zad2 za3: DB 0EAH DW sss dw 8 *13 ; selektor wskazujacy na deskryptor Komentarz [M33]: Instrukcja skoku do etykiety sss w procedurze zad3 konza: DB 0EAH DW klaw14 dw 8 *8 ; selektor wskazujacy na deskryptor ; segmentu 'rozkazy' Komentarz [M34]: Skok do etykiety klaw14 w procedurze rozkazy shed_end label near shed ENDS 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 zostaB okre[lony terminem trybu rzeczywistego (Real Mode). Wszystkie programy pracujce w trybie rzeczywistym mog korzystad tylko z instrukcji 16-bitowych i wspóBpracowad z 20-bitow architektur pamici (1 MB). Tego typu oprogramowanie z reguBy jest jednozadaniowe, co oznacza, |e jednocze[nie mo|e byd uruchomiony tylko jeden program. Ponadto nie ma wbudowanej |adnego ochrony zapobiegajcej wykorzystaniu przez program obszaru pamici ju| przydzielonego innemu programowi lub systemowi operacyjnemu. Je[li zatem uruchomiono wicej ni| jeden program, dowolny z nich mo|e spowodowad zawieszenie caBego systemu. Programy dziaBajce w trybie Protected Mode, 32-bitowym trybie pracy procesora, otrzymuj w odró|nieniu od trybu Real Mode wBasny obszar pamici, przez co nie dochodzi midzy nimi do konfliktów. Tego typu ochrona sprawia, |e system jest o wiele bardziej stabilny, poniewa| programy zawierajce bBd nie mog w prosty sposób zaszkodzid innym programom lub samemu systemowi operacyjnemu. Poza tym program, który si zawiesiB, mo|e byd usunity z pamici bez szkody dla reszty systemu. Zasadniczym celem dwiczenia laboratoryjnego byBo napisanie programu przeBczajcego zadania w powy|szych trybach pracy procesora. Napisany program uruchamiany byB w [rodowisku DOSBox oraz TurboAssembler 5.0. Poniewa| realizuje on postawione zaBo|enia protokoBu uwa|amy cel dwiczenia laboratoryjnego za osignity.

Wyszukiwarka

Podobne podstrony:
sw sprawozdanie lab2 v5
sw sprawozdanie lab2 v2
sw sprawozdanie lab2 v4
sw sprawozdanie lab2 v3
tm sprawozdanie lab2 v1
Sprawozdanie lab2 Szewczak Piotr
SW GDLoader ErsteSchritte v1 1? EN
SW GDC?sy ErsteSchritte v1 1? EN
sprawozdanie lab2
tm sprawozdanie lab2 v2
Mechanika płynów sprawozdanie z lab2
Lab2 WinMobile Cpp Lab2 Cpp v1 opis
lab2 sprawozdanie
SW LAB2 LukaszJanik
Różnice w sprawowaniu św Liturgii w prawosławnych Kościołach lokalnych

więcej podobnych podstron