[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]

    {
    Here is some code I use to find out how many stack space is used after a
    run. I guess it won't work in protected mode. Be aware
    it isn't byte-resolution ! I'd like to hear about enhancements.
    }

    unit Stack;
    interface
      procedure InitStack;
      procedure TestStack;
    implementation

    (*
    Routinen zum Pruefen des Stackbedarfs
    Wilfried F?rber, Isar Software GmbH
    Ringeisstr. 2a, 8000 Muenchen 2
    August 1991

    Routinen zum Pruefen, wieviel Stack wirklich benoetigt wird.
    Willfried F?rber, Isar Software GmbH, August 1991
    Port von C nach Pascal: Jacques NOMSSI NZALI,
    email: nomssi@physikus.physik.tu-chemnitz.de
    *)
    Var STKHQQ : word;

    const
      stacktext : packed array[1..4] of char = 'STAC';
      MAXSTACK = (1024 div 4)*64;

    function atopsp : Word; assembler;
    asm
      mov ax, sp
    end;

    procedure InitStack;
    var
      AktStack,
      Anzahl : Word;
    begin
      STKHQQ := StackLimit;
      asm
        mov AktStack, bp
      end;
      Anzahl := (AktStack - STKHQQ) div 4;
      asm
        mov cx, [Anzahl]
        mov di, [STKHQQ]
        mov ax, ss

        mov es, ax
        mov ax, Offset StackText
        @L1:
        mov si, ax
        movsw
        movsw
        loop @L1
      end;
    end;

    function StackSize : Word;
    begin
      StackSize := - STKHQQ + atopsp;
    end;

    function StackUsed : Word;
    var
      StackFrei,
      StackMax : Word;
    Begin
      StackMax := StackSize;
      asm
        mov cx, MAXSTACK
        mov di, [STKHQQ]
        mov ax, ss

        mov es, ax
        mov ax, Offset Stacktext
      @L1:
        mov si, ax
        cmpsw
        jnz @L2
        cmpsw
        loope @L1
      @L2:
        sub cx, MAXSTACK
        not cx
        mov [StackFrei], cx
      end;
      StackFrei := StackFrei*4;
      StackUsed := StackMax - StackFrei;
    end;

    procedure TestStack;
    var
      StackVerb, _MaxStack : Word;
    begin
      _MaxStack := StackSize;
      StackVerb := StackUsed;
      WriteLn('STACK-VERBRAUCHSTEST ---------------------- ');
      WriteLn('Programmstack :', _MaxStack);
      WriteLn('Es wurden ca. ',StackVerb,' Bytes benoetigt.');
      WriteLn('Stack-Reserve :',MaxStack-StackVerb,' Bytes.');
      ReadLn;
    end;

    begin
      InitStack;
    end.

[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]