В одной строке записывается одна команда, псевдокоманда или метка. Комментарии начинаются с # и продолжаются до конца строки.
- 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 # продолжение кода