Advertisement
Guest User

Untitled

a guest
Jan 8th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;Obs≥uga wyjπtkÛw
  2.  
  3. ; Struktura do opisu deskryptorÛw segmentÛw
  4. struc descr lim,base_l,base_m,attr_1,attr_2,base_h
  5. {
  6.     .lim    dw  lim ; (1)
  7.     .base_l dw  base_l  ; (2)
  8.     .base_m db  base_m  ; (3)
  9.     .attr_1 db  attr_1  ; (4)
  10.     .attr_2 db  attr_2  ; (5)
  11.     .base_h db  base_h  ; (6)
  12. }
  13.  
  14. ;Struktura do opisu furtek pulapek
  15. struc trap offs_l,sel,cntr,dtype,offs_h
  16. {
  17.     .offs_l dw  offs_l  ; (7) Offset proced. obs≥ugi przerwania (bity 0..15)
  18.     .sel    dw  sel     ; (8) Selektor segmentu rozkazÛw
  19.     .cntr   db  cntr    ; (9) Niewykorzystany
  20.     .dtype  db  dtype   ; (10) Typ furtki - pu≥apka
  21.     .offs_h dw  offs_h  ; (11) Offset proced. obs≥ugi przerwania (bity 16..31)
  22. }
  23.  
  24. format  MZ              ; (12)format pliku wyjúciowego
  25. stack   stk:256         ; (13)ustawienie wielkoúci stosu
  26. entry   text:main       ; (14)punkt wejúcia do programu
  27.  
  28. ; Segment danych
  29.  
  30. segment data_16 use16   ; (15)segment o adresacji 16 bitowej
  31.  
  32. ; Tablica globalnych deskryptorÛw GDT
  33.  
  34. gdt_null descr      0,      0,  0,  0,  0,  0   ;   (16)Deskryptor zerowy (null, dummy)
  35. gdt_data descr      data_size-1,    0,  0,  92h,    0,  0   ; (17)Deskryptor segmentu danych
  36. gdt_code descr      code_size-1,    0,  0,  98h,    0,  0     ; (18)Deskryptor segmentu kodu
  37. gdt_stack descr     0,      0,  0,  96h,    0,  0   ; (19)Deskryptor segmentu stosu
  38. gdt_screen descr    3999,       8000h,  0Bh,    92h,    0,  0  ; (20)Deskryptor segmentu Video
  39. gdt_size=$-gdt_null
  40.  
  41. ; Tablica deskryptorÛw wyjπtkÛw i przerwaÒ IDT
  42. exception0  trap    exc0,   16, 0,  8Fh,    0   ;(21)Deskryptor wyjπtku    0
  43. exception1  trap    dummy,  16, 0,  8Fh,    0   ;(22)Deskryptor wyjπtku    1
  44. exception2  trap    dummy,  16, 0,  8Fh,    0   ;(23)Deskryptor wyjπtku    2
  45. exception3  trap    exc3,   16, 0,  8Fh,    0   ;(24)Deskryptor wyjπtku    3
  46. exception4  trap    dummy,  16, 0,  8Fh,    0   ;(25)Deskryptor wyjπtku    4
  47. exception5  trap    dummy,  16, 0,  8Fh,    0   ;(26)Deskryptor wyjπtku    5
  48. exception6  trap    dummy,  16, 0,  8Fh,    0   ;(27)Deskryptor wyjπtku    6
  49. exception7  trap    dummy,  16, 0,  8Fh,    0   ;(28)Deskryptor wyjπtku    7
  50. exception8  trap    dummy,  16, 0,  8Fh,    0   ;(29)Deskryptor wyjπtku    8
  51. exception9  trap    dummy,  16, 0,  8Fh,    0   ;(30)Deskryptor wyjπtku    9
  52. exception10 trap    exc10,  16, 0,  8Fh,    0   ;(31)Deskryptor wyjπtku    10
  53. exception11 trap    exc11,  16, 0,  8Fh,    0   ;(32)Deskryptor wyjπtku    11
  54. exception12 trap    exc12,  16, 0,  8Fh,    0   ;(33)Deskryptor wyjπtku    12
  55. exception13 trap    exc13,  16, 0,  8Fh,    0   ;(34)Deskryptor wyjπtku    13
  56. exception14 trap    dummy,  16, 0,  8Fh,    0   ;(35)Deskryptor wyjπtku    14
  57. exception15 trap    dummy,  16, 0,  8Fh,    0   ;(36)Deskryptor wyjπtku    15(ktÛrego brak)
  58. exception16 trap    dummy,  16, 0,  8Fh,    0   ;(37)Deskryptor wyjπtku    16
  59. exception17 trap    dummy,  16, 0,  8Fh,    0   ;(38)Deskryptor wyjπtku    17
  60.  
  61. idt_size=$-exception0       ; (39) Rozmiar tablicy IDT
  62.  
  63. ;RÛøne dane programu
  64. pdescr      df 0            ; (40) pseudodeskryptor dla rozkazÛw lgdt i lidt
  65. sym     db 1                ; (41)Symbol dla wyprowadzenia na ekran
  66. attr        db 1Eh          ; (42)jego atrybut
  67. msg     db  27,'[31;42m  Powrocilismy do trybu rzeczywistego '    , 27, '[0m$ ' ;(43)Wyúwietlany komunikat
  68. string      db '**** ****:******** **** ****'   ; (44)Szablon linii diagnostycznej
  69. ;               0    5    10     15     20     25
  70. len=$-string                ; (45)D≥ugoúÊ linii
  71. data_size=$-gdt_null        ; (46)Rozmiar segmentu danych
  72.  
  73.  
  74.  
  75. ;Segment rozkazÛw
  76. segment text use16  ; (47)segment o adresacji 16 bitowej
  77.  
  78. exc0:               ; (48)obs≥uga wyjπtku 0
  79.     mov AX, 0       ; (49)wyprowadzenie na ekran numeru wyjπtku
  80.     jmp home        ; (50)wyjúcie
  81.  
  82. exc3:               ; (51) obs≥uga wyjπtku 3
  83.     mov AX, 3       ; (52) wyprowadzenie na ekran numeru wyjπtku
  84.     jmp home        ; (53) wyjúcie
  85.  
  86. exc10:              ; (54) obs≥uga wyjπtku 10
  87.     mov AX,0Ah      ; (55) wyprowadzenie na ekran numeru wyjπtku
  88.     jmp home        ; (56) wyjúcie
  89.  
  90. exc11:              ; (57) obs≥uga wyjπtku 11
  91.     mov AX,0Bh      ; (58) wyprowadzenie na ekran numeru wyjπtku
  92.     jmp home        ; (59) wyjúcie
  93.  
  94. exc12:              ; (60) obs≥uga wyjπtku 12
  95.     mov AX,0Ch      ; (61) wyprowadzenie na ekran numeru wyjπtku
  96.     jmp home        ; (62) wyjúcie
  97.  
  98. exc13:              ; (63) obs≥uga wyjπtku 13
  99.     pop EAX         ; (64)zdjÍcie ze stosu kodu b≥Ídu
  100.     mov SI,string+19; (65)przekszta≥cenie i wyúwietlenie
  101.     call    wrd_asc ; (66)
  102.     pop EAX         ; (67)zdjÍcie ze stosu EIP
  103.     mov SI,string+14; (68)przekszta≥cenie i wyúwietlenie
  104.     call    wrd_asc ; (69)
  105.     shr EAX,16      ; (70)
  106.     mov SI,string+10; (71)
  107.     call    wrd_asc ; (72)
  108.     pop EAX         ; (73)zdjÍcie ze stosu CS
  109.     mov SI,string+5 ; (74)przekszta≥cenie i wyúwietlenie
  110.     call    wrd_asc ; (75)
  111.  
  112.     mov AX,0Dh      ; (76) wyprowadzenie na ekran numeru wyjπtku
  113.     jmp home        ; (77) wyjúcie
  114.    
  115. dummy:              ; (78) obs≥uga pozosta≥ych wyjπtkÛw
  116.     mov     AX,5555h; (79)symboliczny kod pozosta≥ych wyjπtkÛw
  117.     jmp     home    ; (80) wyjúcie
  118.  
  119.  
  120. main:               ; (81)punkt wejúcia do programu
  121.     xor EAX,EAX     ; (82)oczyúciÊ EAX
  122.     mov AX,stk      ; (83)£adowanie adresu segmentu stosu
  123.     mov SS,AX       ; (84)do rejestru segmentowego
  124.     mov SP,256      ; (85)WartoúÊ poczπtkowa wskaünika stosu
  125.     mov AX,data_16  ; (86)£adowanie do DS adresu  
  126.     mov DS,AX       ; (87)segmentu danych
  127.  
  128. ;Obliczymy i za≥adujemy do GDT liniowy adres segmentu danych
  129.     shl EAX,4               ; (28)
  130.     mov EBP,EAX         ; (29)
  131.     mov [gdt_data.base_l],AX    ; (30)
  132.     shr EAX, 16             ; (31)
  133.     mov [gdt_data.base_m],AL    ; (32)
  134.  
  135. ;Obliczymy i za≥adujemy do GDT liniowy adres segmentu rozkazÛw
  136.     xor EAX,EAX         ; (33)
  137.     mov AX,CS               ; (34)
  138.     shl EAX,4               ; (35)
  139.     mov [gdt_code.base_l],AX    ; (36)
  140.     shr EAX,16              ; (37)
  141.     mov [gdt_code.base_m],AL    ; (38)
  142.    
  143. ;Obliczymy i za≥adujemy do GDT liniowy adres segmentu stosu
  144.     xor EAX,EAX         ; (39)
  145.     mov AX, SS          ; (40)
  146.     shl EAX,4               ; (41)
  147.     mov [gdt_stack.base_l],AX   ; (42)
  148.     shr EAX,16              ; (43)
  149.     mov [gdt_stack.base_m],AL   ; (44)
  150.  
  151. ;Przygotujemy pseudodeskryptor pdescr i za≥adujemy rejestr GDTR
  152.     mov dword [pdescr+2],EBP     ; (45)
  153.     mov word [pdescr],gdt_size-1 ; (46)
  154.     lgdt    fword [pdescr]       ; (47)
  155.  
  156.     cli                                 ; (108)Zakaz obs≥ugi przerwaÒ
  157.  
  158. ;Za≥adujemy IDTR
  159.     mov     word [pdescr],idt_size-1    ; (109)granica
  160.     xor     EAX,EAX                     ; (110)
  161.     mov     AX,exception0               ; (111)
  162.     add     EAX,EBP                     ; (112)liniowy adres IDT
  163.     mov     dword [pdescr+2],EAX        ; (113)
  164.     lidt    fword [pdescr]              ; (114) Za≥adowaÊ IDTR
  165.  
  166. ; Przejúcie do trybu chronionego
  167.     mov EAX,CR0          ; (49)
  168.     or  EAX, 1           ; (50)
  169.     mov CR0,EAX          ; (51)
  170. ;------------------------------------------------------------------------------------------------------------------------------------
  171. ; Procesor funkcjonuje w trybie chronionym;
  172. ;------------------------------------------------------------------------------------------------------------------------------------
  173.  
  174. ;£adujemy do CS:IP selektor:przesuniÍcie etykiety continue
  175.     db  0EAh                 ; (52)
  176.     dw  continue             ; (53)
  177.     dw  16 
  178. continue:                               ; (121)
  179.  
  180. ;PrzywrÛciÊ moøliwoúÊ adresacji danych
  181.     mov AX,8                 ; (55)
  182.     mov DS,AX                ; (56)
  183.  
  184. ;PrzywrÛciÊ moøliwoúÊ adresacji stosu
  185.     mov AX,24            ; (57)
  186.     mov SS,AX                ; (58)
  187.  
  188. ;Inicjalizacja ES, FS i GS     
  189.     mov AX,32                ; (59)
  190.     mov ES,AX                ; (60)
  191.     mov FS,AX            ; (61)
  192.     mov GS,AX
  193.  
  194. ;   mov AX,[ds:data_size-1]             ;
  195.  
  196.  
  197. ;Wyúwietlanie na ekranie linii symboli
  198.     mov     DI,1920                     ; (130) Poczπtkowa pozycja na ekranie
  199.     mov     CX,80                       ; (131)IloúÊ wyprowadzanych symboli
  200.     mov     AX,word [sym]               ; (132)Symbol + atrybut
  201. scrn:   stosw                           ; (133)ZawartoúÊ AX na ekran
  202.     inc     AL                          ; (134)Inkrementacja symbolu
  203.     loop    scrn                        ; (135)PÍtla
  204.     mov     AX,0FFFFh                   ; (136)Kod warunkowy normalnego zakoÒczenia
  205. home:   mov     SI, string              ; (137)Punkt przejúcia z procedur obs≥ugi wyjπtkÛw
  206.     call    wrd_asc                     ; (138)Przekszta≥cenie AX liniÍ symboli
  207.  
  208. ;Wyprowadzenie na ekran linii diagnostycznej
  209.     mov     SI, string      ; (139)
  210.     mov     CX,len          ; (140)
  211.     mov     AH,74h          ; (141)
  212.     mov     DI,1280         ; (142)
  213. scrn1:  lodsb               ; (143)
  214.     stosw                   ; (144)
  215. loop    scrn1               ; (145)
  216.  
  217. ; PowrÛt do trybu rzeczywistego
  218. ; Przygotowanie i ≥adowanie deskryptorÛw dla trybu rzeczywistego
  219.     mov word [gdt_data.lim], 0FFFFh ; (69)
  220.     mov word [gdt_code.lim], 0FFFFh ; (70)
  221.     mov word [gdt_stack.lim], 0h    ; (71) Granica segmentu stosu
  222.     mov word [gdt_screen.lim], 0FFFFh   ; (72)
  223.     push    DS              ; (73)
  224.     pop DS                  ; (74)
  225.     push    SS              ; (75)
  226.     pop SS                  ; (76)
  227.     push    ES              ; (77)
  228.     pop ES                  ; (78)
  229.     push    FS      ; (79)
  230.     pop FS          ; (80)
  231.     push    FS      ; (81)
  232.     pop GS          ; (82)
  233.  
  234.  
  235. ;Wykonamy daleki stos w celu uaktualnienia selektora CS
  236. ;i jego ukrytego rejestru
  237.     db  0EAh            ; (83)
  238.     dw  go          ; (84)
  239.     dw  16              ; (85)
  240.  
  241. ;Prze≥πczymy tryb pracy procesora
  242. go:
  243.     mov EAX,CR0         ; (86)
  244.     and EAX, 0FFFFFFFEh ; (87)
  245.     mov CR0,EAX         ; (88)
  246.     db  0EAh            ; (89)
  247.     dw  return      ; (90)
  248.     dw  text            ; (91)
  249. ;------------------------------------------------------------------------------------------------------------------------------------
  250. ; Procesor znowu funkcjonuje w trybie rzeczywistym
  251. ;------------------------------------------------------------------------------------------------------------------------------------
  252. return:                   ; (169)
  253.  
  254. ;przywrÛcenie úrodowiska dla trybu rzeczywistego
  255.     mov AX, data_16     ; (92)
  256.     mov DS,AX           ; (93)
  257.     mov AX,stk          ; (94)
  258.     mov SS,AX           ; (95)
  259.     mov SP,256          ; (96)
  260.    
  261.  
  262. ;PrzywrÛcenie stanu rejestru IDTR w trybie rzeczywistym
  263.     mov     AX,3FFh             ; (175)Granica tablicy wektorÛw przerwaÒ (1 Kbajt)
  264.     mov     word [pdescr],AX    ; (176)
  265.     mov     EAX, 0              ; (177)PrzesuniÍcie tablicy wektorÛw
  266.     mov     dword [pdescr+2],EAX ; (178)
  267.     lidt    fword [pdescr]      ; (179)Za≥adowanie deskryptora do IDTR
  268.     sti                         ; (180)Zezwolenie na obs≥ugÍ przerwaÒ sprzÍtowych
  269.  
  270. ;Pracujemy w DOS'ie
  271.     mov AH,09h  ; (98)
  272.     mov DX, msg ; (99)
  273.     int 21h     ; (100)
  274.     mov AX,4C00h; (101)
  275.     int 21h     ; (102)
  276.     ret
  277.  
  278. ; Wykorzystywane procedury - podprogramy wrd_asc i bin_asc
  279. ; przekszta≥cenia liczby binarnej w symboliczne przedstawienie hex;
  280. ;Podprogram wrd_asc przekszta≥cenia s≥owa
  281. ;Przy wywo≥aniu przekszta≥cana liczba znajduje siÍ AX,
  282. ;DS:SI -> miejsce dla rezultatu
  283. wrd_asc:
  284.     pusha               ; (156)
  285.     mov     BX, 0F000h  ; (157)
  286.     mov     DL, 12      ; (158)
  287.     mov     CX, 4       ; (159)
  288. cccc: push  CX          ; (160)
  289.     push    AX          ; (161)
  290.     and     AX, BX      ; (162)
  291.     mov     CL, DL      ; (163)
  292.     shr     AX, CL      ; (164)
  293.     call    bin_asc     ; (165)
  294.     mov     [SI], AL    ; (166)
  295.     inc     SI          ; (167)
  296.     pop AX              ; (168)
  297.     shr BX,4            ; (169)
  298.     sub DL,4            ; (170)
  299.     pop CX              ; (171)
  300.     loop    cccc        ; (172)
  301.     popa                ; (173)
  302.     ret                 ; (174)
  303.  
  304. ;Podprogram przekszta≥cenia cyfry hex
  305. ; Argument - czwÛrka bitÛw w m≥odszej czÍúci AL., rezultat w AL
  306. bin_asc:
  307.     cmp     AL, 9       ; (175)
  308.     ja  lettr           ; (176)
  309.     add AL,30h          ; (177)
  310.     jmp ok              ; (178)
  311. lettr:  add AL,37h      ; (179)
  312. ok: ret                 ; (180)
  313.  
  314. code_size=$-exc0    ; (213)Rozmiar segmentu rozkazÛw
  315.                    
  316. ; segment stosu
  317. segment stk use16   ; (104)
  318.         DB  256 DUP (?) ; (105)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement