Jumps and Labels
Turbo Pascal generates jumps in an interesting way. Since most jumps will jump to the same place, Turbo Pascal keeps them in a linked list.
Each near jump (within segment) can be part of a jump list. This procedure creates intermediate code for a jump instruction and adds it to the list.
Procedure GenerateCodeForNearJump (Var JumpRecordList: Word; OpCode: Byte);
Var Saved_PreviousJumpRecord: Word;
begin
Saved_PreviousJumpRecord := JumpRecordList;
JumpRecordList := SymbolTable [stIntermediateCode].UsedSize;
With PIntermediateCodeRecord (IncreaseSymbolTable (stIntermediateCode, 8))^ do
begin
RecordType := icJumpNear;
JumpOpCode := OpCode;
PreviousJumpRecord := Saved_PreviousJumpRecord;
end
end;
Once the jumps are generated, the compiler can generate a label. This procedure generates label intermediate code and sets all jumps in a list to point to it.
Procedure GenerateLabelAndSetJumpsToIt (Var JumpRecordList: Word);
Var LabelRecord: PIntermediateCodeRecord;
JumpRecord: PIntermediateCodeRecord;
JumpRecordOfs: Word absolute JumpRecord;
CurrentJumpRecord: Word;
begin
CurrentJumpRecord := JumpRecordList;
JumpRecordList := 0;
If CurrentJumpRecord = 0 then Exit;
LabelRecord := IncreaseSymbolTable (stIntermediateCode, 3);
LabelRecord^.Recordtype := icLabel;
JumpRecord := Ptr (Seg (LabelRecord^), 0);
Repeat
JumpRecordOfs := CurrentJumpRecord;
CurrentJumpRecord := JumpRecord^.PreviousJumpRecord;
JumpRecord^.LabelRecordOffset := Ofs (LabelRecord^) + 1;
until CurrentJumpRecord = 0;
end;