Java в Mips с двумя массивами

Я совершенно новичок в MIPS, но я работаю над попыткой преобразовать свою Java-программу, которая принимает данные от пользователя в виде римских цифр и преобразует их в целые числа, а затем распечатывает их. Вот моя программа на Java:

private static int decodeSingle(char letter) {
    switch(letter) {
        case 'M': return 1000;
        case 'D': return 500;
        case 'C': return 100;
        case 'L': return 50;
        case 'X': return 10;
        case 'V': return 5;
        case 'I': return 1;
        default:  return 0;
    }
}
public static int decode(String roman) {
    int result = 0;
    String uRoman = roman.toUpperCase(); //case-insensitive
    for(int i = 0; i < uRoman.length() - 1; i++) {//loop over all but the last character
        //if this character has a lower value than the next character
        if (decodeSingle(uRoman.charAt(i)) < decodeSingle(uRoman.charAt(i + 1))) {
            //subtract it
            result -= decodeSingle(uRoman.charAt(i));
        } else {
            //add it
            result += decodeSingle(uRoman.charAt(i));
        }
    }
    //decode the last character, which is always added
    result += decodeSingle(uRoman.charAt(uRoman.length() - 1));
    return result;
}

public static void main(String[] args) {
    System.out.println(decode("MCMXC"));   //1990
    System.out.println(decode("MMVIII"));  //2008
    System.out.println(decode("MDCLXVI")); //1666
}

Я хотел бы настроить программу со следующими двумя массивами. Моя идея заключается в том, что я могу сравнить любой пользовательский ввод с all_numerals (т.е. пользовательский ввод V по сравнению с V, который затем даст ему свое значение в индексе. Когда у нас есть значение индекса, мы можем сравнить его со значением index в all_values Мне, очевидно, понадобится цикл для повторения пользовательского ввода.

# put this somewhere in the data section
all_numerals: .asciiz "IVXLCDMivxlcdm"
all_values:   .byte 1, 5, 10, 50, 100, 500, 1000, 1, 5, 10, 50, 100, 500, 1000

Мой вопрос: вам нужно вставлять значения для all_numerals и all_values в регистры или вы можете просто сравнить массивы как есть? Будучи совершенно новым для MIPS, является ли это наиболее эффективным и логичным способом?


person Cfs0004    schedule 27.10.2015    source источник
comment
Как тег MIPS входит в этот вопрос?   -  person rkosegi    schedule 27.10.2015
comment
Потому что я спрашиваю, как преобразовать код Java, который я написал (фон Java), в код сборки MIPS.   -  person Cfs0004    schedule 27.10.2015


Ответы (1)


Вы можете заменить switch вложенными if-проверками и избавиться от вызовов подфункций. Таким образом, вам не нужно сохранять соответствие между латинскими буквами и их аналогами в блоках данных. Они могут быть жестко запрограммированы как константы. Кроме того, такая оптимизация дает мне ускорение в два раза:

public static int decode(String roman) {
    int result = 0;
    String uRoman = roman; //case-insensitive
    int prevPart = -1;
    for(int i = 0; i < uRoman.length(); i++) {//loop over all but the last character
        int curPart = 0;
        int letter = (int)uRoman.charAt(i);
        if (letter >= 'a' && letter <= 'z')
            letter -= (int)'a' - (int)'A';  // toUpper emulation
        if (letter <= (int)'I') {
            if (letter == (int)'C') {
                curPart = 100;
            } else if (letter == (int)'D') {
                curPart = 500;
            } else if (letter == (int)'I') {
                curPart = 1;
            }
        } else if (letter <= (int)'M') {
            if (letter == (int)'L') {
                curPart = 50;
            } else if (letter == (int)'M') {
                curPart = 1000;
            }
        } else if (letter == (int)'V') {
            curPart = 5;
        } else if (letter == (int)'X') { 
            curPart = 10;
        }
        if (prevPart > 0) {
            //if this character has a lower value than the next character
            if (prevPart < curPart) {
                //subtract it
                result -= prevPart;
            } else {
                //add it
                result += prevPart;
            }
        }
        prevPart = curPart;
    }
    //decode the last character, which is always added
    result += prevPart;
    return result;
}
person rsutormin    schedule 27.10.2015
comment
Однако мне нужно преобразовать его в MIPS. Это мой главный вопрос. - person Cfs0004; 27.10.2015
comment
Верно, но моя точка зрения заключалась в том, что, поскольку остался только один вызов decodeSingle, вы можете легко включить переключатель в основную функцию decode. Я изменил свой код, включая замену переключателя вложенными проверками if. - person rsutormin; 27.10.2015
comment
Хорошо, спасибо за помощь. Будет долгая ночь, чтобы преобразовать это в MIPS. Я не знаком с коммутатором, но освежу его. - person Cfs0004; 28.10.2015
comment
@ChristopherSchubert, кстати, мою версию очень легко переписать на С++, и тогда вы можете использовать этот подход: stackoverflow.com/questions/12982857/cc-to-mips-assembly - person rsutormin; 28.10.2015
comment
к сожалению, я не знаю С++, и мой проект должен быть готов завтра, поэтому я попытаюсь преобразовать код, который вы мне дали, в MIPS с помощью переключателя. Любые хорошие ресурсы, чтобы указать мне в правильном направлении? ... будет долгая ночь - person Cfs0004; 28.10.2015
comment
@ChristopherSchubert, вы уверены, что моя эмуляция переключателя вам не подходит? Я попытался сделать это в виде дерева решений (как это делает настоящий коммутатор). Проверил, нет ли подтормаживаний из-за этой эмуляции. Это определенно быстрее, чем простой линейный if...else if...else if.... Вот несколько упоминаний о преобразовании java в mips: stackoverflow.com /questions/29560169/convert-java-code-to-mips , stackoverflow.com/questions/19816488/convert-from-java-to-mips - person rsutormin; 28.10.2015
comment
Нет, это выглядит великолепно, я просто должен преобразовать его в MIPS. Единственный опыт, который у меня есть, это Java, поэтому я просто просил несколько советов/рекомендаций по конвертации. Просто возникли проблемы с пониманием MIPS, поскольку это не так просто, как Java. Я неправильно понял то, что вы написали. Спасибо за помощь. Когда я начну, могут возникнуть еще вопросы. - person Cfs0004; 28.10.2015
comment
см. выше. Извините забыл тег @rsutormin - person Cfs0004; 28.10.2015
comment
@ChristopherSchubert, хорошо. Я добавил эмуляцию для toUpperCase() (см. изменения в коде). - person rsutormin; 28.10.2015
comment
Давайте продолжим обсуждение в чате. - person Cfs0004; 28.10.2015