[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]