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);
}