home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / asemblr / asm / prot386.asm < prev    next >
Encoding:
Assembly Source File  |  1993-04-30  |  17.2 KB  |  536 lines

  1. ; -----------------------------------------------------------------
  2. ; Programm: PROT386.ASM
  3. ; Funktion: demonstriert den Protected Mode auf der 386-CPU
  4. ;           sowie Exception-Handling
  5. ;
  6. ; Autor: Sven Letzel
  7. ; Datum: 17.04.1993
  8. ; -----------------------------------------------------------------
  9.  
  10. MODEL SMALL, PASCAL
  11.  
  12. .386P                     ; Aktivierung aller 386er-Befehle
  13.  
  14. .STACK       1000h
  15.  
  16. PROTDATA     SEGMENT   WORD
  17.              ASSUME  FS:PROTDATA
  18. ; --------------------------------------------------------------
  19. ;                    Diverse Variablen
  20. ; --------------------------------------------------------------
  21. DummyVar     DW      0
  22. CurY         DW      0    ; benötigt zur Cursorsteuerung
  23. Last         DW      101h ; Zeichen- und Farbsteuerung
  24. InProt       DB      0    ; PM-Flag
  25. SaveESP      DD      ?    ; Stackzeiger
  26.  
  27. Feld         LABEL DWORD  ; Testfeld für BOUND
  28.    Limitlow  DW      0
  29.    Limithigh DW      7
  30.    FeldVar   DB      7 DUP (?)
  31.  
  32. ; -------------------------------------------------------------
  33. ;                Meldungen
  34. ; -------------------------------------------------------------
  35. Meld1        DW  Meld2-$
  36.              DB  'PROTECTED MODE DEMO - von Sven Letzel',10,10
  37.              DB  'Drücken Sie <ESC>, um das Programm jetzt '
  38.              DB  'zu beenden.',10
  39.              DB  'Jede andere Taste schaltet die CPU in den '
  40.              DB  'Protected Mode  ', 10
  41. Meld2        DW  Meld3-$
  42.              DB  10,'Die CPU ist jetzt im Protected Mode.',10
  43.              DB  'Sie können nun einige Ausnahmen erzeugen.',10,10
  44.              DB  'Drücken Sie',10
  45.              DB  '<1>    für Division durch Null',10
  46.              DB  '<2>    für Feldüberschreitung durch BOUND',10
  47.              DB  '<3>    für Beschreiben des Code-Segments',10
  48.              DB  '<4>    für Lesen jenseits der Segmentgrenze',10
  49.              DB  '<ESC>  für Real Mode.',10,10
  50. Meld3        DW  Meld4-$
  51.              DB  'CPU jetzt im Real Mode.',10
  52.              DB  'Programm normal beendet.',10,10
  53. Meld4        DW  Meld5-$
  54.              DB  'Ausnahme-Fehler Nr.:   ',10,10
  55. Meld5        DW  Meld6-$
  56.              DB  'Bitte wählen Sie',10
  57.              DB  '(1)   Befehl ohne Korrektur wiederholen',10
  58.              DB  '(2)   Befehl mit Korrektor wiederholen',10
  59.              DB  '(3)   Bearbeitung abbrechen',10,10
  60. Meld6        DW  Meld7-$
  61.              DB  'Ursache korrigiert.',10
  62. Meld7        DW  Meld8-$
  63.              DB  'Bearbeitung abgebrochen.',10
  64. Meld8        LABEL
  65.  
  66. PROTDATA     ENDS
  67.  
  68.  
  69. .CODE
  70.  
  71. Deskriptor   STRUC        ; Deskriptor-Struktur
  72. Limit        DW    ?
  73. LowBase      DW    ?
  74. HighBase     DB    ?
  75. Acess        DB    ?
  76. Res          DW    ?
  77. Deskriptor   ENDS
  78.  
  79. ; ------------------------------------------------------------
  80. ;               Globale Deskriptortabelle
  81. ; ------------------------------------------------------------
  82.  
  83. GDTRECORD    LABEL FWORD
  84.              DW  48
  85.              DD  OFFSET GDT
  86. GDT          LABEL DWORD
  87.  
  88. Des0 Deskriptor<0,0,0,0,0>          ; Dummy-Deskriptor
  89. Des1 Deskriptor<-1,,,9Ah,0>         ; Deskriptor für Codesegment
  90. Des2 Deskriptor<-1,,,92h,0>         ; Deskriptor für Stacksegment
  91. Des3 Deskriptor<-1,,,92h,0>         ; Deskriptor für DS
  92. Des4 Deskriptor<-1,8000h,0Bh,92h,0> ; Deskriptor für Video-RAM
  93. Des5 Deskriptor<0FFFFh,,,92h,0>     ; Deskriptor für Daten
  94. Des6 Deskriptor<400h,400h,0,92h,0>  ; Deskriptor für BIOS-Daten
  95. Des7 Deskriptor<800h,8000h,0Bh,92,0>; Deskriptor für VideoRam
  96.  
  97. ; ------------------------------------------------------------
  98. ;               Selektoren für Deskriptoren
  99. ; ------------------------------------------------------------
  100.  
  101. SelCSEG      EQU   8
  102. SelSSEG      EQU   16
  103. SelDSEG      EQU   24
  104. SelVid       EQU   32
  105. SelDaten     EQU   40
  106.  
  107. ; -----------------------------------------------------------
  108. ;              Interrupt-Deskriptor-Tabelle
  109. ; -----------------------------------------------------------
  110.  
  111. DUMMY        LABEL  FWORD           ; alte
  112.              DD    0,0
  113.  
  114.  
  115. IDTRECORD    LABEL FWORD            ; neue
  116.              DW    14*8
  117.              DD    OFFSET  IDT
  118. IDT          LABEL DWORD
  119.  
  120. Deskriptor<Int00, SelCSEG, 0, 86h, 0>
  121. Deskriptor<Int01, SelCSEG, 0, 86h, 0>
  122. Deskriptor<Int02, SelCSEG, 0, 86h, 0>
  123. Deskriptor<Int03, SelCSEG, 0, 86h, 0>
  124. Deskriptor<Int04, SelCSEG, 0, 86h, 0>
  125. Deskriptor<Int05, SelCSEG, 0, 86h, 0>
  126. Deskriptor<Int06, SelCSEG, 0, 86h, 0>
  127. Deskriptor<Int07, SelCSEG, 0, 86h, 0>
  128. Deskriptor<Int08, SelCSEG, 0, 86h, 0>
  129. Deskriptor<Int09, SelCSEG, 0, 86h, 0>
  130. Deskriptor<Int10, SelCSEG, 0, 86h, 0>
  131. Deskriptor<Int11, SelCSEG, 0, 86h, 0>
  132. Deskriptor<Int12, SelCSEG, 0, 86h, 0>
  133. Deskriptor<Int13, SelCSEG, 0, 86h, 0>
  134. Deskriptor<Int14, SelCSEG, 0, 86h, 0>
  135.  
  136. REAL_SS DW ?                              ; Hier wird SS gesichert
  137.  
  138. ; -----------------------------------------------------------
  139. ;                    Exception - Handler
  140. ; -----------------------------------------------------------
  141.  
  142. Int00:                                    ; Division durch Null
  143.            PUSH  AX
  144.            XOR   AX, AX
  145.            CALL  WAHL
  146.            CMP   AL, 3
  147.            JC    @@KeinK
  148.            JZ    @@K00
  149.            JG    @@Abort
  150. @@K00:
  151.            OR    BX, 1                    ; Fehlerkorrektur
  152.            POP   AX
  153.            IRET
  154.  
  155. Int01:                                    ; Debug-Fehler
  156.            MOV   AX, 01
  157.            JMP   @@Default
  158.  
  159. Int02:                                    ; NMI
  160.            MOV   AX, 02
  161.            JMP   @@Default
  162.  
  163. Int03:                                    ; Breakpoint
  164.            MOV   AX, 03
  165.            JMP   @@Default
  166.  
  167. Int04:                                    ; Überlauf (INTO)
  168.            MOV   AX, 04
  169.            JMP   @@Default
  170.  
  171. Int05:                                    ; BOUND
  172.            PUSH  AX
  173.            MOV   AX, 05
  174.            CALL  WAHL
  175.            CMP   AL, 3
  176.            JC    @@KeinK
  177.            JZ    @@K05
  178.            JG    @@Abort
  179. @@K05:
  180.            POP   AX
  181.            XOR   BX, BX                  ; Fehlerursache korrigiert
  182.            IRET
  183.  
  184. Int06:                                   ; invalid Opcode
  185.            MOV   AX, 06
  186.            JMP   @@Default
  187.  
  188. Int07:                                   ; FPU fehlt
  189.            MOV   AX, 07
  190.            JMP   @@Default
  191.  
  192. Int08:                                   ; Doppelfehler
  193.            MOV   AX, 08
  194.            JMP   @@Default
  195.  
  196. Int09:                                   ; FPU-Segmnet-Fehler
  197.            MOV   AX, 09
  198.            JMP   @@Default
  199.  
  200. Int10:                                   ; Ungültiges TSS
  201.            MOV   AX, 100h
  202.            JMP   @@Default
  203.  
  204. Int11:                                   ; Segment nicht gegenwärtig
  205.            MOV   AX, 101h
  206.            JMP   @@Default
  207.  
  208. Int12:
  209.            MOV   AX, 102h
  210.            JMP   @@Default
  211.  
  212. Int13:                                   ; Allgemeine Schutzverl.
  213.            PUSH  AX
  214.            MOV   AX, 103h
  215.            CALL  WAHL
  216.            CMP   AL, 3
  217.            JC    @@KeinK
  218.            JZ    @@K13
  219.            JG    @@Abort
  220. @@K13:
  221.            XOR   BX, BX                  ; Fehlerkorrektur für
  222.            POP   AX                      ; FEHLER13_2
  223.            IRET
  224.  
  225. Int14:                                   ; Seitenfehler
  226.            MOV   AX, 104h
  227.            JMP   @@Default
  228.  
  229. @@Abort:
  230.            MOV   AX, SelDaten
  231.            MOV   FS, AX
  232.            LEA   SI, Meld7
  233.            CALL  DISP
  234.            MOV   ESP, FS:[SaveESP]
  235.            JMP   @@MainProg
  236.  
  237. @@KeinK:
  238.            POP   AX
  239.            IRET
  240.  
  241. @@Default:
  242.            CALL  WAHL
  243.            JMP   @@Abort
  244.  
  245.  
  246. WAHL       PROC                          ; In AX Fehlernummer
  247.            PUSH  SI
  248.            CALL  BEEP                    ; kurz hupen bitte
  249.            LEA   SI, Meld5
  250.            ADD   AX, '00'
  251.            XCHG  AH, AL
  252.            MOV   FS:[SI-3], AX           ; Fehlernummer eintragen
  253.            LEA   SI, Meld4
  254.            CALL  DISP
  255.            LEA   SI, Meld5
  256.            CALL  DISP
  257. @@11:
  258.            CALL  READKEY                 ; auf Taste warten
  259.            AND   AL, 7Fh
  260.            CMP   AL, 1
  261.            JZ    @@11
  262.            CMP   AL, 4
  263.            JG    @@11
  264.            POP   SI
  265.            RET
  266. WAHL       ENDP
  267.  
  268.  
  269. SetDesk    PROC   Selektor:Word, Segm: WORD, Offs: WORD
  270.            MOVZX  EAX, Segm               ; Segmentadresse nach EAX
  271.            SHL    EAX, 4                  ; in 24-Bit-Adresse umrechnen
  272.            MOVZX  EBX, Offs               ; Offset nach EBX
  273.            ADD    EAX, EBX                ; zum Segment addieren
  274.            MOVZX  EDI, Selektor           ; Selektor laden
  275.            MOV    GDT[EDI].LowBase, AX    ; Eintrag modifizieren
  276.            SHR    EAX, 8
  277.            MOV    GDT[EDI].HighBase, AH
  278.            LEAVE
  279.            RET    0006
  280. SetDesk    ENDP
  281.  
  282.  
  283. BEEP       PROC                          ; kurz hupen bitte
  284.            PUSH   AX
  285.            PUSH   ECX
  286.            MOV    AL, 0B6h               ; Zeitgeber init.
  287.            OUT    43h, AL
  288.            MOV    AX, 200h               ; etwa 2kHz
  289.            OUT    42h, AL
  290.            XCHG   AH, AL
  291.            OUT    42h, AL
  292.            IN     AL, 61h                ; 61er Status holen
  293.            MOV    AH, AL                 ; und merken
  294.            OR     AL, 3                  ; untersten 2 Bits für Pieper
  295.            OUT    61h, AL                ; anschalten
  296.            MOV    ECX, 0FFFFFh           ; eventuell verkleinern
  297. @Warte:
  298.            LOOPD  @Warte                 ; warten
  299.            MOV    AL, AH
  300.            OUT    61h, AL                ; ausschalten
  301.            POP    ECX
  302.            POP    AX
  303.            RET
  304. BEEP       ENDP
  305.  
  306.  
  307. READKEY    PROC
  308.            IN     AL, 60h                ; Tastatur lesen
  309.            XCHG   AL, AH
  310. @@1:
  311.            IN     AL, 60h                ; Tastatur lesen
  312.            CMP    AL, AH
  313.            JZ     @@1                    ; warte bis Taste gedrückt
  314.            MOV    AH, AL
  315. @@2:
  316.            IN     AL, 60h                ; Tastatur lesen
  317.            CMP    AL, AH
  318.            JZ     @@2                    ; warte bis Taste losgelassen
  319.            RET                           ; Scancode in AH zurück
  320. READKEY    ENDP
  321.  
  322.  
  323. DISP       PROC                          ; Übergabe der Adresse in SI
  324.            PUSH  DS
  325.            PUSH  FS
  326.            POP   DS
  327.            MOV   AX, SelVid
  328.            MOV   ES, AX                  ; Selektor für VideoRam
  329.            CLD
  330.            LODSW                         ; Länge der Zeichenkette
  331.            MOV   CX, AX
  332.            SUB   CX, 2
  333.            MOV   DI, FS:[CurY]
  334.            MOV   AX, 160
  335.            MUL   DI                      ; Position neu berechnen
  336.            MOV   DI, AX
  337.            CMP   BYTE PTR FS:[InProt], 1
  338.            JZ    @@3
  339.            PUSH  0B800h                  ; wenn im Real Mode
  340.            POP   ES                      ; dann normales Segment
  341. @@3:
  342.            LODSB                         ; Zeichen holen
  343.            CMP   AL, 10                  ; neue Zeile ?
  344.            JNZ   @@4
  345.            CALL  NewLine
  346.            LOOP  @@3
  347.            JMP   @@5
  348. @@4:
  349.            MOV   AH, 07
  350.            STOSW                         ; Zeichen schreiben
  351.            LOOP  @@3                     ; nächstes
  352. @@5:
  353.            POP   DS
  354.            RET
  355. DISP       ENDP
  356.  
  357.  
  358. NEWLINE    PROC                          ; neue Zeile auf Bildschirm
  359.            INC   WORD PTR FS:[CurY]
  360.            CMP   WORD PTR FS:[CurY], 25  ; wenn 25, dann scrollen
  361.            JNE   @@6
  362.            DEC   WORD PTR FS:[CurY]
  363.            PUSH  DS                      ; wichtige Register sichern
  364.            PUSH  SI
  365.            PUSH  CX
  366.            PUSH  ES
  367.            POP   DS
  368.            XOR   DI, DI                  ; Bildschirmstart
  369.            MOV   SI, 160                 ; Beginn Zeile 2
  370.            MOV   CX, 1920                ; 24 Zeilen
  371.            REP   MOVSW                   ; und kopieren
  372.            MOV   AX, 0720h
  373.            MOV   CX, 79h
  374.            REP   STOSW                   ; mit Leerzeichen auffüllen
  375.            POP   CX                      ; Register zurück
  376.            POP   SI
  377.            POP   DS
  378. @@6:
  379.            MOV   DI, FS:[CurY]            ; Zieladresse neu berechnen
  380.            MOV   AX, 160
  381.            MUL   DI
  382.            MOV   DI, AX
  383.            RET
  384. NEWLINE    ENDP
  385.  
  386. ; ----------------------------------------------------------------
  387. ;                        Hauptprogramm
  388. ; ----------------------------------------------------------------
  389.  
  390. MAIN       PROC  FAR                     ; Hauptprogramm
  391.            MOV   AX, CS                  ; hier gehts los
  392.            MOV   DS, AX                  ; Datensegment init.
  393.            MOV   CS:[RSEG], AX
  394.            MOV   AX, 3
  395.            INT   10h                     ; Videomodus 3
  396.  
  397. ; ---------------------------------------------------------
  398. ;            Deskriptoren initialisieren
  399. ; ---------------------------------------------------------
  400.  
  401.            MOV   AX, SEG PROTDATA
  402.            MOV   FS, AX                  ; FS verwenden
  403.  
  404.            PUSH  SelCSEG
  405.            PUSH  CS
  406.            PUSH  0000
  407.            CALL  SETDESK                 ; CS-Deskriptor
  408.  
  409.            PUSH  SelDSEG
  410.            PUSH  CS
  411.            PUSH  0000
  412.            CALL  SETDESK                 ; DS-Deskriptor
  413.  
  414.            PUSH  SelSSEG
  415.            PUSH  SS
  416.            PUSH  0000
  417.            CALL  SETDESK
  418.  
  419.            PUSH  SelDaten
  420.            PUSH  FS
  421.            PUSH  0000
  422.            CALL  SETDESK
  423.  
  424.            MOV   AX, CS                 ; Adresse der GDT
  425.            CDQ                          ; korrigieren
  426.            SHL   EAX, 4
  427.            ADD   DWORD PTR [GDT-4], EAX
  428.            ADD   DWORD PTR [IDT-4], EAX
  429.  
  430.            LEA   SI, Meld1
  431.            CALL  DISP                   ; Meldung ausgeben
  432.            CALL  READKEY                ; Auf Taste warten
  433.            AND   AL, 7Fh
  434.            CMP   AL, 1                  ; wenn ESC
  435.            JZ    @@EXIT
  436.  
  437.  
  438.            LGDT  GDTRECORD              ; GDT laden
  439.            SIDT  DUMMY
  440.            LIDT  IDTRECORD              ; IDT laden
  441.            MOV   BYTE PTR FS:[InProt], 1;
  442.            MOV   EAX, CR0               ; CR0 laden
  443.            BTS   EAX, 0                 ; Bit 0 setzen
  444.  
  445.            CLI                          ; Interrupts müsssen hier aus
  446.            MOV   CR0, EAX               ; Steuerregister laden
  447.  
  448.            DB    0EAh                   ; FAR-JMP, um Befehls-
  449.            DW    Offset @@PM            ; warteschlange zu leeren
  450.            DW    SelCSEG                ; und CS zu initialisieren
  451. @@PM:
  452.            MOV   AX, SelSSEG
  453.            MOV   SS, AX                 ; Stack init.
  454.            MOV   AX, SelDSEG
  455.            MOV   DS, AX                 ; sowie DS
  456.            MOV   AX, SelDaten
  457.            MOV   FS, AX                 ; und FS
  458.            MOV   FS:[SaveESP], ESP
  459.  
  460. @@MainProg:
  461.            LEA   SI, Meld2
  462.            CALL  DISP                   ; Meldung ausgeben
  463. @@Y:
  464.            CALL  READKEY                ; auf Taste warten
  465.            AND   AL, 7Fh
  466.            CMP   AL, 1                  ; ist ESC ?
  467.            JZ    @@ToReal
  468.            CMP   AL, 2                  ; ist 1 ?
  469.            JZ    @@FEHLER00
  470.            CMP   AL, 3
  471.            JZ    @@FEHLER05
  472.            CMP   AL, 4
  473.            JZ    @@FEHLER13_1
  474.            CMP   AL, 5
  475.            JZ    @@FEHLER13_2
  476.            JMP   @@Y
  477.  
  478. @@ToReal:
  479.            MOV   EAX, CR0
  480.            BTR   EAX, 0
  481.            MOV   CR0, EAX               ; PE-Bit gelöscht
  482.            DB    0EAh                   ; FAR-JMP
  483.            DW    Offset @@RM
  484. RSEG       DW    0
  485. @@RM:
  486.            MOV   SS, CS:[Real_SS]       ; altes SS holen
  487.            LIDT  CS: DUMMY
  488.            STI
  489.            MOV   AX, CS
  490.            MOV   DS, AX                 ; altes DS
  491.            MOV   AX, SEG PROTDATA
  492.            MOV   FS, AX                 ; altes FS
  493.            MOV   BYTE PTR FS:[InProt], 0
  494.            LEA   SI, Meld3
  495.            CALL  DISP
  496.            CALL  BEEP                   ; mal hupen
  497. @@Exit:
  498.            XOR   DL, DL
  499.            MOV   DH, BYTE PTR FS:[CurY]
  500.            MOV   AH, 02h
  501.            INT   10h                     ; Cursorposition korrigieren
  502.            MOV   AH, 4Ch
  503.            INT   21h                     ; Programmende
  504. MAIN       ENDP
  505.  
  506. ; ----------------------------------------------------------------
  507. ;          Hier folgen die fehlerbehafteten Routinen
  508. ; ----------------------------------------------------------------
  509.  
  510. @@FEHLER00:
  511.            XOR    BX, BX
  512.            DIV    BX                      ; Division durch 0
  513.            JMP    @@Fertig
  514.  
  515. @@FEHLER05:
  516.            MOV    BX, 1
  517.            BOUND  BX, Feld                ; Hier passiert nichts
  518.            MOV    BX, 10
  519.            BOUND  BX, Feld                ; Hier wird INT 5 ausgelöst
  520.            JMP    @@Fertig
  521.  
  522. @@FEHLER13_1:
  523.            MOV    WORD PTR CS:[GDT], 0   ; Schreibzugriff auf CS
  524.            JMP    @@Fertig               ; Was soll hier korrigiert
  525.                                          ; werden
  526. @@FEHLER13_2:
  527.            MOV    BX, -1
  528.            MOV    AX, FS:[BX]            ; Lesen jenseits der
  529.                                          ; Segmentgrenze
  530. @@FERTIG:
  531.            LEA    SI, Meld6
  532.            CALL   DISP
  533.            JMP    @@MainProg
  534.  
  535. END        MAIN                          ; Prog.ende bei MAIN beg.
  536.