Создание ассемблера

Похоже, я немного опоздал, но так как ваш принятый ответ - скорее комментарий, а не решение, я все равно опубликую это.

Вот простое отклонение кода, который вы предоставили, но достигает желаемого результата!

Я проведу вас через это:

public class MyTest {
    public static void main(String[] args) {

        //First of all, we need an instance of an Election-type object, so
        //that we can call its methods and get votes from users.
        Election e = new Election();
        //Now we can easily call the method getVotes(), as defined in Election class.
        //What happens here, is that the program will 'jump' to the getVotes() method
        //and it will execute every line of code in that method. Then it will
        //'return' to where it 'left off' in the main() method. Since getVotes()
        //is of type 'void', it will not return anything. It will just 'jump' back.
        e.getVotes();

        //Now, you can use testResult() method, to see the values of the variables.
        e.testResult();
    }
}

Теперь давайте посмотрим на класс Election и как это работает.

public class Election {
    private final int VOTES_NUM = 1;
    private int v1,v2,v3,v4,v5,d;

    public Election() {
        v1=v2=v3=v4=v5=d=0;
        //print now, just to show that all variables = 0
        testResult();
    }

    //Simple method that prints value of each variable. We use this for testing
    public void testResult(){
        System.out.println("v1 = "+v1);
        System.out.println("v2 = "+v2);
        System.out.println("v3 = "+v3);
        System.out.println("v4 = "+v4);
        System.out.println("v5 = "+v5);
        System.out.println("d = "+d);
    }

    private int getInput(){
       //First of all, we need a Scanner to take user input. 
       //You do that in your own code too. We simply move it in this method instead.
        Scanner input = new Scanner(System.in);

        //You also need variable to hold the user input. 
        //(Always give meaningful names to all entities)
        int userInput;

        System.out.print("Please enter vote number here: ");

        //the next part has to be in a try-catch block, 
        //to avoid exceptions like InputMismatchException, etc..
        try{
            //Get user input
            userInput = input.nextInt();
        }
        //If user enters letter, or symbol, or something else that isn't an integer,
        //then inform them of the mistake they made and recursively call this method,
        //until they get it right!
        catch (InputMismatchException ime){
            System.out.println("Please enter only a single number");
            return getInput();
        }

        //If all goes well, return the user input
        return userInput;
    }

    public void getVotes() {
        //'VOTES_NUM' is a constant that defines the times the 
        //loop will iterate (like Macros in 'C')
        for(int x=0; x<VOTES_NUM; x++)
            int n = getInput();
        //then let the switch statement increment one of the variables
        switch(userInput) {
            case 1: ++v1; break;
            case 2: ++v2; break;
            case 3: ++v3; break;
            case 4: ++v4; break;
            case 5: ++v5; break;
            default: ++d; break;
        }
    }
}
13
задан John 21 December 2008 в 19:59
поделиться

3 ответа

Я записал три или четыре простых ассемблера. Не используя парсер-генератор, что я сделал, была модель ассемблер S-C, который я знал лучше всего для 6 502.

Чтобы сделать это, я использовал простой синтаксис - строка была одним из следующего:

nothing
[label] [instruction] [comment]
[label] [directive] [comment]

Маркировка была одной буквой, сопровождаемой любым количеством букв или числами.

Инструкция была <пробел> <мнемосхема> [операнды]

Директива была <пробел>.XX [операнды]

Комментарий был * к концу строки.

Операнды зависели от инструкции и директивы.

Включенные.EQ директив приравниваются для определения констант

.OR устанавливают адрес источника кода

.HS преобразовывают строку в шестнадцатеричную систему байтов

Строка ASCII.AS байтов - любой разделитель кроме пробела - независимо от того, что запущено это закончило его

Конечный файл.TF для вывода

.BS n резервируют блочную систему хранения n байтов

Когда я записал это, я записал простые синтаксические анализаторы для каждого компонента. Каждый раз, когда я встретился с маркировкой, я поместил ее в таблицу с ее целевым адресом. Каждый раз, когда я встретился с маркировкой, я не знал, я отметил инструкцию как неполную и поместил неизвестную маркировку со ссылкой на инструкцию, для которой была нужна фиксация.

После того, как все исходные строки передали, я просмотрел, "для фиксации" таблицы и попробованный для нахождения записи в таблице символов, если я сделал, я исправил инструкции. В противном случае затем это была ошибка.

Я сохранил таблицу названий инструкции и всех допустимых способов адресации для операндов. Когда я получил инструкцию, я пытался проанализировать каждый способ адресации в свою очередь, пока что-то не работало.

Учитывая эту структуру, должен потребоваться день, возможно, два, чтобы сделать все это.

13
ответ дан 1 December 2019 в 22:58
поделиться

Посмотрите на этот Ассемблерный Комплект разработчика от автора Randy Hyde известного "Искусство Ассемблера":

Набор ассемблерного разработчика

4
ответ дан 1 December 2019 в 22:58
поделиться

Первичная обработка ассемблера с двумя передачами собирает код и помещает заполнителей для символов (поскольку Вы не знаете, насколько большой все - пока Вы не выполнили ассемблер). Вторая передача заполняет адреса. Если собранный код впоследствии должен быть связан с внешними ссылками, это - задание одноименного компоновщика.

2
ответ дан 1 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: