home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / asemblr / asm / debug.asm < prev    next >
Encoding:
Assembly Source File  |  1993-06-05  |  7.3 KB  |  218 lines

  1. ; -----------------------------------------------------------
  2. ; Programm: DEBUG.ASM
  3. ; Autor: Sven Letzel
  4. ; Datum: 20.04.1993
  5.  
  6. ; Dieses Programm demonstriert die Programmierung der
  7. ; Debug-Register auf der 386-CPU oder höher.
  8. ; Programm kann nicht unter einem Debugger ausgeführt werden,
  9. ; wenn DPMI aktiv ist oder der TDH386.SYS geladen ist.
  10. ;
  11. ; ASM -> OBJ:  TASM DEBUG.ASM
  12. ; OBJ -> EXE:  TLINK /3 DEBUG.OBJ
  13. ; -----------------------------------------------------------
  14.  
  15. MODEL small
  16.  
  17. .STACK 400H
  18.  
  19. .DATA
  20.  
  21. RegEAX       DB  10,13,'EAX = $'
  22. RegEBX       DB  10,13,'EBX = $'
  23. RegECX       DB  10,13,'ECX = $'
  24. RegEDX       DB  10,13,'EDX = $'
  25. RegEIP       DB  10,13,'EIP = $'
  26. RegCS        DB  10,13,'CS  = $'
  27.  
  28. Msg1         DB  'DEMO - Programmierung der Debug-Register -'
  29.              DB  ' von Sven Letzel', 10,13,'$'
  30. Msg2         DB  10,10,13,'Drücken Sie eine Taste für Breakpoint-Test. '
  31.              DB  '<ESC> = Ende $'
  32. Msg3         DB  'Warnung! Programm läuft nur auf 386-CPU oder höher. '
  33.              DB  '<ESC> für abbrechen.',10,10,13,07,36
  34. Msg4         DB  10,10,13,10,7,'Breakpoint Nr.: $'
  35. CR           DB  10,13,36
  36.  
  37. HexZiffern   DB  '0123456789ABCDEF'
  38.  
  39. OfsInt01     DW  ?
  40. SegInt01     DW  ?
  41.  
  42. .CODE
  43.  
  44. DOS          MACRO  Nr             ; Makro für DOS-Aufrufe
  45.              MOV    AX, Nr
  46.              INT    21H
  47.              ENDM
  48. P386
  49.  
  50. INT01        PROC   FAR            ; Handler für Debug-Interrupt
  51.              PUSH   EBP
  52.              MOV    EBP, ESP       ; Stackrahmen
  53.              PUSH   DS             ; Register sichern
  54.              PUSH   ES             ; Register sichern
  55.              PUSHAD                ; Register sichern
  56.              PUSHAD                ; Register sichern
  57.  
  58.              LEA    DX, Msg4       ; Meldung ausgeben
  59.              DOS    0900H
  60.  
  61.              MOV    EDX, DR6       ; DR6 holen
  62.              XOR    EBX, EBX
  63.              MOV    DR6, EBX       ; DR6 zurücksetzen !!
  64.  
  65.              AND    DL, 011B       ; maskieren
  66.              ADD    DL, 47         ; Zahl -> ASCII
  67.              DOS    0200H          ; und ausgeben
  68.  
  69.              MOV    EAX, DR7       ; DR7 muß ebenfalls zurück-
  70.              BTC    EAX, 1         ; gesetzt werden
  71.              BTC    EAX, 3         ; Ursache löschen und
  72.              MOV    DR7, EAX       ; anderen aktivieren
  73.  
  74.              LEA    DX, CR         ; Zeilenschaltung
  75.              DOS    0900H
  76.  
  77.              LEA    DX, RegEAX     ; EAX ausgeben
  78.              DOS    0900H
  79.              POPAD
  80.              CALL   Disphex
  81.  
  82.              PUSH   DX             ; EBX ausgeben
  83.              LEA    DX, RegEBX
  84.              DOS    0900H
  85.              POP    DX
  86.              MOV    EAX, EBX
  87.              CALL   Disphex
  88.  
  89.              PUSH   DX             ; ECX ausgeben
  90.              LEA    DX, RegECX
  91.              DOS    0900H
  92.              POP    DX
  93.              MOV    EAX, ECX
  94.              CALL   Disphex
  95.  
  96.              PUSH   DX             ; EDX ausgeben
  97.              LEA    DX, RegEDX
  98.              DOS    0900H
  99.              POP    DX
  100.              MOV    EAX, EDX
  101.              CALL   Disphex
  102.  
  103.              LEA    DX, RegCS      ; CS ausgeben
  104.              DOS    0900H
  105.              XOR    EAX, EAX
  106.              MOV    AX, [BP+06]
  107.              CALL   Disphex
  108.  
  109.              LEA    DX, RegEIP     ; EIP ausgeben
  110.              DOS    0900H
  111.              XOR    EAX, EAX
  112.              MOV    AX, [BP+04]
  113.              CALL   Disphex
  114.  
  115.              POPAD                ; alle Register zurück
  116.              POP    ES
  117.              POP    DS
  118.              POP    EBP
  119.              IRET                 ; weitermachen
  120. INT01        ENDP
  121.  
  122. Disphex      PROC                 ; EAX-Register als Hex-Zahl
  123.              PUSHAD               ; Register sichern
  124.              MOV    EBP, ESP      ; Stack merken
  125.              XOR    EDX, EDX
  126.              MOV    EDI, OFFSET HexZiffern
  127.              MOV    CX, 8         ; 8 Nibbels
  128. @@11:
  129.              MOV    EBX, EAX      ; in EAX ist Zahl
  130.              AND    EBX, 0FH      ; unterstes Nibbel maskieren
  131.              MOV    DL,  [EDI][EBX] ; Hexziffer laden
  132.              PUSH   DX            ; auf Stack
  133.              SHR    EAX, 4        ; nächstes Nibbel
  134.              LOOP   @@11
  135. @@12:
  136.              POP    DX            ; alle Zahlen zurück
  137.              DOS    0200H         ; und ausgeben
  138.              CMP    EBP, ESP      ; bis Stack wie vorher
  139.              JNZ    @@12
  140.              POPAD                ; Register zurück
  141.              RET
  142. Disphex      ENDP
  143.  
  144. Dummy        PROC                  ; Dummy-Prozedur, es werden
  145.                                    ; willkürliche Befehle ausgeführt
  146.              MOV    EAX, 11111111H
  147.              MOV    EBX, 22222222H
  148.              MOV    ECX, 33333333H
  149.              MOV    EDX, 44444444H
  150. @@B0:                                ; Hier soll Breakpoint 0 sein
  151.              ADD    EAX, EBX
  152.              ADD    EBX, ECX
  153.              ADD    ECX, EDX
  154.              ADD    EDX, EAX
  155. @@B1:                                ; Hier soll Breakpoint 1 sein
  156.              RET
  157. Dummy        ENDP
  158.  
  159. Main         PROC   FAR
  160.              MOV    AX, SEG @DATA    ; hier gehts los
  161.              MOV    DS, AX           ; DS laden
  162.  
  163.              LEA    DX, Msg3         ; Meldung ausgeben
  164.              DOS    0900H
  165.              XOR    AX, AX
  166.              INT    16H              ; und auf Taste warten
  167.              XOR    AL, 1BH
  168.              JNZ    @@Ok
  169.              DOS    4C01H
  170. @@Ok:
  171.              DOS    3501H            ; I-Vector lesen
  172.              MOV    [OfsInt01], BX   ; und sichern
  173.              MOV    [SegInt01], ES
  174.  
  175.              PUSH   DS               ; CS -> DS
  176.              PUSH   CS
  177.              POP    DS
  178.              LEA    DX, INT01
  179.              DOS    2501H            ; I-Vector setzen
  180.              POP    DS               ; DS zurück
  181.  
  182.              MOV    AX, CS
  183.              CWD                     ; -> 32 Bit
  184.              SHL    EAX, 4           ; *16
  185.              PUSH   EAX              ; merken
  186.              ADD    EAX, OFFSET @@B0 ; Offset dazu
  187.              MOV    DR0, EAX         ; Breakpoint 0 setzen
  188.              POP    EAX
  189.              ADD    EAX, OFFSET @@B1 ; zweiten berechnen
  190.              MOV    DR1, EAX         ; Breakpoint 1 setzen
  191.              XOR    EAX, EAX
  192.              BTS    EAX, 1           ; ersten B-Point aktivieren
  193.              BTS    EAX, 9
  194.              MOV    DR7, EAX         ; Breakpoints aktivieren
  195.              LEA    DX, Msg1
  196.              DOS    0900H            ; Meldung ausgeben
  197. @@1:
  198.              LEA    DX, Msg2
  199.              DOS    0900H            ; Meldung ausgeben
  200.              XOR    AX, AX
  201.              INT    16H              ; auf Taste warten
  202.              XOR    AL, 1BH          ; ESC ?
  203.              JZ     @@Exit
  204.              CALL   Dummy            ; Dummy-Prozedur, da sind
  205.              JMP    SHORT @@1        ; Breakpoints
  206. @@Exit:
  207.              PUSH   DS               ; DS merken
  208.              MOV    DS, [SegInt01]   ; gesicherten I-Vector
  209.              MOV    DX, [OfsInt01]   ; holen
  210.              DOS    2501H            ; und zurücksetzen
  211.              POP    DS
  212.              XOR    EAX, EAX
  213.              MOV    DR7, EAX         ; Steuerregister zurücksetzen
  214.              DOS    4C00H            ; Programmende
  215. Main         ENDP
  216.  
  217. END          Main
  218.