public List <Opcode> BuildProgram() { var program = new List <Opcode>(); foreach (var objectFile in objectFiles.Values) { var linkedObject = new CodePart(); foreach (var part in objectFile.Parts) { AddInitializationCode(linkedObject, part); linkedObject.FunctionsCode.AddRange(part.FunctionsCode); linkedObject.MainCode.AddRange(part.MainCode); } // we assume that the first object is the main program and the rest are subprograms/libraries bool isMainProgram = (objectFile == objectFiles.Values.First()); // add a jump to the entry point so the execution skips the functions code if (isMainProgram) { AddJumpToEntryPoint(linkedObject); } // add an instruction to indicate the end of the program AddEndOfProgram(linkedObject, isMainProgram); // save the entry point of the object objectFile.EntryPointLabel = GetEntryPointLabel(linkedObject); // add the linked object to the final program program.AddRange(linkedObject.MergeSections()); } // replace all the labels references with the corresponding address ReplaceLabels(program); return(program); }
public List<Opcode> BuildProgram() { List<Opcode> program = new List<Opcode>(); foreach (var objectFile in _objectFiles.Values) { CodePart linkedObject = new CodePart(); foreach (var part in objectFile.Parts) { AddInitializationCode(linkedObject, part); linkedObject.FunctionsCode.AddRange(part.FunctionsCode); linkedObject.MainCode.AddRange(part.MainCode); } // we assume that the first object is the main program and the rest are subprograms/libraries bool isMainProgram = (objectFile == _objectFiles.Values.First()); // add a jump to the entry point so the execution skips the functions code if (isMainProgram) AddJumpToEntryPoint(linkedObject); // add an instruction to indicate the end of the program AddEndOfProgram(linkedObject, isMainProgram); // save the entry point of the object objectFile.EntryPointLabel = GetEntryPointLabel(linkedObject); // add the linked object to the final program program.AddRange(linkedObject.MergeSections()); } // replace all the labels references with the corresponding address ReplaceLabels(program); return program; }
private void AddJumpToEntryPoint(CodePart linkedObject) { if (linkedObject.MainCode.Count > 0) { OpcodeBranchJump jumpOpcode = new OpcodeBranchJump(); jumpOpcode.DestinationLabel = GetEntryPointLabel(linkedObject); linkedObject.FunctionsCode.Insert(0, jumpOpcode); } }
protected virtual void AddEndOfProgram(CodePart linkedObject, bool isMainProgram) { if (isMainProgram) { linkedObject.MainCode.Add(new OpcodeEOP()); } else { linkedObject.MainCode.Add(new OpcodeReturn()); } }
private string GetEntryPointLabel(CodePart linkedObject) { List <Opcode> codeSection = linkedObject.InitializationCode.Count > 0 ? linkedObject.InitializationCode : linkedObject.MainCode; return(codeSection[0].Label); }
protected virtual void AddInitializationCode(CodePart linkedObject, CodePart part) { linkedObject.InitializationCode.AddRange(part.InitializationCode); }
protected override void AddInitializationCode(CodePart linkedObject, CodePart part) { linkedObject.MainCode.AddRange(part.InitializationCode); }
protected override void AddEndOfProgram(CodePart linkedObject, bool isMainProgram) { linkedObject.MainCode.Add(new OpcodeEOF()); }
private string GetEntryPointLabel(CodePart linkedObject) { List<Opcode> codeSection = linkedObject.InitializationCode.Count > 0 ? linkedObject.InitializationCode : linkedObject.MainCode; return codeSection[0].Label; }