asurkis / risc-emulator

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Интерпретатор RISC-процессора для курса ИТМО «разработка компиляторов»

В одной строке записывается одна команда, псевдокоманда или метка. Комментарии начинаются с # и продолжаются до конца строки.

Описание машины

  • 216 (65536) ячеек памяти по 32 бита:
    • адрес первой ячейки — 0;
    • адрес последней ячейки — 65535;
  • одна команда записывается в одну ячейку;
  • счётчик команд — регистр, в который записывается адрес следующей команды, которая будет выполнена. На момент выполнения команды счётчик команд указывает на следующую команду;
  • флаг останова — если установлен, автоматическое выполнение программы остановится;
  • 32 адресуемых регистра x0–x31:
    • x0 всегда содержит 0;
    • x1–x31 — 32–битные регистры общего назначения;

Команды

Обозначения

  • rd — регистр назначения;
  • rs1 — первый регистр, из которого берется значение;
  • rs2 — второй регистр, из которого берется значение;
  • imm[n] — знаковая n-битная числовая константа;
  • pc — счётчик команд на момент после выборки команды, т.е. указывает на следующую команду после выполняемой;
  • := — присваивание;
  • [d] — ячейка памяти по адресу d;
  • << — битовый сдвиг влево, освободившиеся биты заполняются нулями;
  • >> — арифметический битовый сдвиг вправо, освободившиеся биты заполняются старшим битом исходного значения;
  • >>> — логический битовый сдвиг влево, освободившиеся биты заполняются нулями;
  • XOR — побитовое логическое исключающее ИЛИ;
  • OR — побитовое логическое ИЛИ;
  • AND — побитовое логическое И;
  • % — остаток от деления;

Команды виртуальной машины

Команда Пояснение
lui rd, imm[20] rd := imm << 12
addi rd, rs1, imm[12] rd := rs1 + imm
xori rd, rs1, imm[12] rd := rs1 XOR imm
add rd, rs1, rs2 rd := rs1 + rs2
sub rd, rs1, rs2 rd := rs1 - rs2
xor rd, rs1, rs2 rd := rs1 XOR rs2
srl rd, rs1, rs2 rd := rs1 >>> rs2
sra rd, rs1, rs2 rd := rs1 >> rs2
or rd, rs1, rs2 rd := rs1 OR rs2
and rd, rs1, rs2 rd := rs1 AND rs2
mul rd, rs1, rs2 rd := rs1 * rs2
div rd, rs1, rs2 rd := rs1 / rs2
rem rd, rs1, rs2 rd := rs1 % rs2
sll rd, rs1, rs2 rd := rs1 << rs2
slt rd, rs1, rs2 если rs1 < rs2, то rd := 1, иначе rd := 0
seq rd, rs1, rs2 если rs1 = rs2, то rd := 1, иначе rd := 0
sne rd, rs1, rs2 если rs1 ≠ rs2, то rd := 1, иначе rd := 0
sge rd, rs1, rs2 если rs1 ≥ rs2, то rd := 1, иначе rd := 0
lw rd, rs1, imm[12] rd := [rs1 + imm]
sw rs1, imm[12], rs2 [rs1 + imm] := rs2
jalr rd, rs1, imm[12] rd := pc; pc := rs1 + imm
jal rd, imm[20] rd := pc; pc := pc + imm
beq rs1, rs2, imm[12] если rs1 = rs2, то pc := pc + imm
bne rs1, rs2, imm[12] если rs1 ≠ rs2, то pc := pc + imm
blt rs1, rs2, imm[12] если rs1 < rs2, то pc := pc + imm
bge rs1, rs2, imm[12] если rs1 ≥ rs2, то pc := pc + imm
ebreak установить флаг останова
eread rd прочитать символ Unicode из поля ввода в rd
ewrite rs1 вывести символ Unicode из rs1 в поле вывода

Псевдокоманды

  • LABEL: — установить метку LABEL. Метка соответствует адресу следующей команды;
  • data imm[32] * t — t раз повторить imm;
  • li rd, imm[32] — rd := imm — последовательность из lui и addi, после которой в rd будет значение imm;
  • li rd, LABEL — rd := адрес метки LABEL. Всегда раскрывается строго в 2 команды;
  • jal rd, LABEL — такой jal, который соответствует метке LABEL;
  • beq/bne/blt/bge rs1, rs2, LABEL — условный переход на метку LABEL. Может не существовать, поскольку условный переход допускает смещение только до 12 бит. Для более длинных условных переходов можно использовать комбинацию из перехода по противоположному условию (beq — bne, blt — bge) на 1 (т.е. перепрыгнуть следующую команду) и прыжка jal на метку LABEL, например:
    # blt x1, x2, LABEL
    bge x1, x2, 1
    jal x0, LABEL
    # продолжение кода
    

About


Languages

Language:JavaScript 86.6%Language:HTML 6.6%Language:CSS 4.8%Language:Assembly 2.0%