Компилятор Java - метод загрузки - PullRequest
0 голосов
/ 24 апреля 2010

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

}

Хорошо, вот часть компилятора, которая выполняет 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:

IN X
In Y
SUB X
STO Y
OUT Y
DC: X 0
DC: Y 0

И я написал компилятор, который теперь преобразовал этот файл в машинный код, поэтому я создал файл, например, с именем 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();
                    }
            }
}

Ответы [ 2 ]

0 голосов
/ 25 апреля 2010

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

dos.readInt();

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

0 голосов
/ 24 апреля 2010

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

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:
...
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...