Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Obs≥uga wyjπtkÛw
- ; Struktura do opisu deskryptorÛw segmentÛw
- struc descr lim,base_l,base_m,attr_1,attr_2,base_h
- {
- .lim dw lim ; (1)
- .base_l dw base_l ; (2)
- .base_m db base_m ; (3)
- .attr_1 db attr_1 ; (4)
- .attr_2 db attr_2 ; (5)
- .base_h db base_h ; (6)
- }
- ;Struktura do opisu furtek pulapek
- struc trap offs_l,sel,cntr,dtype,offs_h
- {
- .offs_l dw offs_l ; (7) Offset proced. obs≥ugi przerwania (bity 0..15)
- .sel dw sel ; (8) Selektor segmentu rozkazÛw
- .cntr db cntr ; (9) Niewykorzystany
- .dtype db dtype ; (10) Typ furtki - pu≥apka
- .offs_h dw offs_h ; (11) Offset proced. obs≥ugi przerwania (bity 16..31)
- }
- format MZ ; (12)format pliku wyjúciowego
- stack stk:256 ; (13)ustawienie wielkoúci stosu
- entry text:main ; (14)punkt wejúcia do programu
- ; Segment danych
- segment data_16 use16 ; (15)segment o adresacji 16 bitowej
- ; Tablica globalnych deskryptorÛw GDT
- gdt_null descr 0, 0, 0, 0, 0, 0 ; (16)Deskryptor zerowy (null, dummy)
- gdt_data descr data_size-1, 0, 0, 92h, 0, 0 ; (17)Deskryptor segmentu danych
- gdt_code descr code_size-1, 0, 0, 98h, 0, 0 ; (18)Deskryptor segmentu kodu
- gdt_stack descr 0, 0, 0, 96h, 0, 0 ; (19)Deskryptor segmentu stosu
- gdt_screen descr 3999, 8000h, 0Bh, 92h, 0, 0 ; (20)Deskryptor segmentu Video
- gdt_size=$-gdt_null
- ; Tablica deskryptorÛw wyjπtkÛw i przerwaÒ IDT
- exception0 trap exc0, 16, 0, 8Fh, 0 ;(21)Deskryptor wyjπtku 0
- exception1 trap dummy, 16, 0, 8Fh, 0 ;(22)Deskryptor wyjπtku 1
- exception2 trap dummy, 16, 0, 8Fh, 0 ;(23)Deskryptor wyjπtku 2
- exception3 trap exc3, 16, 0, 8Fh, 0 ;(24)Deskryptor wyjπtku 3
- exception4 trap dummy, 16, 0, 8Fh, 0 ;(25)Deskryptor wyjπtku 4
- exception5 trap dummy, 16, 0, 8Fh, 0 ;(26)Deskryptor wyjπtku 5
- exception6 trap dummy, 16, 0, 8Fh, 0 ;(27)Deskryptor wyjπtku 6
- exception7 trap dummy, 16, 0, 8Fh, 0 ;(28)Deskryptor wyjπtku 7
- exception8 trap dummy, 16, 0, 8Fh, 0 ;(29)Deskryptor wyjπtku 8
- exception9 trap dummy, 16, 0, 8Fh, 0 ;(30)Deskryptor wyjπtku 9
- exception10 trap exc10, 16, 0, 8Fh, 0 ;(31)Deskryptor wyjπtku 10
- exception11 trap exc11, 16, 0, 8Fh, 0 ;(32)Deskryptor wyjπtku 11
- exception12 trap exc12, 16, 0, 8Fh, 0 ;(33)Deskryptor wyjπtku 12
- exception13 trap exc13, 16, 0, 8Fh, 0 ;(34)Deskryptor wyjπtku 13
- exception14 trap dummy, 16, 0, 8Fh, 0 ;(35)Deskryptor wyjπtku 14
- exception15 trap dummy, 16, 0, 8Fh, 0 ;(36)Deskryptor wyjπtku 15(ktÛrego brak)
- exception16 trap dummy, 16, 0, 8Fh, 0 ;(37)Deskryptor wyjπtku 16
- exception17 trap dummy, 16, 0, 8Fh, 0 ;(38)Deskryptor wyjπtku 17
- idt_size=$-exception0 ; (39) Rozmiar tablicy IDT
- ;RÛøne dane programu
- pdescr df 0 ; (40) pseudodeskryptor dla rozkazÛw lgdt i lidt
- sym db 1 ; (41)Symbol dla wyprowadzenia na ekran
- attr db 1Eh ; (42)jego atrybut
- msg db 27,'[31;42m Powrocilismy do trybu rzeczywistego ' , 27, '[0m$ ' ;(43)Wyúwietlany komunikat
- string db '**** ****:******** **** ****' ; (44)Szablon linii diagnostycznej
- ; 0 5 10 15 20 25
- len=$-string ; (45)D≥ugoúÊ linii
- data_size=$-gdt_null ; (46)Rozmiar segmentu danych
- ;Segment rozkazÛw
- segment text use16 ; (47)segment o adresacji 16 bitowej
- exc0: ; (48)obs≥uga wyjπtku 0
- mov AX, 0 ; (49)wyprowadzenie na ekran numeru wyjπtku
- jmp home ; (50)wyjúcie
- exc3: ; (51) obs≥uga wyjπtku 3
- mov AX, 3 ; (52) wyprowadzenie na ekran numeru wyjπtku
- jmp home ; (53) wyjúcie
- exc10: ; (54) obs≥uga wyjπtku 10
- mov AX,0Ah ; (55) wyprowadzenie na ekran numeru wyjπtku
- jmp home ; (56) wyjúcie
- exc11: ; (57) obs≥uga wyjπtku 11
- mov AX,0Bh ; (58) wyprowadzenie na ekran numeru wyjπtku
- jmp home ; (59) wyjúcie
- exc12: ; (60) obs≥uga wyjπtku 12
- mov AX,0Ch ; (61) wyprowadzenie na ekran numeru wyjπtku
- jmp home ; (62) wyjúcie
- exc13: ; (63) obs≥uga wyjπtku 13
- pop EAX ; (64)zdjÍcie ze stosu kodu b≥Ídu
- mov SI,string+19; (65)przekszta≥cenie i wyúwietlenie
- call wrd_asc ; (66)
- pop EAX ; (67)zdjÍcie ze stosu EIP
- mov SI,string+14; (68)przekszta≥cenie i wyúwietlenie
- call wrd_asc ; (69)
- shr EAX,16 ; (70)
- mov SI,string+10; (71)
- call wrd_asc ; (72)
- pop EAX ; (73)zdjÍcie ze stosu CS
- mov SI,string+5 ; (74)przekszta≥cenie i wyúwietlenie
- call wrd_asc ; (75)
- mov AX,0Dh ; (76) wyprowadzenie na ekran numeru wyjπtku
- jmp home ; (77) wyjúcie
- dummy: ; (78) obs≥uga pozosta≥ych wyjπtkÛw
- mov AX,5555h; (79)symboliczny kod pozosta≥ych wyjπtkÛw
- jmp home ; (80) wyjúcie
- main: ; (81)punkt wejúcia do programu
- xor EAX,EAX ; (82)oczyúciÊ EAX
- mov AX,stk ; (83)£adowanie adresu segmentu stosu
- mov SS,AX ; (84)do rejestru segmentowego
- mov SP,256 ; (85)WartoúÊ poczπtkowa wskaünika stosu
- mov AX,data_16 ; (86)£adowanie do DS adresu
- mov DS,AX ; (87)segmentu danych
- ;Obliczymy i za≥adujemy do GDT liniowy adres segmentu danych
- shl EAX,4 ; (28)
- mov EBP,EAX ; (29)
- mov [gdt_data.base_l],AX ; (30)
- shr EAX, 16 ; (31)
- mov [gdt_data.base_m],AL ; (32)
- ;Obliczymy i za≥adujemy do GDT liniowy adres segmentu rozkazÛw
- xor EAX,EAX ; (33)
- mov AX,CS ; (34)
- shl EAX,4 ; (35)
- mov [gdt_code.base_l],AX ; (36)
- shr EAX,16 ; (37)
- mov [gdt_code.base_m],AL ; (38)
- ;Obliczymy i za≥adujemy do GDT liniowy adres segmentu stosu
- xor EAX,EAX ; (39)
- mov AX, SS ; (40)
- shl EAX,4 ; (41)
- mov [gdt_stack.base_l],AX ; (42)
- shr EAX,16 ; (43)
- mov [gdt_stack.base_m],AL ; (44)
- ;Przygotujemy pseudodeskryptor pdescr i za≥adujemy rejestr GDTR
- mov dword [pdescr+2],EBP ; (45)
- mov word [pdescr],gdt_size-1 ; (46)
- lgdt fword [pdescr] ; (47)
- cli ; (108)Zakaz obs≥ugi przerwaÒ
- ;Za≥adujemy IDTR
- mov word [pdescr],idt_size-1 ; (109)granica
- xor EAX,EAX ; (110)
- mov AX,exception0 ; (111)
- add EAX,EBP ; (112)liniowy adres IDT
- mov dword [pdescr+2],EAX ; (113)
- lidt fword [pdescr] ; (114) Za≥adowaÊ IDTR
- ; Przejúcie do trybu chronionego
- mov EAX,CR0 ; (49)
- or EAX, 1 ; (50)
- mov CR0,EAX ; (51)
- ;------------------------------------------------------------------------------------------------------------------------------------
- ; Procesor funkcjonuje w trybie chronionym;
- ;------------------------------------------------------------------------------------------------------------------------------------
- ;£adujemy do CS:IP selektor:przesuniÍcie etykiety continue
- db 0EAh ; (52)
- dw continue ; (53)
- dw 16
- continue: ; (121)
- ;PrzywrÛciÊ moøliwoúÊ adresacji danych
- mov AX,8 ; (55)
- mov DS,AX ; (56)
- ;PrzywrÛciÊ moøliwoúÊ adresacji stosu
- mov AX,24 ; (57)
- mov SS,AX ; (58)
- ;Inicjalizacja ES, FS i GS
- mov AX,32 ; (59)
- mov ES,AX ; (60)
- mov FS,AX ; (61)
- mov GS,AX
- ; mov AX,[ds:data_size-1] ;
- ;Wyúwietlanie na ekranie linii symboli
- mov DI,1920 ; (130) Poczπtkowa pozycja na ekranie
- mov CX,80 ; (131)IloúÊ wyprowadzanych symboli
- mov AX,word [sym] ; (132)Symbol + atrybut
- scrn: stosw ; (133)ZawartoúÊ AX na ekran
- inc AL ; (134)Inkrementacja symbolu
- loop scrn ; (135)PÍtla
- mov AX,0FFFFh ; (136)Kod warunkowy normalnego zakoÒczenia
- home: mov SI, string ; (137)Punkt przejúcia z procedur obs≥ugi wyjπtkÛw
- call wrd_asc ; (138)Przekszta≥cenie AX liniÍ symboli
- ;Wyprowadzenie na ekran linii diagnostycznej
- mov SI, string ; (139)
- mov CX,len ; (140)
- mov AH,74h ; (141)
- mov DI,1280 ; (142)
- scrn1: lodsb ; (143)
- stosw ; (144)
- loop scrn1 ; (145)
- ; PowrÛt do trybu rzeczywistego
- ; Przygotowanie i ≥adowanie deskryptorÛw dla trybu rzeczywistego
- mov word [gdt_data.lim], 0FFFFh ; (69)
- mov word [gdt_code.lim], 0FFFFh ; (70)
- mov word [gdt_stack.lim], 0h ; (71) Granica segmentu stosu
- mov word [gdt_screen.lim], 0FFFFh ; (72)
- push DS ; (73)
- pop DS ; (74)
- push SS ; (75)
- pop SS ; (76)
- push ES ; (77)
- pop ES ; (78)
- push FS ; (79)
- pop FS ; (80)
- push FS ; (81)
- pop GS ; (82)
- ;Wykonamy daleki stos w celu uaktualnienia selektora CS
- ;i jego ukrytego rejestru
- db 0EAh ; (83)
- dw go ; (84)
- dw 16 ; (85)
- ;Prze≥πczymy tryb pracy procesora
- go:
- mov EAX,CR0 ; (86)
- and EAX, 0FFFFFFFEh ; (87)
- mov CR0,EAX ; (88)
- db 0EAh ; (89)
- dw return ; (90)
- dw text ; (91)
- ;------------------------------------------------------------------------------------------------------------------------------------
- ; Procesor znowu funkcjonuje w trybie rzeczywistym
- ;------------------------------------------------------------------------------------------------------------------------------------
- return: ; (169)
- ;przywrÛcenie úrodowiska dla trybu rzeczywistego
- mov AX, data_16 ; (92)
- mov DS,AX ; (93)
- mov AX,stk ; (94)
- mov SS,AX ; (95)
- mov SP,256 ; (96)
- ;PrzywrÛcenie stanu rejestru IDTR w trybie rzeczywistym
- mov AX,3FFh ; (175)Granica tablicy wektorÛw przerwaÒ (1 Kbajt)
- mov word [pdescr],AX ; (176)
- mov EAX, 0 ; (177)PrzesuniÍcie tablicy wektorÛw
- mov dword [pdescr+2],EAX ; (178)
- lidt fword [pdescr] ; (179)Za≥adowanie deskryptora do IDTR
- sti ; (180)Zezwolenie na obs≥ugÍ przerwaÒ sprzÍtowych
- ;Pracujemy w DOS'ie
- mov AH,09h ; (98)
- mov DX, msg ; (99)
- int 21h ; (100)
- mov AX,4C00h; (101)
- int 21h ; (102)
- ret
- ; Wykorzystywane procedury - podprogramy wrd_asc i bin_asc
- ; przekszta≥cenia liczby binarnej w symboliczne przedstawienie hex;
- ;Podprogram wrd_asc przekszta≥cenia s≥owa
- ;Przy wywo≥aniu przekszta≥cana liczba znajduje siÍ AX,
- ;DS:SI -> miejsce dla rezultatu
- wrd_asc:
- pusha ; (156)
- mov BX, 0F000h ; (157)
- mov DL, 12 ; (158)
- mov CX, 4 ; (159)
- cccc: push CX ; (160)
- push AX ; (161)
- and AX, BX ; (162)
- mov CL, DL ; (163)
- shr AX, CL ; (164)
- call bin_asc ; (165)
- mov [SI], AL ; (166)
- inc SI ; (167)
- pop AX ; (168)
- shr BX,4 ; (169)
- sub DL,4 ; (170)
- pop CX ; (171)
- loop cccc ; (172)
- popa ; (173)
- ret ; (174)
- ;Podprogram przekszta≥cenia cyfry hex
- ; Argument - czwÛrka bitÛw w m≥odszej czÍúci AL., rezultat w AL
- bin_asc:
- cmp AL, 9 ; (175)
- ja lettr ; (176)
- add AL,30h ; (177)
- jmp ok ; (178)
- lettr: add AL,37h ; (179)
- ok: ret ; (180)
- code_size=$-exc0 ; (213)Rozmiar segmentu rozkazÛw
- ; segment stosu
- segment stk use16 ; (104)
- DB 256 DUP (?) ; (105)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement