Codificação
As instruções são vetores binários de 32 bits, podendo ser classificadas de duas formas: segundo sua sintaxe, ou de acordo com sua função. No que se refere à sintaxe, as instruções podem ser do tipo R, I, S, B, U ou J, como demonstrado na Tabela Sintaxe.
Tipo | 31 | 30-25 | 24-21 | 20 | 19-15 | 14-12 | 11-8 | 7 | 6-0 |
R | funct7 | rs2 | rs1 | funct3 | rd | opcode | |||
I | imm[31:11] | imm[10:0] | rs1 | funct3 | rd | opcode | |||
S | imm[31:11] | imm[10:5] | rs2 | rs1 | funct3 | imm[4:0] | opcode | ||
B | imm[31:12] | imm[10:5] | rs2 | rs1 | funct3 | imm[4:1] | imm[11] | opcode | |
U | imm[31:12] | rd | opcode | ||||||
J | imm[31:20] | imm[10:1] | imm[11] | imm[19:12] | rd | opcode |
Sobre cada tipo de instrução:
- Instruções do tipo R são usadas para realizar operações entre registradores.
- Instruções do tipo I são utilizadas para realizar operações em registradores com uso de valores imediatos.
- Instruções do tipo S armazenam valores na memória.
- Instruções do tipo B realizam desvios no programa dependendo do resultado da comparação de valores em dois registradores.
- Instruções do tipo U são empregadas em operações que usam os 20 bits mais significativos da instrução como imediato, com os bits remanescentes sendo 0.
- Apenas a instrução
JAL
é do tipo J.
Sendo, para cada segmento da instrução:
opcode
: Codifica o tipo de instrução ou uma instrução específica;funct3
: Codifica a operacionalização da instrução;funct7
: Codifica uma variação da operacionalização;rs1
: Endereça registrador de recurso primário;rs2
: Endereça registrador de recurso secundário;rd
: Endereça registrador de destinação;imm
: Vetor do imediato.
Opcode
Opcodes são segmentos de 7 bits do vetor de instrução. Cada tipo de instrução possui um opcode ou uma instrução possui um opcode exclusivo. Para alguns tipos de instrução, são codificados com mais de um opcode, estando estes exemplificados na Tabela Opcode.
Nome | valor |
---|---|
OP | 0110011 |
OP-IMM | 0010011 |
STORE | 0100011 |
LOAD | 0000011 |
BRANCH | 1100011 |
Outros | XXXXX11 |
Imediato
Os imediatos são vetores binários de 32 bits. Cada tipo de instrução com imediato possui uma sintaxe de imediato demonstrada na Tabela Imediato.
Tipo | 31 | 30 - 20 | 19 - 12 | 11 | 10 - 5 | 4 - 1 | 0 |
---|---|---|---|---|---|---|---|
I | inst[31] | inst[30:20] | |||||
S | inst[31] | inst[30:25] | inst[11:7] | ||||
B | inst[31] | inst[7] | inst[30:25] | inst[11:8] | 0 | ||
U | inst[31:12] | 000000000000 | |||||
J | inst[31] | inst[19:12] | inst[20] | inst[30:21] | 0 |
Sendo, para cada segmento, inst
o vetor da instrução.
Por sua vez, a classificação das instruções segundo sua funcionalidade divide-as em grupos independentemente de sua estrutura. Esses grupos incluem:
- As instruções de construção, que criam valores em registradores;
- As instruções de deslocamento, que realizam operações de deslocamento de bits nos valores armazenados nos registradores;
- As instruções aritméticas, que efetuam operações matemáticas;
- As instruções lógicas, que são responsáveis por operações lógicas;
- As instruções de desvio, que alteram o fluxo de execução do programa com base em condições;
- As instruções de salto, que permitem saltos para outras partes do programa;
- As instruções de carregar, que carregam valores da memória para os registradores;
- As instruções de armazenar, que guardam valores dos registradores na memória.
Nas instruções que se seguem, RV32I Base significa que elas pertencem ao conjunto base de instruções para inteiros de 32 bits, e “M” Standard Extension significa que elas pertencem à extensão de Multiplicação: