Набор непривилегированных инструкций RISC-V
Эта Лекция раскрывает основы непривилегированных целочисленных инструкций архитектуры RISC-V и содержит базовую информацию для написания программ на языке Assembler.
После освоения этой лекции вы должны быть способны:
- понимать, что архитектура RISC-V определяется через набор инструкций и его расширения;
- понимать принцип перевода команд на языке Assembler в машинный код;
- знать основные категории целочисленных инструкций.
Набор непривилегированных инструкций RISC-V
Основной набор целочисленных инструкций
Набор непривилегированных инструкций архитектуры RISC-V описывает четыре базовые набора инструкций:
- RV32I (32-х битные целочисленные)
- RV32E (32-х битные встроенные)
- RV64I (64-х битные целочисленные)
- RV128I (128-х битные целочисленные)
Числа 32, 64, и 128 характеризуют размер регистра и адресного пространства. Например, 32-х битный регистр может хранить данные размером до 2^32 бит. Набор инструкций RV32I содержит всего 40 инструкций.
Расширения и именования
Любой процессор RISC-V поддерживает как минимум один базовый набор инструкций. Например, обозначение RV32I означает, что процессор поддерживает 32-х битный целочисленный набор команд. Распространены дальнейшие расширения базового набора инструкций. Тип расширения, который поддерживает процессор, указывается в качестве суффикса к базовой аббревиатуре набора инструкций. Распространены следующие расширения (таблица 3.1):
Сокращение | Стандартное расширение |
---|---|
M | целочисленные умножение и деление integer multiplication and division |
A | атомарные инструкции atomic instructions |
F | числа с плавающей запятой одинарной точности single-precision floating point |
D | числа с плавающей запятой двойной точности double-precision floating point |
Q | числа с плавающей запятой четверной точности quad-precision floating point |
C | сжатые инструкции compressed instructions |
V | векторные операции vector operations |
Примеры:
- микропроцессор, построенный на архитектуре RV32IMAC, поддерживает базовый набор 32-х битных инструкций (RV32I), целочисленные умножение и деление (M), атомарные инструкции (A) и сжатые инструкции (C).
- микропроцессор, построенные на архитектуре RV64IMAFDC поддерживает базовый набор 64-х инструкций (RV64I), целочисленные умножение и деление(M), атомарные инструкции (A), числа с плавающей запятой одинарной (F) и двойной точности (D), а также сжатые инструкции (C).
- иногда можно встретить микропроцессоры, для которых полная информация зашита внутри процессора и может быть прочитана только после чтения специального регистра. В этом случае суффиксы будут оканчиваться на SU, например, RV64IMAFDCSU. Такое обозначение означает, что процессор поддерживает режим супервизора (S) и пользовательский режим (U).
Регистры RISC-V
Базовый набор инструкций определяет наличие 32 регистров и программного счётчика. Регистры именуются от x0 до x31. Размер регистра соответствует размеру базовых инструкций, например, для процессора RV32I размер каждого из регистров будет составлять 32 бита. Регистр x0 хранит значение 0, которое нельзя поменять.
Расширения предоставляют большее число регистров. Например, расширения, связанные с вычислениями с плавающей запятой, предоставляют дополнительные регистры работы с дробной арифметикой.
Использование регистров языками более высокого уровня, чем Assembler, определяется бинарным интерфейсом для приложений (application binary interface, ABI). Этот интерфейс определяет то, как регистры должны использоваться в процессе трансляции программы компилятором из описания на высокоуровневом языке в машинный код. ABI предписывает использование дополнительных имён регистров и их назначение ( Табл.3.2):
Регистр | Имя ABI | Описание |
---|---|---|
x0 | zero | Константный ноль Zero constant |
x1 | ra | Адрес возврата Return address |
x2 | sp | Указатель на область стека Stack pointer |
x3 | gp | Глобальный указатель Global pointer |
x4 | tp | Указатель потока Thread pointer |
x5-x7 | t0-t2 | Временные значения Temporaries |
x8 | s0 / fp | Сохраняемый регистр / Указатель на фрейм Saved / Frame pointer |
x9 | s1 | Сохраняемый регистр Saved register |
x10-x11 | a0-a1 | Аргументы функций и возвращаемые значения Function args. / return values |
x12-x17 | a2-a7 | Аргументы функций Function arguments |
x18-x27 | s2-s11 | Сохраняемые регистры Saved registers |
x28-x31 | t3-t6 | Временные значения Temporaries |
Pc | - | Программный счётчик Program counter |
Архитектура RISC-V предполагает выполнение арифметических операций через регистры: для модификации данных, находящихся в памяти, необходимо загрузить данные из памяти в один из регистров, выполнить операцию над данными, и переместить результат из регистра обратно в память.