home *** CD-ROM | disk | FTP | other *** search
- ; -----------------------------------------------------------
- ; Programm: DEBUG.ASM
- ; Autor: Sven Letzel
- ; Datum: 20.04.1993
-
- ; Dieses Programm demonstriert die Programmierung der
- ; Debug-Register auf der 386-CPU oder höher.
- ; Programm kann nicht unter einem Debugger ausgeführt werden,
- ; wenn DPMI aktiv ist oder der TDH386.SYS geladen ist.
- ;
- ; ASM -> OBJ: TASM DEBUG.ASM
- ; OBJ -> EXE: TLINK /3 DEBUG.OBJ
- ; -----------------------------------------------------------
-
- MODEL small
-
- .STACK 400H
-
- .DATA
-
- RegEAX DB 10,13,'EAX = $'
- RegEBX DB 10,13,'EBX = $'
- RegECX DB 10,13,'ECX = $'
- RegEDX DB 10,13,'EDX = $'
- RegEIP DB 10,13,'EIP = $'
- RegCS DB 10,13,'CS = $'
-
- Msg1 DB 'DEMO - Programmierung der Debug-Register -'
- DB ' von Sven Letzel', 10,13,'$'
- Msg2 DB 10,10,13,'Drücken Sie eine Taste für Breakpoint-Test. '
- DB '<ESC> = Ende $'
- Msg3 DB 'Warnung! Programm läuft nur auf 386-CPU oder höher. '
- DB '<ESC> für abbrechen.',10,10,13,07,36
- Msg4 DB 10,10,13,10,7,'Breakpoint Nr.: $'
- CR DB 10,13,36
-
- HexZiffern DB '0123456789ABCDEF'
-
- OfsInt01 DW ?
- SegInt01 DW ?
-
- .CODE
-
- DOS MACRO Nr ; Makro für DOS-Aufrufe
- MOV AX, Nr
- INT 21H
- ENDM
- P386
-
- INT01 PROC FAR ; Handler für Debug-Interrupt
- PUSH EBP
- MOV EBP, ESP ; Stackrahmen
- PUSH DS ; Register sichern
- PUSH ES ; Register sichern
- PUSHAD ; Register sichern
- PUSHAD ; Register sichern
-
- LEA DX, Msg4 ; Meldung ausgeben
- DOS 0900H
-
- MOV EDX, DR6 ; DR6 holen
- XOR EBX, EBX
- MOV DR6, EBX ; DR6 zurücksetzen !!
-
- AND DL, 011B ; maskieren
- ADD DL, 47 ; Zahl -> ASCII
- DOS 0200H ; und ausgeben
-
- MOV EAX, DR7 ; DR7 muß ebenfalls zurück-
- BTC EAX, 1 ; gesetzt werden
- BTC EAX, 3 ; Ursache löschen und
- MOV DR7, EAX ; anderen aktivieren
-
- LEA DX, CR ; Zeilenschaltung
- DOS 0900H
-
- LEA DX, RegEAX ; EAX ausgeben
- DOS 0900H
- POPAD
- CALL Disphex
-
- PUSH DX ; EBX ausgeben
- LEA DX, RegEBX
- DOS 0900H
- POP DX
- MOV EAX, EBX
- CALL Disphex
-
- PUSH DX ; ECX ausgeben
- LEA DX, RegECX
- DOS 0900H
- POP DX
- MOV EAX, ECX
- CALL Disphex
-
- PUSH DX ; EDX ausgeben
- LEA DX, RegEDX
- DOS 0900H
- POP DX
- MOV EAX, EDX
- CALL Disphex
-
- LEA DX, RegCS ; CS ausgeben
- DOS 0900H
- XOR EAX, EAX
- MOV AX, [BP+06]
- CALL Disphex
-
- LEA DX, RegEIP ; EIP ausgeben
- DOS 0900H
- XOR EAX, EAX
- MOV AX, [BP+04]
- CALL Disphex
-
- POPAD ; alle Register zurück
- POP ES
- POP DS
- POP EBP
- IRET ; weitermachen
- INT01 ENDP
-
- Disphex PROC ; EAX-Register als Hex-Zahl
- PUSHAD ; Register sichern
- MOV EBP, ESP ; Stack merken
- XOR EDX, EDX
- MOV EDI, OFFSET HexZiffern
- MOV CX, 8 ; 8 Nibbels
- @@11:
- MOV EBX, EAX ; in EAX ist Zahl
- AND EBX, 0FH ; unterstes Nibbel maskieren
- MOV DL, [EDI][EBX] ; Hexziffer laden
- PUSH DX ; auf Stack
- SHR EAX, 4 ; nächstes Nibbel
- LOOP @@11
- @@12:
- POP DX ; alle Zahlen zurück
- DOS 0200H ; und ausgeben
- CMP EBP, ESP ; bis Stack wie vorher
- JNZ @@12
- POPAD ; Register zurück
- RET
- Disphex ENDP
-
- Dummy PROC ; Dummy-Prozedur, es werden
- ; willkürliche Befehle ausgeführt
- MOV EAX, 11111111H
- MOV EBX, 22222222H
- MOV ECX, 33333333H
- MOV EDX, 44444444H
- @@B0: ; Hier soll Breakpoint 0 sein
- ADD EAX, EBX
- ADD EBX, ECX
- ADD ECX, EDX
- ADD EDX, EAX
- @@B1: ; Hier soll Breakpoint 1 sein
- RET
- Dummy ENDP
-
- Main PROC FAR
- MOV AX, SEG @DATA ; hier gehts los
- MOV DS, AX ; DS laden
-
- LEA DX, Msg3 ; Meldung ausgeben
- DOS 0900H
- XOR AX, AX
- INT 16H ; und auf Taste warten
- XOR AL, 1BH
- JNZ @@Ok
- DOS 4C01H
- @@Ok:
- DOS 3501H ; I-Vector lesen
- MOV [OfsInt01], BX ; und sichern
- MOV [SegInt01], ES
-
- PUSH DS ; CS -> DS
- PUSH CS
- POP DS
- LEA DX, INT01
- DOS 2501H ; I-Vector setzen
- POP DS ; DS zurück
-
- MOV AX, CS
- CWD ; -> 32 Bit
- SHL EAX, 4 ; *16
- PUSH EAX ; merken
- ADD EAX, OFFSET @@B0 ; Offset dazu
- MOV DR0, EAX ; Breakpoint 0 setzen
- POP EAX
- ADD EAX, OFFSET @@B1 ; zweiten berechnen
- MOV DR1, EAX ; Breakpoint 1 setzen
- XOR EAX, EAX
- BTS EAX, 1 ; ersten B-Point aktivieren
- BTS EAX, 9
- MOV DR7, EAX ; Breakpoints aktivieren
- LEA DX, Msg1
- DOS 0900H ; Meldung ausgeben
- @@1:
- LEA DX, Msg2
- DOS 0900H ; Meldung ausgeben
- XOR AX, AX
- INT 16H ; auf Taste warten
- XOR AL, 1BH ; ESC ?
- JZ @@Exit
- CALL Dummy ; Dummy-Prozedur, da sind
- JMP SHORT @@1 ; Breakpoints
- @@Exit:
- PUSH DS ; DS merken
- MOV DS, [SegInt01] ; gesicherten I-Vector
- MOV DX, [OfsInt01] ; holen
- DOS 2501H ; und zurücksetzen
- POP DS
- XOR EAX, EAX
- MOV DR7, EAX ; Steuerregister zurücksetzen
- DOS 4C00H ; Programmende
- Main ENDP
-
- END Main
-