O conjunto de instruções
Rodolfo Azevedo
MC404 - Organização Básica de Computadores e Linguagem de Montagem
http://www.ic.unicamp.br/~rodolfo/mc404
Revisitando as instruções do processador
- Vocês já viram essas instruções/variações em sala ou no laboratório
- A meta dos slides abaixo é servir de referência geral mas você também pode utilizar o Reference Card disponível na página da disciplina que contém todas as instruções
Instruções de Load
Instrução |
Formato |
Descrição |
LB rd, rs1, imm |
I |
Load Byte |
LH rd, rs1, imm |
I |
Load Halfword |
LW rd, rs1, imm |
I |
Load Word |
LBU rd, rs1, imm |
I |
Load Byte Unsigned |
LHU rd, rs1, imm |
I |
Load Halfword Unsigned |
Instruções de Store
Instrução |
Formato |
Descrição |
SB rs2, rs1, imm |
S |
Store Byte |
SH rs2, rs1, imm |
S |
Store Halfword |
SW rs2, rs1, imm |
S |
Store Word |
Instruções Aritméticas
Instrução |
Formato |
Descrição |
ADD rd, rs1, rs2 |
R |
Add |
ADDI rd, rs1, imm |
I |
Add Immediate |
SUB rd, rs1, rs2 |
R |
Subtract |
LUI rd, imm |
U |
Load Upper Immediate |
AUIPC rd, imm |
U |
Add Upper Immediate to PC |
Instruções Lógicas
Instrução |
Formato |
Descrição |
XOR rd, rs1, rs2 |
R |
Exclusive OR |
XORI rd, rs1, imm |
I |
Exclusive OR Immediate |
OR rd, rs1, rs2 |
R |
OR |
ORI rd, rs1, imm |
I |
OR Immediate |
AND rd, rs1, rs2 |
R |
AND |
ANDI rd, rs1, imm |
I |
AND Immediate |
Instruções de Deslocamento
Instrução |
Formato |
Descrição |
SLL rd, rs1, rs2 |
R |
Shift Left Logical |
SLLI rd, rs1, imm |
I |
Shift Left Logical Immediate |
SRL rd, rs1, rs2 |
R |
Shift Right Logical |
SRLI rd, rs1, imm |
I |
Shift Right Logical Immediate |
SRA rd, rs1, rs2 |
R |
Shift Right Arithmetic |
SRAI rd, rs1, imm |
I |
Shift Right Arithmetic Immediate |
Instruções de Comparação
Instrução |
Formato |
Descrição |
SLT rd, rs1, rs2 |
R |
Set Less Than |
SLTI rd, rs1, imm |
I |
Set Less Than Immediate |
SLTU rd, rs1, rs2 |
R |
Set Less Than Unsigned |
SLTIU rd, rs1, imm |
I |
Set Less Than Immediate Unsigned |
Instruções de Salto Condicionais
Instrução |
Formato |
Descrição |
BEQ rs1, rs2, imm |
SB |
Branch if Equal |
BNE rs1, rs2, imm |
SB |
Branch if Not Equal |
BLT rs1, rs2, imm |
SB |
Branch if Less Than |
BGE rs1, rs2, imm |
SB |
Branch if Greater Than or Equal |
BLTU rs1, rs2, imm |
SB |
Branch if Less Than Unsigned |
BGEU rs1, rs2, imm |
SB |
Branch if Greater Than or Equal Unsigned |
Instruções de Salto Incondicional
Instrução |
Formato |
Descrição |
JAL rd, imm |
UJ |
Jump and Link |
JALR rd, rs1, imm |
I |
Jump and Link Register |
Instruções de Sistema
Instrução |
Formato |
Descrição |
ECALL |
I |
Environment Call |
EBREAK |
I |
Environment Break |
Multiplicação e Divisão (não funciona nesse simulador)
Instrução |
Formato |
Descrição |
MUL rd, rs1, rs2 |
R |
Multiply |
DIV rd, rs1, rs2 |
R |
Divide |
DIVU rd, rs1, rs2 |
R |
Divide Unsigned |
REM rd, rs1, rs2 |
R |
Remainder |
REMU rd, rs1, rs2 |
R |
Remainder Unsigned |
Mais exercícios
Implemente as funções abaixo utilizando as convenções do RISC-V para chamada de funções:
| int strlen(const char *str);
char *strcpy(char *destination, const char *source);
int strcmp(const char *str1, const char *str2);
char *strcat(char *destination, const char *source);
|
É sempre importante lembrar que as convenções precisam ser seguidas!
int strlen(const char *str)
int strlen(const char *str)
| strlen:
addi sp, sp, -4
sw s0, sp, 0
addi s0, zero, 0
strlen_loop:
lbu t0, a0, 0
beq t0, zero, strlen_end
addi s0, s0, 1
addi a0, a0, 1
j strlen_loop
strlen_end:
mv a0, s0
lw s0, s0, 0
addi sp, sp, 4
ret
|
int strlen(const char *str) - implementação alternativa
| strlen:
addi t0, zero, 0
strlen_loop:
lbu t0, a0, 0
beq t1, zero, strlen_end
addi t0, t0, 1
addi a0, a0, 1
j strlen_loop
strlen_end:
mv a0, t0
ret
|
char strcpy(char destination, const char *source)
char strcpy(char destination, const char *source)
| strcpy:
lbu t0, a1, 0
beq t0, zero, strcpy_end
sbu t0, a0, 0
addi a0, a0, 1
addi a1, a1, 1
j strcpy
strcpy_end:
ret
|
int strcmp(const char str1, const char str2)
int strcmp(const char str1, const char str2)
| strcmp:
lbu t0, a0, 0
lbu t1, a1, 0
bne t0, t1, strcmp_cmp
beq t0, zero, strcmp_neg
beq t1, zero, strcmp_pos
addi a0, a0, 1
addi a1, a1, 1
j strcmp
strcmp_cmp:
sub a0, t0, t1
j strcmp_end
strcmp_neg:
addi a0, zero, -1
j strcmp_end
strcmp_pos:
addi a0, zero, 1
strcmp_end:
ret
|
char strcat(char destination, const char *source)
char strcat(char destination, const char *source)
| strcat:
addi t0, a0, 0
strcat_loop:
lbu t1, a0, 0
beq t1, zero, strcat_copy
addi a0, a0, 1
j strcat_loop
strcat_copy:
lbu 1, a1, 0
sbu t2, a0, 0
beq t1, zero, strcat_end
addi a0, a0, 1
addi a1, a1, 1
j strcat_copy
strcat_end:
addi a0, t0, 0
ret
|