home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 04 / trace.inc < prev    next >
Encoding:
Text File  |  1988-01-25  |  2.5 KB  |  65 lines

  1. (* ----------------------------------------------------------------------- *)
  2. (*                               TRACE.INC  (v1.0)                         *)
  3. (*    Unterprogrammaufruf-Rückverfolger für Turbo Pascal unter MS-DOS      *)
  4. (*          (c) 1987  Karsten Gieselmann  &  PASCAL International          *)
  5. (* ----------------------------------------------------------------------- *)
  6.  
  7. VAR HighLevel: INTEGER;        (* Maximalwert für BasePointer/StackPointer *)
  8.  
  9. (* ----------------------------------------------------------------------- *)
  10. (* initialisiert den Tracer: Es werden alle Aufrufe bis zu der Ebene zu-   *)
  11. (* rückverfolgt, aus welcher diese Prozedur zuletzt aufgerufen wurde!      *)
  12.  
  13. PROCEDURE InitTracer;
  14.  
  15. BEGIN
  16.   INLINE ($89/$EF/             (*  MOV  DI,BP          ;BasePointer holen  *)
  17.           $36/$8B/$7D/$00/     (*  MOV  DI,SS:[DI+00]  ;nächsten BP holen  *)
  18.           $89/$3E/HighLevel)   (*  MOV  [HighLevel],DI ;...und festhalten  *)
  19. END;
  20.  
  21. (* ----------------------------------------------------------------------- *)
  22. (* verfolgt alle Unterprogrammaufrufe bis zu der durch InitTracer festge-  *)
  23. (* legten Ebene. Ausgegeben wird jeweils die Adresse im Codesegment, bei   *)
  24. (* welcher der Sprung in das nächste Unterprogramm erfolgte.               *)
  25.  
  26. PROCEDURE TraceBack;
  27.  
  28.    CONST HexDigit :ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
  29.  
  30.    TYPE  Hex = STRING[4];
  31.  
  32.    VAR   CallPC, Level: INTEGER;
  33.  
  34.  
  35.    FUNCTION HexByte (b: BYTE): Hex;
  36.  
  37.    BEGIN
  38.      HexByte := HexDigit[b SHR 4] + HexDigit[b AND $0F]
  39.    END;
  40.  
  41.  
  42.    FUNCTION HexWord (w: INTEGER): Hex;
  43.    BEGIN
  44.      HexWord := HexByte (w SHR 8) + HexByte (w AND $FF)
  45.    END;
  46.  
  47.  
  48. BEGIN
  49.   WriteLn;
  50.   WriteLn ('Traceback:');
  51.   WriteLn;
  52.   INLINE ($89/$AE/Level);      (*  MOV  [Level],BP     ;BasePointer holen  *)
  53.   REPEAT
  54.     INLINE ($8B/$BE/Level/     (*  MOV  DI,[Level]     ;BasePointer laden  *)
  55.             $36/$8B/$45/$02/   (*  MOV  AX,[DI+02]     ;CALL-Adresse holen *)
  56.             $2D/$03/$00/       (*  SUB  AX,0003        ;CALL abziehen      *)
  57.             $89/$86/CallPC/    (*  MOV  CallPC,AX      ;...und festhalten  *)
  58.             $36/$8B/$7D/$00/   (*  MOV  DI,SS:[DI+00]  ;nächsten BP holen  *)
  59.             $89/$BE/Level);    (*  MOV  [Level],DI     ;...und festhalten  *)
  60.     WriteLn (HexWord (CallPC));
  61.   UNTIL Level = HighLevel                 (* ...bis oberste Ebene erreicht *)
  62. END;
  63. (* ----------------------------------------------------------------------- *)
  64. (*                               TRACE.INC  (v1.0)                         *)
  65.