Как получить машинный код от симулятора Mars - PullRequest
3 голосов
/ 31 марта 2020

Я написал программу сборки MIPS с симулятором Mars и хочу сохранить каждый адрес инструкции и машинный код в файле. Я знаю, что симулятор Mars выполняет эту работу в разделе «Выполнение». Как я могу получить копию этих в файле? И если это невозможно, есть ли сайты, которые делают то же самое и предоставляют машинный код?

Я имею в виду, я хочу получить копию следующей части:

enter image description here

1 Ответ

1 голос
/ 31 марта 2020

MARS - это Java JAR, вы можете легко использовать его как библиотеку или перепроектировать его (хотя источники доступны ).
Фактически, если вы это сделаете, вы легко обнаружите что он имеет интерфейс командной строки:

java -jar Mars4_5.jar h

Хотя есть переключатель a для «Только сборка», который не генерирует выходной файл - это только этап проверки.

Но, как указано выше, к счастью, это Java, поэтому мы можем просто повторно использовать все классы MARS:

import mars.*;
import java.util.*;

public class MarsCompiler
{
  public static void main(String... args) throws Exception
  {
      if (args.length != 1)
      {
          System.err.println("Usage: java MarsCompiler input");
          System.exit(1);
      }


      Globals.initialize(false);

      MIPSprogram program = new MIPSprogram();
      program.readSource(args[0]);

      ErrorList errors = null;

      try
      {
        program.tokenize();
        errors = program.assemble(new ArrayList(Arrays.asList(program)), true, true);
      }
      catch (ProcessingException e)
      {
        errors = e.errors();
      }

      if (errors.errorsOccurred() || errors.warningsOccurred())
      {
          for (ErrorMessage em : (ArrayList<ErrorMessage>)errors.getErrorMessages())
          {
              System.err.println(String.format("[%s] %s@%d:%d %s",
                em.isWarning() ? "WRN" : "ERR",
                em.getFilename(), em.getLine(), em.getPosition(),
                em.getMessage()));
          }
          System.exit(2);
      }

      for (ProgramStatement ps : (ArrayList<ProgramStatement>)program.getMachineList())
        System.out.println(String.format("%08x %08x", ps.getAddress(), ps.getBinaryStatement()));

  }

}

Для компиляции этой программы вам нужен Java 8+ JDK и, конечно же, передайте JAR-код MARS в classpath (MARS, конечно, не готов к модулю):

javac -jar MARS4_5.jar MarsCompiler.java

Конечно, это всего лишь базовый c пример, до чтобы вы сформировали его в инструменте, отвечающем вашей цели (обратите внимание, я не оказываю поддержку).
В частности, остерегайтесь многофайловых проектов. Я явно ограничил эту программу только одним файлом.


Пример

Чтобы увидеть машинный код этого файла (назовите его testm.s):

.text
li $v0, 11
la $a0, 'a'
syscall
li $v0, 10
syscall

используйте

java -cp MARS4_5.jar MarsCompiler testm.s

, чтобы получить это в выводе:

00400000 2402000b
00400004 24040061
00400008 0000000c
0040000c 2402000a
00400010 0000000c
...