home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* TRACE.INC (v1.0) *)
- (* Unterprogrammaufruf-Rückverfolger für Turbo Pascal unter MS-DOS *)
- (* (c) 1987 Karsten Gieselmann & PASCAL International *)
- (* ----------------------------------------------------------------------- *)
-
- VAR HighLevel: INTEGER; (* Maximalwert für BasePointer/StackPointer *)
-
- (* ----------------------------------------------------------------------- *)
- (* initialisiert den Tracer: Es werden alle Aufrufe bis zu der Ebene zu- *)
- (* rückverfolgt, aus welcher diese Prozedur zuletzt aufgerufen wurde! *)
-
- PROCEDURE InitTracer;
-
- BEGIN
- INLINE ($89/$EF/ (* MOV DI,BP ;BasePointer holen *)
- $36/$8B/$7D/$00/ (* MOV DI,SS:[DI+00] ;nächsten BP holen *)
- $89/$3E/HighLevel) (* MOV [HighLevel],DI ;...und festhalten *)
- END;
-
- (* ----------------------------------------------------------------------- *)
- (* verfolgt alle Unterprogrammaufrufe bis zu der durch InitTracer festge- *)
- (* legten Ebene. Ausgegeben wird jeweils die Adresse im Codesegment, bei *)
- (* welcher der Sprung in das nächste Unterprogramm erfolgte. *)
-
- PROCEDURE TraceBack;
-
- CONST HexDigit :ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
-
- TYPE Hex = STRING[4];
-
- VAR CallPC, Level: INTEGER;
-
-
- FUNCTION HexByte (b: BYTE): Hex;
-
- BEGIN
- HexByte := HexDigit[b SHR 4] + HexDigit[b AND $0F]
- END;
-
-
- FUNCTION HexWord (w: INTEGER): Hex;
- BEGIN
- HexWord := HexByte (w SHR 8) + HexByte (w AND $FF)
- END;
-
-
- BEGIN
- WriteLn;
- WriteLn ('Traceback:');
- WriteLn;
- INLINE ($89/$AE/Level); (* MOV [Level],BP ;BasePointer holen *)
- REPEAT
- INLINE ($8B/$BE/Level/ (* MOV DI,[Level] ;BasePointer laden *)
- $36/$8B/$45/$02/ (* MOV AX,[DI+02] ;CALL-Adresse holen *)
- $2D/$03/$00/ (* SUB AX,0003 ;CALL abziehen *)
- $89/$86/CallPC/ (* MOV CallPC,AX ;...und festhalten *)
- $36/$8B/$7D/$00/ (* MOV DI,SS:[DI+00] ;nächsten BP holen *)
- $89/$BE/Level); (* MOV [Level],DI ;...und festhalten *)
- WriteLn (HexWord (CallPC));
- UNTIL Level = HighLevel (* ...bis oberste Ebene erreicht *)
- END;
- (* ----------------------------------------------------------------------- *)
- (* TRACE.INC (v1.0) *)
-