CS221. Архитектура компьютера и операционные системы

Кстати, неправильные ответы опять можно увидеть после первой попытки. Это баг или так задумано?)

Будем считать, что это была фича для тех, кто решился пройти тест первыми! :innocent:

По нехорошей тропиночке идете, товарищ! :slight_smile:

@Ulysses Артем Михайлович, будут ли 27 мая лабораторные занятия?

нет.

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

Вопрос такой: что нужно делать со стеком? И как инструкция, которая повторятся, должна использовать стек? Ведь на его вершине лежит “аргумент” инструкции rep…

Опубликованы домашние задания по последним лекции и лабораторной. Обратите на ряд важных изменений в порядке работы на последней неделе.

  1. Для всех групп последнее ДЗ по лабораторным публикуется только сейчас.

  2. Дедлайн по обоим ДЗ — пятница вечер. Это связано с тем, что в субботу днём я сдам ведомости в деканат.

  3. В ДЗ по лекции будет доступна информация о правильных ответах сразу же. Это сделано для того, чтобы вы имели возможность получить эту информацию до контрольной работы.

Наконец, напоминаю, что на этой неделе пройдёт последняя контрольная работа во всех группах. Подробная информация о времени и месте — тут. Лекция на этой неделе состоится — пожалуйста, приходите…


Меня спрашивали о доборах. Директор института сказал, что по курсам с зачётом добор проводится только начиная с теневой сессии (для тех, кто претендует на стипендию), а затем в начале июля. Так я и поступлю (так же я делал и раньше, до формального внедрения Положения о БРС).

Однако я рекомендую тем, кто точно не добирает баллы до 60, тщательно приготовиться ко второй контрольной работе — это облегчит процесс добора баллов в будущем.


Действительно, безусловная корректность работы этого механизма обеспечивается только для инструкций, которые не меняют значение на вершине стека. Таких инструкции в (базовом) IJVM четыре: GOTO, IINC, DUP, NOP. В третьей дополнительной задаче приведён пример использования REP вместе с DUP.

Хорошо, возьмём DUP для примера. DUP должна дублировать слово на вершине стека. Но ведь она продублирует либо аргумент REP, либо следующий за ним (в зависимости от реализации REP). Первый вариант - не совсем то, что мы хотели, ведь получится что-то вроде :

1) -> 3, 1, 2, 3, 4 (это стек, начиная с вершины)
2) -> 2, 3, 1, 2, 3, 4 (продублировали тройку, уменьшили значение аргумента)
3) -> 1, 2, 3, 1, 2, 3, 4 (продублировали двойку, уменьшили значение)
4) -> 0, 1, 2, 3, 1, 2, 3, 4 (продублировали единицу, закончили REP)

Второй вариант - уменьшать SP перед запуском DUP - тоже плох, ибо аргумент REP перезапишется.

Можно, конечно, учитывать, что у DUP такое поведение, но тогда REP будет некорректно работать для инструкций, не использующих стек.

Уверен, что я что-то понял неправильно, и очень прошу объяснить)

Действительно, вы правы. Я убрал эту задачу из списка.

А когда будут известны результаты контрольной лабораторной работы?

До конца недели.

А когда будут баллы в БРС?

Тогда же.

Артем Михайлович, скажите, повлияет ли отсутствие на последней контрольной на зачет, если без нее наберется 60 баллов?

Не повлияет.

Добрый вечер, Артём Михайлович. Можете прояснить последнюю задачу из ДЗ, а именно то, как задавать инструкцию с двумя операндами. Делаю так:

0x44 INCN 	byte byte

Реализую в предположении, что на момент запуска интрукции в MBR лежит первый операнд, после fetch - второй операнд, После второго fetch - опкод следующей инструкции. Но эмулятор IJVM показывает, что после первого fetch в MBR оказывается мусор, а не второй операнд. Саму инструкцию запускаю так:

INCN 3 5

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

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

Самое логичное было бы попробовать написать не byte byte, а как у единственной инструкции с двумя параметрами — вы даже дошли до неё. Я посмотрел исходники и понял, что если написать в точности как у IINCvarnum const, то может и заработать. В качестве презента привожу полный код функции parse парсера conf-файла.

private void parse()
  throws IOException {
  instruction_set = new Vector();
  lineno = 0;
  String s = readLine();
  while (s.length() > 0) {
    StringTokenizer st = new StringTokenizer(s);
    int opcode;
    String mnemonic = null;
    try {
      if (st.hasMoreTokens()) {
        String str = st.nextToken();
        opcode = decode(str).intValue();
        if (st.hasMoreTokens()) { 
          mnemonic = st.nextToken();
          int type = (opcode == 0xC4) ? Instruction.WIDE : Instruction.NOPARAM;   // rms wide-fix
          if (st.hasMoreTokens()) {
            String param = st.nextToken();
            if (param.equalsIgnoreCase("varnum")) {
              if (st.hasMoreTokens() && st.nextToken().equalsIgnoreCase("const"))
                type = Instruction.VARNUM_CONST;
              else type = Instruction.VARNUM;
            }
            else if (param.equalsIgnoreCase("index"))
              type = Instruction.INDEX;
            else if (param.equalsIgnoreCase("label"))
              type = Instruction.LABEL;
            else if (param.equalsIgnoreCase("byte"))
              type = Instruction.BYTE;
            else if (param.equalsIgnoreCase("const"))
              type = Instruction.CONST;
            else if (param.equalsIgnoreCase("offset"))
              type = Instruction.OFFSET;
            else cpane.appendErr("Parameter type " + param + " not supported");
          }
          instruction_set.addElement(new Instruction(opcode, mnemonic, type));
        }
      }
    }
    catch (NumberFormatException nfe) {
      cpane.appendErr(" " + filename + " " + lineno + ": invalid number format for opcode");
    }
    s = readLine();
  }
}

Впрочем, что-то я увлёкся: varnum же в тексте jas-файла должна быть именем переменной, так что ничего не получится. Снимем эту задачу, а в качестве проекта на лето я предлагаю расширение эмулятора для поддержки byte byte.

1 лайк

Как раз хотел об этом написать)

А Вы можете дать ссылку на исходники этого эмулятора?)