Rajshekar K K
5 years ago
commit
f483ee2c38
10 changed files with 678 additions and 0 deletions
@ -0,0 +1,44 @@ |
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
|||
<!-- WARNING: Eclipse auto-generated file. |
|||
Any modifications will be overwritten. |
|||
To include a user specific buildfile here, simply create one in the same |
|||
directory with the processing instruction <?eclipse.ant.import?> |
|||
as the first entry and export the buildfile again. --><project basedir="." default="build" name="CustomISAAssembler"> |
|||
<property environment="env"/> |
|||
<property name="debuglevel" value="source,lines,vars"/> |
|||
<property name="target" value="1.8"/> |
|||
<property name="source" value="1.8"/> |
|||
<path id="CustomISAAssembler.classpath"> |
|||
<pathelement location="bin"/> |
|||
</path> |
|||
<target name="init"> |
|||
<mkdir dir="bin"/> |
|||
<copy includeemptydirs="false" todir="bin"> |
|||
<fileset dir="src"> |
|||
<exclude name="**/*.launch"/> |
|||
<exclude name="**/*.java"/> |
|||
</fileset> |
|||
</copy> |
|||
</target> |
|||
<target name="clean"> |
|||
<delete dir="bin"/> |
|||
</target> |
|||
<target depends="clean" name="cleanall"/> |
|||
<target depends="build-subprojects,build-project" name="build"/> |
|||
<target name="build-subprojects"/> |
|||
<target depends="init" name="build-project"> |
|||
<echo message="${ant.project.name}: ${ant.file}"/> |
|||
<javac debug="true" debuglevel="${debuglevel}" destdir="bin" includeantruntime="false" source="${source}" target="${target}"> |
|||
<src path="src"/> |
|||
<classpath refid="CustomISAAssembler.classpath"/> |
|||
</javac> |
|||
</target> |
|||
<target name="make-jar" depends="build"> |
|||
<mkdir dir="jars"/> |
|||
<jar destfile="jars/assembler.jar" basedir="bin"> |
|||
<manifest> |
|||
<attribute name="Main-Class" value="main.Main"/> |
|||
</manifest> |
|||
</jar> |
|||
</target> |
|||
</project> |
@ -0,0 +1,116 @@ |
|||
package configuration; |
|||
|
|||
import java.io.File; |
|||
|
|||
import javax.xml.parsers.DocumentBuilder; |
|||
import javax.xml.parsers.DocumentBuilderFactory; |
|||
|
|||
import org.w3c.dom.Document; |
|||
import org.w3c.dom.Element; |
|||
import org.w3c.dom.Node; |
|||
import org.w3c.dom.NodeList; |
|||
|
|||
import generic.Misc; |
|||
|
|||
public class Configuration { |
|||
public static int ALU_count; |
|||
public static int ALU_latency; |
|||
public static int ALU_reciprocal_of_throughput; |
|||
public static int multiplier_count; |
|||
public static int multiplier_latency; |
|||
public static int multiplier_reciprocal_of_throughput; |
|||
public static int divider_count; |
|||
public static int divider_latency; |
|||
public static int divider_reciprocal_of_throughput; |
|||
|
|||
public static int L1i_numberOfLines; |
|||
public static int L1i_latency; |
|||
public static int L1i_associativity; |
|||
public static String L1i_replacementPolicy; |
|||
|
|||
public static int L1d_numberOfLines; |
|||
public static int L1d_latency; |
|||
public static int L1d_associativity; |
|||
public static String L1d_replacementPolicy; |
|||
|
|||
public static int L2_numberOfLines; |
|||
public static int L2_latency; |
|||
public static int L2_associativity; |
|||
public static String L2_replacementPolicy; |
|||
|
|||
public static int mainMemoryLatency; |
|||
|
|||
public static void parseConfiguratioFile(String configFileName) |
|||
{ |
|||
Document doc = null; |
|||
|
|||
try |
|||
{ |
|||
File file = new File(configFileName); |
|||
DocumentBuilderFactory DBFactory = DocumentBuilderFactory.newInstance(); |
|||
DocumentBuilder DBuilder = DBFactory.newDocumentBuilder(); |
|||
doc = DBuilder.parse(file); |
|||
doc.getDocumentElement().normalize(); |
|||
} |
|||
catch(Exception e) |
|||
{ |
|||
e.printStackTrace(); |
|||
Misc.printErrorAndExit("Error in reading config file : " + e); |
|||
} |
|||
|
|||
NodeList nodeLst = doc.getElementsByTagName("ALU"); |
|||
Element elmnt = (Element) nodeLst.item(0); |
|||
ALU_count = Integer.parseInt(getImmediateString("Count", elmnt)); |
|||
ALU_latency = Integer.parseInt(getImmediateString("Latency", elmnt)); |
|||
ALU_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt)); |
|||
|
|||
nodeLst = doc.getElementsByTagName("Multiplier"); |
|||
elmnt = (Element) nodeLst.item(0); |
|||
multiplier_count = Integer.parseInt(getImmediateString("Count", elmnt)); |
|||
multiplier_latency = Integer.parseInt(getImmediateString("Latency", elmnt)); |
|||
multiplier_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt)); |
|||
|
|||
nodeLst = doc.getElementsByTagName("Divider"); |
|||
elmnt = (Element) nodeLst.item(0); |
|||
divider_count = Integer.parseInt(getImmediateString("Count", elmnt)); |
|||
divider_latency = Integer.parseInt(getImmediateString("Latency", elmnt)); |
|||
divider_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt)); |
|||
|
|||
nodeLst = doc.getElementsByTagName("L1iCache"); |
|||
elmnt = (Element) nodeLst.item(0); |
|||
L1i_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt)); |
|||
L1i_latency = Integer.parseInt(getImmediateString("Latency", elmnt)); |
|||
L1i_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt)); |
|||
L1i_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt); |
|||
|
|||
nodeLst = doc.getElementsByTagName("L1dCache"); |
|||
elmnt = (Element) nodeLst.item(0); |
|||
L1d_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt)); |
|||
L1d_latency = Integer.parseInt(getImmediateString("Latency", elmnt)); |
|||
L1d_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt)); |
|||
L1d_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt); |
|||
|
|||
nodeLst = doc.getElementsByTagName("L2Cache"); |
|||
elmnt = (Element) nodeLst.item(0); |
|||
L2_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt)); |
|||
L2_latency = Integer.parseInt(getImmediateString("Latency", elmnt)); |
|||
L2_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt)); |
|||
L2_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt); |
|||
|
|||
nodeLst = doc.getElementsByTagName("Configuration"); |
|||
elmnt = (Element) nodeLst.item(0); |
|||
mainMemoryLatency = Integer.parseInt(getImmediateString("MainMemoryLatency", elmnt)); |
|||
} |
|||
|
|||
private static String getImmediateString(String tagName, Element parent) // Get the immediate string value of a particular tag name under a particular parent tag
|
|||
{ |
|||
NodeList nodeLst = parent.getElementsByTagName(tagName); |
|||
if (nodeLst.item(0) == null) |
|||
{ |
|||
Misc.printErrorAndExit("XML Configuration error : Item \"" + tagName + "\" not found inside the \"" + parent.getTagName() + "\" tag in the configuration file!!"); |
|||
} |
|||
Element NodeElmnt = (Element) nodeLst.item(0); |
|||
NodeList resultNode = NodeElmnt.getChildNodes(); |
|||
return ((Node) resultNode.item(0)).getNodeValue(); |
|||
} |
|||
} |
@ -0,0 +1,43 @@ |
|||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> |
|||
<Configuration> |
|||
<FunctionalUnits> |
|||
<ALU> |
|||
<Count>2</Count> |
|||
<Latency>1</Latency> |
|||
<ReciprocalOfThroughput>1</ReciprocalOfThroughput> |
|||
</ALU> |
|||
<Multiplier> |
|||
<Count>1</Count> |
|||
<Latency>4</Latency> |
|||
<ReciprocalOfThroughput>1</ReciprocalOfThroughput> |
|||
</Multiplier> |
|||
<Divider> |
|||
<Count>1</Count> |
|||
<Latency>10</Latency> |
|||
<ReciprocalOfThroughput>1</ReciprocalOfThroughput> |
|||
</Divider> |
|||
</FunctionalUnits> |
|||
|
|||
<L1iCache> |
|||
<NumberOfLines>256</NumberOfLines> |
|||
<Latency>2</Latency> |
|||
<Associativity>4</Associativity> |
|||
<ReplacementPolicy>LRU</ReplacementPolicy> |
|||
</L1iCache> |
|||
|
|||
<L1dCache> |
|||
<NumberOfLines>256</NumberOfLines> |
|||
<Latency>2</Latency> |
|||
<Associativity>4</Associativity> |
|||
<ReplacementPolicy>LRU</ReplacementPolicy> |
|||
</L1dCache> |
|||
|
|||
<L2Cache> |
|||
<NumberOfLines>2048</NumberOfLines> |
|||
<Latency>10</Latency> |
|||
<Associativity>4</Associativity> |
|||
<ReplacementPolicy>LRU</ReplacementPolicy> |
|||
</L2Cache> |
|||
|
|||
<MainMemoryLatency>40</MainMemoryLatency> |
|||
</Configuration> |
@ -0,0 +1,96 @@ |
|||
package generic; |
|||
|
|||
public class Instruction { |
|||
|
|||
public enum OperationType {add, addi, sub, subi, mul, muli, div, divi, and, andi, or, ori, xor, xori, slt, slti, sll, slli, srl, srli, sra, srai, load, store, jmp, beq, bne, blt, bgt, end}; |
|||
|
|||
int programCounter; |
|||
OperationType operationType; |
|||
Operand sourceOperand1; |
|||
Operand sourceOperand2; |
|||
Operand destinationOperand; |
|||
|
|||
public int getProgramCounter() { |
|||
return programCounter; |
|||
} |
|||
public void setProgramCounter(int programCounter) { |
|||
this.programCounter = programCounter; |
|||
} |
|||
public OperationType getOperationType() { |
|||
return operationType; |
|||
} |
|||
public void setOperationType(OperationType operationType) { |
|||
this.operationType = operationType; |
|||
} |
|||
public Operand getSourceOperand1() { |
|||
return sourceOperand1; |
|||
} |
|||
public void setSourceOperand1(Operand sourceOperand1) { |
|||
this.sourceOperand1 = sourceOperand1; |
|||
} |
|||
public Operand getSourceOperand2() { |
|||
return sourceOperand2; |
|||
} |
|||
public void setSourceOperand2(Operand sourceOperand2) { |
|||
this.sourceOperand2 = sourceOperand2; |
|||
} |
|||
public Operand getDestinationOperand() { |
|||
return destinationOperand; |
|||
} |
|||
public void setDestinationOperand(Operand destinationOperand) { |
|||
this.destinationOperand = destinationOperand; |
|||
} |
|||
public String toString() |
|||
{ |
|||
if(sourceOperand1 != null) |
|||
{ |
|||
if(sourceOperand2 != null) |
|||
{ |
|||
if(destinationOperand != null) |
|||
{ |
|||
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\t" + sourceOperand2 + "\t" + destinationOperand + "\n"; |
|||
} |
|||
else |
|||
{ |
|||
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\t" + sourceOperand2 + "\tnull" + "\n"; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if(destinationOperand != null) |
|||
{ |
|||
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\tnull" + "\t" + destinationOperand + "\n"; |
|||
} |
|||
else |
|||
{ |
|||
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\tnull" + "\tnull" + "\n"; |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if(sourceOperand2 != null) |
|||
{ |
|||
if(destinationOperand != null) |
|||
{ |
|||
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\t" + sourceOperand2 + "\t" + destinationOperand + "\n"; |
|||
} |
|||
else |
|||
{ |
|||
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\t" + sourceOperand2 + "\tnull" + "\n"; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if(destinationOperand != null) |
|||
{ |
|||
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\tnull" + "\t" + destinationOperand + "\n"; |
|||
} |
|||
else |
|||
{ |
|||
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\tnull" + "\tnull" + "\n"; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,10 @@ |
|||
package generic; |
|||
|
|||
public class Misc { |
|||
|
|||
public static void printErrorAndExit(String message) |
|||
{ |
|||
System.err.println(message); |
|||
System.exit(1); |
|||
} |
|||
} |
@ -0,0 +1,41 @@ |
|||
package generic; |
|||
|
|||
public class Operand { |
|||
|
|||
public enum OperandType {Register, Immediate, Label}; |
|||
|
|||
OperandType operandType; |
|||
int value; |
|||
String labelValue; //only applicable for Label type;
|
|||
//Note that Label type is only applicable for functional emulation of assembly file
|
|||
|
|||
public OperandType getOperandType() { |
|||
return operandType; |
|||
} |
|||
public void setOperandType(OperandType operandType) { |
|||
this.operandType = operandType; |
|||
} |
|||
public int getValue() { |
|||
return value; |
|||
} |
|||
public void setValue(int value) { |
|||
this.value = value; |
|||
} |
|||
public String getLabelValue() { |
|||
return labelValue; |
|||
} |
|||
public void setLabelValue(String labelValue) { |
|||
this.labelValue = labelValue; |
|||
} |
|||
public String toString() |
|||
{ |
|||
if(operandType == OperandType.Register || operandType == OperandType.Immediate) |
|||
{ |
|||
return "[" + operandType.toString() + ":" + value + "]"; |
|||
} |
|||
else |
|||
{ |
|||
return "[" + operandType.toString() + ":" + labelValue + "]"; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,268 @@ |
|||
package generic; |
|||
|
|||
import java.io.FileInputStream; |
|||
import java.io.FileNotFoundException; |
|||
import java.util.ArrayList; |
|||
import java.util.Arrays; |
|||
import java.util.HashMap; |
|||
import java.util.Scanner; |
|||
import java.util.regex.Pattern; |
|||
import generic.Instruction.OperationType; |
|||
import generic.Operand.OperandType; |
|||
|
|||
public class ParsedProgram { |
|||
static ArrayList<Instruction> code = new ArrayList<Instruction>(); |
|||
static int mainFunctionAddress; |
|||
static int firstCodeAddress; |
|||
static ArrayList<Integer> data = new ArrayList<Integer>(); |
|||
|
|||
public static void setMainFunctionAddress(int addr) |
|||
{ |
|||
mainFunctionAddress = addr; |
|||
} |
|||
|
|||
public static void setFirstCodeAddress(int addr) |
|||
{ |
|||
firstCodeAddress = addr; |
|||
} |
|||
|
|||
public static Instruction getInstructionAt(int programCounter) |
|||
{ |
|||
return code.get(programCounter - firstCodeAddress); |
|||
} |
|||
|
|||
|
|||
static HashMap<String, Integer> symtab = new HashMap<String,Integer>(); |
|||
|
|||
|
|||
public static int parseDataSection(String assemblyProgramFile) |
|||
{ |
|||
FileInputStream inputStream = null; |
|||
try |
|||
{ |
|||
inputStream = new FileInputStream(assemblyProgramFile); |
|||
} |
|||
catch(FileNotFoundException e) { |
|||
Misc.printErrorAndExit(e.toString()); |
|||
} |
|||
|
|||
Scanner sc=new Scanner(inputStream); |
|||
int address = 0; //Store data staring from 1st memory location. At 0th location we denote the start of the code section.
|
|||
|
|||
|
|||
while(sc.hasNextLine()) //TODO 3 loops?
|
|||
{ |
|||
String line=sc.nextLine(); |
|||
|
|||
if(line.contains(".data")) //Processing the .data section
|
|||
{ |
|||
line=sc.next(); |
|||
|
|||
do |
|||
{ |
|||
if(Pattern.matches("[a-zA-Z]+([0-9]*)(:)", line)) |
|||
{ |
|||
ParsedProgram.symtab.put(line.replaceAll("[^a-zA-Z]",""), address);//TODO removed statements that were adding data to the code arraylist
|
|||
|
|||
while(Pattern.matches("-?\\d+", line=sc.next())) |
|||
{ |
|||
data.add(Integer.parseInt(line)); |
|||
address++; |
|||
|
|||
} |
|||
} |
|||
}while(!line.contains(".text")); |
|||
|
|||
break; |
|||
} |
|||
} |
|||
|
|||
sc.close(); |
|||
|
|||
setFirstCodeAddress(address); |
|||
|
|||
return address; |
|||
} |
|||
|
|||
public static void parseCodeSection(String assemblyProgramFile, int firstCodeAddress) |
|||
{ |
|||
FileInputStream inputStream = null; |
|||
try |
|||
{ |
|||
inputStream = new FileInputStream(assemblyProgramFile); |
|||
} |
|||
catch(FileNotFoundException e) { |
|||
Misc.printErrorAndExit(e.toString()); |
|||
} |
|||
|
|||
Scanner sc=new Scanner(inputStream); |
|||
int address = firstCodeAddress; |
|||
|
|||
while(sc.hasNextLine()) |
|||
{ |
|||
String line=sc.nextLine(); |
|||
if(line.contains(".text")) |
|||
{ |
|||
break; |
|||
} |
|||
} |
|||
|
|||
while(sc.hasNextLine()) |
|||
{ |
|||
String line; |
|||
if(Pattern.matches("[a-zA-Z]+([0-9]*)(:)", line=sc.nextLine())) |
|||
{ |
|||
ParsedProgram.symtab.put(line.replaceAll(":",""), address); |
|||
if(line.replaceAll(":","").compareTo("main") == 0) |
|||
{ |
|||
ParsedProgram.setMainFunctionAddress(address); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
ParsedProgram.code.add(address-firstCodeAddress, getInstructionFromString(line, address)); |
|||
address++; |
|||
} |
|||
} |
|||
sc.close(); |
|||
} |
|||
|
|||
private static Instruction getInstructionFromString(String line, int address) |
|||
{ |
|||
Instruction newInstruction = new Instruction(); |
|||
newInstruction.setProgramCounter(address); |
|||
|
|||
Scanner sc = new Scanner(line); |
|||
newInstruction.setOperationType(OperationType.valueOf(sc.next())); |
|||
|
|||
switch(newInstruction.getOperationType()) |
|||
{ |
|||
//R3I type
|
|||
case add : |
|||
case sub : |
|||
case mul : |
|||
case div : |
|||
case and : |
|||
case or : |
|||
case xor : |
|||
case slt : |
|||
case sll : |
|||
case srl : |
|||
case sra : { |
|||
newInstruction.setSourceOperand1(getRegisterOperandFromString(sc.next())); |
|||
newInstruction.setSourceOperand2(getRegisterOperandFromString(sc.next())); |
|||
newInstruction.setDestinationOperand(getRegisterOperandFromString(sc.next())); |
|||
break; |
|||
} |
|||
|
|||
//R2I type
|
|||
case addi : |
|||
case subi : |
|||
case muli : |
|||
case divi : |
|||
case andi : |
|||
case ori : |
|||
case xori : |
|||
case slti : |
|||
case slli : |
|||
case srli : |
|||
case srai : |
|||
case load : |
|||
case store : { |
|||
newInstruction.setSourceOperand1(getRegisterOperandFromString(sc.next())); |
|||
String str = sc.next(); |
|||
if(Pattern.matches("-?\\d+(,)",str)) |
|||
{ |
|||
//absolute immediate
|
|||
newInstruction.setSourceOperand2(getImmediateOperandFromString(str)); |
|||
} |
|||
else |
|||
{ |
|||
//label / symbol
|
|||
newInstruction.setSourceOperand2(getLabelOperandFromString(str)); |
|||
} |
|||
newInstruction.setDestinationOperand(getRegisterOperandFromString(sc.next())); |
|||
break; |
|||
} |
|||
|
|||
case beq : |
|||
case bne : |
|||
case blt : |
|||
case bgt : { |
|||
newInstruction.setSourceOperand1(getRegisterOperandFromString(sc.next())); |
|||
newInstruction.setSourceOperand2(getRegisterOperandFromString(sc.next())); |
|||
String str = sc.next(); |
|||
if(Pattern.matches("[0-9]+(,)",str)) |
|||
{ |
|||
//absolute immediate
|
|||
newInstruction.setDestinationOperand(getImmediateOperandFromString(str)); |
|||
} |
|||
else |
|||
{ |
|||
//label / symbol
|
|||
newInstruction.setDestinationOperand(getLabelOperandFromString(str)); |
|||
} |
|||
break; |
|||
} |
|||
|
|||
//RI type :
|
|||
case jmp : { |
|||
String str = sc.next(); |
|||
if(Pattern.matches("[0-9]+(,)",str)) |
|||
{ |
|||
//absolute immediate
|
|||
newInstruction.setDestinationOperand(getImmediateOperandFromString(str)); |
|||
} |
|||
else if(Pattern.matches("%x([0-9]{1,2})",str)) { |
|||
newInstruction.setDestinationOperand(getRegisterOperandFromString(str)); |
|||
} |
|||
else |
|||
{ |
|||
//label / symbol
|
|||
newInstruction.setDestinationOperand(getLabelOperandFromString(str)); |
|||
} |
|||
break; |
|||
} |
|||
|
|||
case end : break; |
|||
|
|||
default: Misc.printErrorAndExit("unknown instruction!!"); |
|||
} |
|||
|
|||
sc.close(); |
|||
|
|||
return newInstruction; |
|||
} |
|||
|
|||
private static Operand getRegisterOperandFromString(String str) |
|||
{ |
|||
Operand operand = new Operand(); |
|||
operand.setOperandType(OperandType.Register); |
|||
operand.setValue(Integer.parseInt(str.replaceAll("[^0-9]", ""))); |
|||
return operand; |
|||
} |
|||
|
|||
private static Operand getImmediateOperandFromString(String str) |
|||
{ |
|||
Operand operand = new Operand(); |
|||
operand.setOperandType(OperandType.Immediate); |
|||
operand.setValue(Integer.parseInt(str.replaceAll("[^-?\\d+]",""))); |
|||
return operand; |
|||
} |
|||
|
|||
private static Operand getLabelOperandFromString(String str) |
|||
{ |
|||
Operand operand = new Operand(); |
|||
operand.setOperandType(OperandType.Label); |
|||
operand.setLabelValue(str.replaceAll("[$,]", "")); |
|||
return operand; |
|||
} |
|||
|
|||
static void printState() |
|||
{ |
|||
System.out.println("Symbol Table :"); |
|||
System.out.println(Arrays.asList(symtab)); |
|||
System.out.println("\nParsed instructions :"); |
|||
System.out.println(Arrays.asList(code)); |
|||
} |
|||
} |
@ -0,0 +1,28 @@ |
|||
package generic; |
|||
|
|||
import java.io.FileInputStream; |
|||
import generic.Operand.OperandType; |
|||
|
|||
|
|||
public class Simulator { |
|||
|
|||
static FileInputStream inputcodeStream = null; |
|||
|
|||
public static void setupSimulation(String assemblyProgramFile) |
|||
{ |
|||
int firstCodeAddress = ParsedProgram.parseDataSection(assemblyProgramFile); |
|||
ParsedProgram.parseCodeSection(assemblyProgramFile, firstCodeAddress); |
|||
ParsedProgram.printState(); |
|||
} |
|||
|
|||
public static void assemble(String objectProgramFile) |
|||
{ |
|||
//TODO your assembler code
|
|||
//1. open the objectProgramFile in binary mode
|
|||
//2. write the firstCodeAddress to the file
|
|||
//3. write the data to the file
|
|||
//4. assemble one instruction at a time, and write to the file
|
|||
//5. close the file
|
|||
} |
|||
|
|||
} |
@ -0,0 +1,13 @@ |
|||
package generic; |
|||
|
|||
public class Statistics { |
|||
|
|||
// TODO add your statistics here
|
|||
|
|||
// TODO write functions to update statistics
|
|||
|
|||
public static void printStatistics(String statFile) |
|||
{ |
|||
// TODO add code here to print statistics in the output file
|
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
package main; |
|||
import configuration.Configuration; |
|||
import generic.Misc; |
|||
import generic.Statistics; |
|||
import generic.Simulator; |
|||
|
|||
public class Main { |
|||
|
|||
public static void main(String[] args) { |
|||
if(args.length != 2) |
|||
{ |
|||
Misc.printErrorAndExit("usage: java -jar <path-to-jar-file> <path-to-assembly-program> <path-to-object-file>\n"); |
|||
} |
|||
|
|||
Simulator.setupSimulation(args[0]); |
|||
Simulator.assemble(args[1]); |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue