Creating and Destroying Stack Frame

Programs created with Turbo Pascal use stack frame. This is part of the processor's stack space which can be accessed using a dedicated base pointer (BP) register.
PUSH    BP
MOV     BP, SP
SUB     SP, StackFrameSize
...
...
...
MOV     SP, BP
POP     BP
RET

Stack frame is usually used for local variables. This is very convenient because BP can acces all pushed parameters (using positive offset) and local variables in stack frame (using negative offset). Two procedures generate code to create and destroy stack frame.
Procedure CreateStackFrame;
begin
  If (Instructions80286 in StatementCompilerSwitches) and (ProgramBlockMaxStackFrameOffset <> 0) and
    not (StackChecking in StatementCompilerSwitches) then
      begin
        GenerateInstruction_Byte (ENTER);
        GenerateInstruction_Word (- ProgramBlockMaxStackFrameOffset);
        GenerateInstruction_Byte (0);
      end else begin
                 GenerateInstruction_Byte (PUSH_BP);
                 GenerateInstruction_Word (MOV_BP_SP);
                 If StackChecking in StatementCompilerSwitches then
                  begin
                    GenerateInstruction_MOV_16BitReg_Immediate (rAX, - ProgramBlockMaxStackFrameOffset);
                    GenerateInstruction_CALL_FAR (SysProc_StackCheck);
                  end;
                 If ProgramBlockMaxStackFrameOffset <> 0 then
                   GenerateArithmeticInstruction_16BitReg_Immediate (SUB_SP, - ProgramBlockMaxStackFrameOffset);
               end;
end;
Procedure DestroyStackFrame;
begin
  If Instructions80286 in StatementCompilerSwitches then GenerateInstruction_Byte (LEAVE)
    else begin
           If ProgramBlockMaxStackFrameOffset or NumberOfLocalParameters <> 0 then GenerateInstruction_Word (MOV_SP_BP);
           GenerateInstruction_Byte (POP_BP)
         end;
end;
 
 
 
© 2017 Turbo Pascal | Privacy Policy