Riscv-опкоды на GitHub отличаются от опкоды от RISC-V спецификации - PullRequest
0 голосов
/ 17 января 2019

Я все еще новичок в RISC-V и кодировании сборки. Я хочу иметь код операции / двоичное значение команд. Но меня смущает, что A. на разных страницах перечислены разные коды операций команд, а B. 10 команд имеют один и тот же код операции. Я подозреваю, что ответ B означает, что разные команды описывают одну и ту же механику, но я все еще не уверен, какие коды операций являются правильными.

Источник: https://github.com/riscv/riscv-opcodes/blob/20e4f0285c563e5a403bd6ba735beadbbd3c203e/opcodes add rd rs1 rs2 16 = 0 15..10 = 0 9..7 = 0 6..2 = 0x0C 1..0 = 3

Источник: https://content.riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf 0110011 ДОБАВИТЬ

Так почему же на странице github говорится, что код операции ADD равен 0C, то есть 12 в десятичном виде, а 0110011 - 51 в десятичном?

Привет.

1 Ответ

0 голосов
/ 27 января 2019

Первые 7 бит представляют код операции инструкции. И исходный код github, и pdf содержат один и тот же код операции для ADD. 0x0C = 0000_1100 бинарный. Но источник GitHub говорит 5 бит (6..2), поэтому 0x0C = 01100 двоичный. Первые 2 бита любого действительного кода операции всегда 11 двоичных. Соедините 01100 11 вместе, и вы получите 0110011 двоичный, 51 десятичный.

Визуально (с левосторонним сдвигом, затем ИЛИ):

01100 11 -> ADD Opcode
----- -- 
0x0C  3  -> 0x0C << 2 | 3 -> 12*4 + 3 = 51

Инструкции с одним и тем же кодом операции, например BEQ и BNE, оба с кодом операции 1100011 = BRANCH, будут иметь другое поле, которое дополнительно определяет функцию инструкции. Таким образом, код операции BRANCH 1100011 группирует все инструкции ветвления. Чтобы отличить BEQ (равная ветвь) от BNE (не равная ветвь), вам нужно взглянуть на поле funct3. BEQ имеет funct3 = 000, BNE имеет funct3 = 001. Поле funct3 однозначно идентифицирует функцию команды BRANCH (1100011): BEQ, BNE, BLT, BGE, BLTU, BGEU).

Некоторые инструкции, такие как LUI, однозначно идентифицируются кодом операции и поэтому не нуждаются в поле funct3. Другие инструкции, например, с кодом операции OP (0110011), нуждаются в поле funct3 вместе с полем funct7. Обратите внимание, что ADD и SUB имеют одинаковый код операции (OP = 0110011) и один и тот же funct3 (000), поэтому поле funct7 является дифференциатором. ADC funct7 равен 0000000, а SUB funct7 - 0100000.

В начале главы 19 RISC-V Spec показана таблица со всеми действительными OPCODES и их двоичным значением. Помните, что первые 2 бита каждого OPCODE равны 11, это исключено из таблицы. Например, посмотрите на таблицу find STORE, если мы хотим узнать код операции STORE, отсканируем влево до столбца inst [6: 5] и вы обнаружите 01. отсканируйте строку STORE до inst [4: 2] и найдите 000. Из этого мы можем построить код операции STORE 01 000 11 -> 0100011. Все инструкции STORE (SB, SH, SW) будут иметь код операции 0100011. Чтобы выяснить, является ли инструкция SB, SH или SW, посмотрите на поле funct3 000 = SB, 001 = SH, 010 = SW.

...