Похожие презентации:
Временная линия RISC -V
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Помимо базовой целочисленной ISA, существуют различные расширения:•M — умножение и деление целых чисел;
•A — атомарные операции;
•F — число с плавающей запятой одинарной точности;
•D — число с плавающей запятой двойной точности;
•Q — число с плавающей запятой четверной точности;
•L — десятичная плавающая точка;
•C — сжатые 16-битные инструкции;
•V — векторные инструкции;
•B — инструкции для манипуляций с битами;
•J — динамически транслируемые языки (например Java). ISA будет поддерживать динамические
проверки и сборщик мусора;
•T — транзакционная память;
•P — упакованные SIMD инструкции;
•N — прерывания уровня пользователя.
На данный момент завершены следующие ISA: RV32/64I, M, A, F, D, Q, C. Набор расширений IMAFD
для краткости обозначают одной буквой G (General).
12.
Jupiterhttps://github.com/andrescv/Jupiter
13.
14.
15.
16.
https://www.cs.cornell.edu/courses/cs3410/201
9sp/riscv/interpreter/
17.
18.
19.
Временные регистры t0 — t6 предназначены для хранения промежуточныхрезультатов вычислений и не обязаны сохраняться при вызове функций. Это
сделано для того чтобы простые функции не заморачивались сохранением
всех регистров на стеке, а потом еще и восстановлением.
Рабочие регистры s0 — s11 напротив сохраняются при вызове функций. Они
нужны для обратной задачи — воспользоваться ранее вычисленным
значением и как-то объединить его с результатом функции и при этом опять
же обойтись без лишнего использования стека.
Регистры обмена a0 — a7 используются для передачи параметров в
функцию и обратно. Очевидно, функция их должна менять, так что после
вызова функции их значения не сохраняются. Интересно, что для
возвращаемого значения используются только a0 и a1, а портить функции
разрешено все.
20.
21.
Инструкции RISC-VADDI x2, x0, 1
loop:
SUB x1, x1, x2
SW x1, 4(x0)
BLT x0, x1, loop
ADDI - это опкод, а x2, x0 и 1 - операнды. Или, если выражаться точнее, ADDI - мнемоника, буквенное
сокращение, заменяющее реальный числовой опкод, используемый в машинном коде. По практическим
причинам, будем использовать эти термины, как взаимозаменяемые.
rd = f(rs1, rs2)
Опкод определяет функцию f, которая принимает два входных регистра rs1 и rs2 и производит результат,
сохраняемый в регистре-приёмнике rd.
22.
ПсевдоинструкцииNEG x2, x4
Она берёт содержимое x4 , и помещает отрицательное значение в x2. На самом деле записывается исходное
значение в дополнительном коде. Давайте посмотрим, какую инструкцию представляет NEG :
SUB x2, zero, x4 # x2 ← zero - x4
23.
Загрузка и сохранение данных•LB - Load Byte.
•LW - Load Word.
•SB - Store Byte.
•SW - Store Word
В RISC-V слово (word) означает 32 бита, а байт, очевидно, означает 8 бит. Такие инструкции принимают три
операнда, в которых третий операнд является константным значением. Оно закодировано непосредственно в
инструкции, а не хранится в памяти и в регистре.
LW x2, 2(x0) # x2 ← [2], load contents at address 2
LW x3, 4(x2) # x3 ← [4 + x2], load content of addr 4 + x2
SW x1, 8(x0) # x1 → [8], store x1 at addr 8
24.
Адреса, переходы и меткиДля программы RISC-V мы знаем, что все инструкции занимают 32 бита. Это 4 байта. Таким образом, первая
инструкция будет по адресу 0, вторая по адресу 4, третья по адресу 8, и т.д.
Давайте напишем первую программу, с адресами в первой колонке, чтобы показать, как работают
переходы. Вначале поясним, как работают переходы.
Микропроцессор знает, какую инструкцию выполнить следующей, так как он имеет специальный регистр
счётчика команд Program Counter (PC). Он содержит адрес следующей инструкции для выполнения. Так как
каждая инструкция имеет длину 4 байта, регистр РС инкрементируется на 4 каждый раз.
BEQ x2, x4, 12
Инструкция BEQ выполняет переход (branch), если регистры равны (EQual). Если x2 = x4 , счётчик
команд (PC) будет увеличен на 12
Это означает сдвиг вперёд на три инструкции. Это означает, что мы пропускаем следующие две инструкции.
Давайте посмотрим на программу обратного отсчёта. Первая колонка содержит адрес инструкции:
00: ADDI x2, zero, 1 # x2 ← 0 + 1
04: SUB x1, x1, x2 # x1 ← x1 - 1
08: SW x1, 4(zero) # x1 → [4 + 0]
12: BLT zero, x1, -8 # 0 < x1 => PC ← PC - 8 = 4
16: HLT # Halt, stop execution
Мы не пишем BLT zero, x1, 4. Вместо этого мы пишем -8. Это происходит потому, что переходы относительны.
Мы переходим на две инструкции назад.
25.
Условный переходДля условного перехода мы составляем мнемонику из B и двух- или трёхбуквенных комбинаций,
описывающих условия, такие как:
•EQ = EQual.
•NE ≠ Not Equal.
•LT < Less Than.
•GE ≥ Greater or Equal.
BEQ x2, x4, offset # x2 = x4 => PC ← PC + offset
BNE x2, x4, offset # x2 ≠ x4 => PC ← PC + offset
BLT x2, x4, offset # x2 < x4 => PC ← PC + offset
BGE x2, x4, offset # x2 ≥ x4 => PC ← PC + offset
26.
Безусловные переходыПереход и связывание (Jump and Link — JAL)
Инструкция JAL может быть использована как для вызова функций, так и для простого безусловного перехода.
JAL выполняет относительный переход (относительный к PC), так же как и условный переход. Однако регистр в
аргументах используется не для сравнения, а для сохранения адреса возврата. Если вы не хотите сохранять адрес
возврата, вы можете просто передать регистр zero (x0).
27.
28.
.macro push valaddi sp, sp, -4
sw \val, 0(sp)
.endm
.macro pop val
lw \val, 0(sp)
addi sp, sp, 4
.endm
29.
Использованные источники и полезные ссылкиhttps://0x1.tv/Архитектура_RISC-V_(Никита_Ермаков,_OSSDEVCONF-2019)
https://github.com/andrescv/Jupiter
The RISC-V Instruction Set Manual Volume I: User-Level ISA, https://riscv.org/specifications/
The RISC-V Instruction Set Manual Volume II: Privileged Architecture, https://riscv.org/specifications/privileged-isa/
https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf
https://habr.com/ru/post/533272/
https://erik-engheim.medium.com/risc-v-assembly-code-examples-7bca0e7ebaa3
Программное обеспечение