2010-04-24 4 views
0

Итак, я работал над проектом 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(); 
        } 
      } 
} 
+0

Это тот машинный исполняемый код, зачем его загружать? Почему бы вам просто не запустить его с машины? Я не получаю это – OscarRyz

+0

Это настоящие машинные инструкции, или источник nasm, или инструкции для какого-либо виртуального компьютера вашего собственного творения? Как вы его написали с помощью DataOutputStream или что-то еще? – bmargulies

+2

Почему вы не получили ответы? – WhirlWind

ответ

0

Если кажется, что вам нужно загрузить весь файл в память перед началом выполнения, так что бы:

public int[] load(String newfile) throws FileNotFoundException 
{ 
    int mem[] = new int[100]; 
    try { 
     File file = new File(newfile); 
     FileInputStream fs = new FileInputStream(file); 
     DataInputStream dis = new DataInputStream(fs); 
     for (int i = 0; i < mem.length; ++i) { 
      mem[i] = dis.readInt(); 
     } 
     dos.readInt(); 
     dos.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return mem; 
} 

void run(int mem[]) { 
    // now execute code 
    int pc = 0; 
    loop: while (true) { 
     int inst = mem[pc++]; 
     int opcode = inst/100; 
     int loc = inst%100; 
     switch (opcode) { 
      case OpCode.STOP: 
       break loop; 
      case OpCode.IN: 
... 
     } 
    } 
} 
+0

Ok Maurice, ну, я написал метод запуска, который я опубликую, но так, где в вашем коде вы говорите «теперь выполняйте код», это то, где я буду запускать код. Или в моей главной программе я могу выполнить computer.load ("filename"), а затем computer.run ("filename") и не записать исполняемую часть? – 2010-04-24 20:26:39

+0

лучше дать load() вернуть загруженный код (см. Обновленный пост) –

+0

ok Maurice, так что это мой метод Run, но я не думаю, что это правильно. Сообщение выше. – 2010-04-25 19:05:00

0

Я заметил, что ваш погрузчик делает один

dos.readInt(); 

... который будет читать одно целое значение из вашего файла. То, что вы, вероятно, хотите сделать, это создать цикл, который читает int s, пока вы не нажмете конец файла на dos (что может быть более точно названо dis, no?). Вы могли бы add те int s к динамическому контейнеру, как ArrayList, который будет расти вместе с каждым элементом, который вы вкладываете в него. После загрузки вы можете использовать toArray, чтобы скопировать все эти int s в массив соответствующего размера.