Итак, я работал над проектом java, целью которого является создание виртуального компьютера. Поэтому я в основном сделан, но с одной проблемой. Я создал компилятор, который переводит txt-документ с кодом сборки в нем, и мой компилятор создал новый файл с этим кодом, написанным как исполняемые ints машины. Но теперь мне нужно написать метод загрузки, который читает эти ints и запускает программу, но мне трудно это сделать. Любая помощь очень ценится .... и это не домашнее задание, если вы думаете об этом. Проект состоял просто в том, чтобы сделать компилятор, и теперь я пытаюсь завершить его для своих собственных интересов. Благодарю.Компилятор Java - метод загрузки
Вот то, что я до сих пор для нагрузки:
public void load(String newfile) throws FileNotFoundException
{
try{
File file = new File(newfile);
FileInputStream fs = new FileInputStream(file);
DataInputStream dos = new DataInputStream(fs);
dos.readInt();
dos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
Ok здесь часть компилятора, которая делает writeInts:
public void SecondPass(SymbolList symbolTable, String filename){
try {
int dc = 99;
//Open file for reading
File file = new File(filename);
Scanner scan = new Scanner(file);
//Make filename of new executable file
String newfile = makeFilename(filename);
//Open Output Stream for writing new file.
FileOutputStream fs = new FileOutputStream(newfile);
DataOutputStream dos = new DataOutputStream(fs);
//Read First line. Split line by Spaces into linearray.
String line = scan.nextLine();
String[] linearray = line.split(" ");
while(line!=null){
if(!linearray[0].equals("REM")){
int inst = 0, opcode, loc;
if(isInstruction(linearray[0])){
opcode = getOpcode(linearray[0]);
loc = symbolTable.searchName(linearray[1]).getMemloc();
inst = (opcode*100)+loc;
} else if(!isInstruction(linearray[0])){
if(isInstruction(linearray[1])){
opcode = getOpcode(linearray[1]);
if(linearray[1].equals("STOP"))
inst=0000;
else {
loc = symbolTable.searchName(linearray[2]).getMemloc();
inst = (opcode*100)+loc;
}
}
if(linearray[1].equals("DC"))
dc--;
}
dos.writeInt(inst);
System.out.println(" inst is being written as:" + inst);
}
try{
line = scan.nextLine();
}
catch(NoSuchElementException e){
line = null;
break;
}
linearray = line.split(" ");
}
scan.close();
for(int i=lc; i<=dc; i++){
dos.writeInt(0);
}
for(int i = dc+1; i < 100; i++)
{
dos.writeInt(symbolTable.searchLocation(i).getValue());
}
dos.close();
fs.close();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Так что я сделал это написать файл в txt like:
IN X
In Y
SUB X
STO Y
OUT Y
DC: X 0
DC: Y 0
И я написал компилятор, который теперь преобразовал этот файл в машинный код, поэтому у меня есть creat например файл под названием program.txt.ex, и он содержит кучу @@@@@@@ или машинного кода, и я сделал это, используя код SecondPass выше, и теперь мне нужно написать метод загрузки, который позволит мне загрузить и запустить этот файл.
Вот мой метод Run
public void run(String filename) throws IOException
{
if (mem == null)
System.out.println("mem null");
if (filename == null)
System.out.println("filename null");
mem.loadFromFile(filename);
cpu.reset();
cpu.setMDR(mem.read(cpu.getMAR()));
cpu.fetch2();
while (!cpu.stop())
{
cpu.decode();
if (cpu.OutFlag())
OutPut.display(mem.read(cpu.getMAR()));
if (cpu.InFlag())
mem.write(cpu.getMDR(),in.getInt());
if (cpu.StoreFlag())
{
mem.write(cpu.getMAR(),in.getInt());
cpu.getMDR();
}
else
{
cpu.setMDR(mem.read(cpu.getMAR()));
cpu.execute();
cpu.fetch();
cpu.setMDR(mem.read(cpu.getMAR()));
cpu.fetch2();
}
}
}
Выполнить метод:
public void run(int mem)
{
cpu.reset();
cpu.setMDR(mem.read(cpu.getMAR()));
cpu.fetch2();
while (!cpu.stop())
{
cpu.decode();
if (cpu.OutFlag())
OutPut.display(mem.read(cpu.getMAR()));
if (cpu.InFlag())
mem.write(cpu.getMDR(),in.getInt());
if (cpu.StoreFlag())
{
mem.write(cpu.getMAR(),in.getInt());
cpu.getMDR();
}
else
{
cpu.setMDR(mem.read(cpu.getMAR()));
cpu.execute();
cpu.fetch();
cpu.setMDR(mem.read(cpu.getMAR()));
cpu.fetch2();
}
}
}
Это тот машинный исполняемый код, зачем его загружать? Почему бы вам просто не запустить его с машины? Я не получаю это – OscarRyz
Это настоящие машинные инструкции, или источник nasm, или инструкции для какого-либо виртуального компьютера вашего собственного творения? Как вы его написали с помощью DataOutputStream или что-то еще? – bmargulies
Почему вы не получили ответы? – WhirlWind