sw sprawozdanie lab2 v5


W O J S K O W A A K A D E M I A T E C H N I C Z N A
Wydział Cybernetyki
Kierunek: Informatyka
Laboratorium Systemów Wbudowanych
Temat:
 Konfiguracja oprogramowania firmowego.
WAT 2008
Poniższy program dokonuje przejścia w tryb PROTECTED, wykonaniu jednej procedury i
powrocie do trybu REAL wraz z zakończeniem programu.
[BITS 16]
[ORG 0x7C00]
cli
W tym miejscu następuje wyłączenie przerwań. Normalnie aby zaimplementować
przerwania w trybie PROTECTED należało by załadować tablice IDTR ale w naszym
programie przerwania są nie wykorzystywane.
xor ax, ax
mov ds, ax
W tym miejscu następuje zerowanie DS. Będzie on nam potrzebny w dalszej części
programu gdy załadujemy odpowiednie deskryptory.
lgdt [gdt_desc]
Lgdt to polecenie które ładuje globalną tablice deskryptorów. [gdt_desc] to pseudo
deskryptor. Na jego temat powiemy co nieco więcej pod koniec programu.
mov eax, cr0
or eax, 1
mov cr0, eax
Ten mały fragment kodu to właściwie przejście w tryb PROTECTED. Rejestr CR0 zostaje
zapisany wartością jeden co daje sygnał procesorowi że nastąpiła zmiana dotychczasowego
trybu pracy.
jmp 08h:DoProtect
W tym miejscu realizowany jest skok daleki. Jest to bardzo ważne ponieważ w momencie
wykonania tego rozkazu oczyszczana jest dotychczasowa kolejka rozkazów. Proszę nie
zapominać że do niedawna procesor pracował w trybie REAL a więc wszystkie rozkazy były
wykonywane na 16 bitowych rejestrach, miały mniejszy zasób pamięci, a dodatkowo żaden z
procesów nie miał chronionej pamięci. Jeżeli taki rozkaz zaczął by się nagle wykonywać w
trybie PROTECTED mogło by to spowodować  małe zamieszanie  w programie.
Uwagę zwraca także wartość 08h. Tak naprawdę wartość ta jest selektorem wskazującym na
deskryptor w GDT, a dokładnie na jej pierwszą część czyli deskryptor kodu (gdt_code).
DoProtect to offset czyli przesunięcie w ramach danego deskryptora.
[BITS 32]
DoProtect:
mov ax, 10h
mov ds, ax
mov ss, ax
mov esp, 090000h
10h to w rzeczywistości kolejny deskryptor który tym razem wskazuje na drugą część
Globalnej Tablicy Deskryptorów (GDT). Aby to lepiej zrozumieć proszę zauważyć, że
selektor to 16 bitowa struktura. Bity 0 i 1 (najmniej znaczące) to tzw. PRL czyli poziom
ochrony zadania żądającego dostępu. Bit 2 to wskaznik tablicy (0 jeśli GDT a 1 jeśli LDT),
natomiast bity od 3 do 15 to numer deskryptora. To właśnie te bity ustawiają podane wartości.
8h to 1000b, a więc deskryptor numer 1 (1|000) a 10h to 10000b czyli deskryptor numer 2
(10|000).
mov eax, 0B8000h
mov bx, 08h
Tutaj następuje ustawienie eax na początek pamięci obrazu.
F_prot:
mov byte [ds:eax], '!'
inc eax
mov byte [ds:eax], 1Eh
inc eax
mov byte [ds:eax], '?'
inc eax
mov byte [ds:eax], 1Ah
inc eax
dec bx
cmp bx,0
je shutdown
jmp F_prot
Ten fragment kodu wyswietla  !? osiem razy. Każdy znak ma inne podświetlenie. Eax
zwiększa się o jeden i zapisuje kolejne znaki wraz z ich atrybutami w pamięci obrazu. Jeden
znak to jeden bajt. Dodatkowo zaraz obok zapisuje się jego atrybut (też o rozmiarze 1 bajta).
shutdown:
mov eax, cr0
dec eax
mov cr0,eax
Tutaj następuje powrót do trybu REAL (ustawienie CR0 na 0)
PreventReste:
jmp PreventReste
gdt:
gdt_null:
dd 0
dd 0
gdt_code:
dw 0FFFFh
dw 0
db 0
db 10011010b
db 11001111b
db 0
gdt_data:
dw 0FFFFh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:
gdt_desc:
dw gdt_end - gdt - 1
dd gdt
Powyższy kod to właśnie nasza GDT. gdt_end - gdt  1 oblicza jej długość (odjęliśmy
jedynkę ponieważ wtedy długość tablicy byłaby powiększona o gdt_end). gdt_desc to
taka  struktura przechowuje długość tablicy i jej adres początkowy.
times 510-($-$$) db 0
dw 0AA55h
Kompletny kod programu:
[BITS 16]
[ORG 0x7C00]
cli
xor ax, ax
mov ds, ax
lgdt [gdt_desc]
mov eax, cr0
or eax, 1
mov cr0, eax
jmp 08h:DoProtect
[BITS 32]
DoProtect:
mov ax, 10h
mov ds, ax
mov ss, ax
mov esp, 090000h
mov eax, 0B8000h
mov bx, 08h
F_prot:
mov byte [ds:eax], '!'
inc eax
mov byte [ds:eax], 1Eh
inc eax
mov byte [ds:eax], '?'
inc eax
mov byte [ds:eax], 1Ah
inc eax
dec bx
cmp bx,0
je shutdown
jmp F_prot
shutdown:
mov eax, cr0
dec eax
mov cr0,eax
PreventReste:
jmp PreventReste
gdt:
gdt_null:
dd 0
dd 0
gdt_code:
dw 0FFFFh
dw 0
db 0
db 10011010b
db 11001111b
db 0
gdt_data:
dw 0FFFFh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:
gdt_desc:
dw gdt_end - gdt - 1
dd gdt
times 510-($-$$) db 0
dw 0AA55h


Wyszukiwarka

Podobne podstrony:
sw sprawozdanie lab2 v2
sw sprawozdanie lab2 v4
sw sprawozdanie lab2 v1
sw sprawozdanie lab2 v1
sw sprawozdanie lab2 v3
Sprawozdanie lab2 Szewczak Piotr
sprawozdanie lab2
tm sprawozdanie lab2 v2
tm sprawozdanie lab2 v1
Mechanika płynów sprawozdanie z lab2
lab2 sprawozdanie
SW LAB2 LukaszJanik
Różnice w sprawowaniu św Liturgii w prawosławnych Kościołach lokalnych
sw gimnazjum 6

więcej podobnych podstron