Итак, для моего класса программирования у нас был проект по созданию виртуальной машины, включающей модуль памяти, процессор, ввод, вывод, регистр команд, счетчик программ, MAR, MDR и так далее. Теперь нам нужно создать компилятор, использующий код Java, который возьмет файл .exe, написанный в каком-то текстовом редакторе, преобразует его в код байта java и запустит код. Код, который мы будем писать в .exe-файле, - это машинный код следующего содержания:
IN X
IN Y
ADD X
STO Y
OUT Y
STOP
DC X 0
DC Y 0
Я только начинающий, и у меня есть только 2 дня, чтобы написать это, и я очень растерян и не знаю, с чего начать .... Любая помощь будет высоко оценена. Спасибо
Хорошо, никто не понимает, по-настоящему, я уточню ...... Я на первом курсе по программированию, и мой учитель велел нам создать виртуальную машину, которую я сделал, и я опубликую код для процессора и компьютера Классы, но мой учитель очень неорганизован, и у нас не хватило времени для последнего проекта, который является компилятором ..... Приведенный выше код является просто примером кода, который будет превращен в байт-код ... вот код для процессора и компьютера в моем пакете виртуальной машины ...
class Cpu{
private MemEl acc;
private InstReg ir;
private ProgCount pc;
private Input in;
private OutPut out;
private MemEl mdr;
private MemEl mar;
public Cpu()
{
pc = new ProgCount();
ir = new InstReg();
acc = new MemEl();
}
public Boolean stop()
{
return ir.getOpcode() == 0;
}
public int getMAR()
{
return ir.getOpcode();
}
public int getMDR()
{
return mdr.read();
}
public void setMDR(int n)
{
mdr.write(n);
}
public boolean OutFlag()
{
return ir.getOpcode() == 8;
}
public boolean InFlag()
{
return ir.getOpcode() == 7;
}
public boolean StoreFlag()
{
return ir.getOpcode() == 2;
}
public void fetch()
{
mar.write(pc.getValue());
pc.plus();
}
public void reset()
{
mar.write(0);
pc.write(0);
pc.write(1);
}
public void fetch2()
{
ir.write(mdr.read());
}
public void decode()
{
mar.write(ir.getOperand());
mdr.write(acc.read());
}
public void execute()
{
switch(ir.getOpcode()){
case 0:
System.out.println("Complete");
break;
case 1:
acc.write(mdr.read());
break;
case 2:
acc.write(ir.getOperand());
break;
case 3:
acc.write(acc.read() + mdr.read());
break;
case 4:
acc.write(acc.read() - mdr.read());
break;
case 5:
acc.write(acc.read() * mdr.read());
break;
case 6:
acc.write(acc.read() / mdr.read());
break;
case 7:
mar.write(ir.getOperand());
break;
case 8:
System.out.println(getMDR());
break;
case 9:
pc.write(getMDR());
break;
case 10:
if(0 == acc.read())
pc.write(getMDR());
else
fetch();
break;
case 11:
if(0 < acc.read())
pc.write(getMDR());
else
fetch();
break;
}
}
Вот мой компьютерный класс
import java.io.*;
class Computer{
private Cpu cpu;
private Input in;
private OutPut out;
private Memory mem;
public Computer() throws IOException
{
Memory mem = new Memory(100);
Input in = new Input();
OutPut out = new OutPut();
Cpu cpu = new Cpu();
System.out.println(in.getInt());
}
public void run() throws IOException
{
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 load()
{
mem.write(0,799);
mem.write(1,199);
mem.write(2,1009);
mem.write(3,398);
mem.write(4,298);
mem.write(5,199);
mem.write(6,497);
mem.write(7,299);
mem.write(8,902);
mem.write(9,898);
mem.write(97,0);
mem.write(98,0);
mem.write(99,1);
}
}
Метод Load - это временный метод, просто чтобы посмотреть, работает ли машина ... то, что он будет загружать, это байт-код, сформированный компилятором.