Kokonoe é uma maquina virtual, inspirada em arquitetura MIPS. A ideia é criar um processador e um set de instruções baseadas no conjunto MIPS.
Os scripts executaveis possuem a extenção .kn, eles não possuem identação obrigatoria, porem cada comando precisa ser escrito em 1 linha e 1 linha apenas. Os comentarios são possiveis, tudo que estiver depois de um ; sera considerado um comentario.
Existem 2 modos de uso, é possivel tanto abrir Kokonoe no modo interativo, onde você tera um prompt simples para executar comandos, e como modo interpretador, onde você pode passar um script .kn para ser executado.
Kokonoe suporta alguns comandos comuns de shell, dentre eles;
- ls : lista os scripts existentes na pasta interna script
- cat : lista o conteudo de um script especifico
- run : permite executar scripts mesmo estando no modo interativo
- vi : abre o vi para que você possa editar os scripts
cada registrador é implementado como um inteiro de 64 bits
Registrador | Nome | Editavel | Descrição |
---|---|---|---|
#r0 | $ZERO | NÂO | ZERO |
#r1 .. r4 | $a1 .. $a4 | SIM | Argumentos para procedimentos |
#r5 e r6 | $v1 e $v2 | SIM | Retornos de procedimentos |
#r7 .. r17 | $t1 .. $t10 | SIM | Valores temporarios |
#r18 .. r30 | SIM | em trabalho, podem ser utilizados por hora | |
#r30 | $ra | NÂO | Reservado para armazenar o ponto de retorno |
#r31 | $sv | SIM | Reservado para setar chamada de syscall |
PS: Todos os registradores são editaveis (exceto o ZERO que é hardcoded), mas não é recomendado utilizar os marcados como não editaveis
Valor ZERO constante, qualquer valor adicionado a ele sera ignorando, e sempre que for chamado sera recebido 0. Pode ser utilizado quando o resultado de uma operação não é necessario, porem ela necessita um lugar para salvar o resultado, jogando o resultado para ZERO a operação sera possivel
Registradores reservados para serem utilizados para armazenar os argumentos de um procedimento. Esses registradores não são zerados automaticamente.
Registradores reservados para serem utilizados para armazenar os retornos de um procedimento. Esses registradores não são zerados automaticamente.
Registradores reservados para uso temporario, as variaveis do seu programa.
Registrador que armazena o ponto de pulo ao utilizar jal, utilizado pelo jr para saber para qual ponto retornar apos o fim de um procedimento
Registrador reservado para uso interno
Instrução | argumento 1 | argumento 2 | argumento 3 |
---|---|---|---|
add | registrador | registrador | registrador |
addi | registrador | registrador | valor |
sub | registrador | registrador | registrador |
subi | registrador | registrador | valor |
move | registrador | registrador | |
li | registrador | valor | |
beq | registrador | registrador | ponto de jump |
bne | registrador | registrador | ponto de jump |
slt | registrador | registrador | registrador |
slti | registrador | registrador | valor de comp |
jump | ponto de jump | ||
jal | ponto de jump | ||
jr | |||
ssc | valor | ||
syscall |
add #reg1 #reg2 #reg3
- Aloca em reg1 a soma dos valores de reg2 e reg3addi #reg1 #reg2 valor
- Aloca em reg1 a soma do valore em reg 2 e o valor passadosub #reg1 #reg2 #reg3
- Aloca em reg1 a subtração entre os valores de reg2 e reg3subi #reg1 #reg2 valor
- Aloca em reg1 a subtração do valore em reg 2 com o valor passadomove #reg1 #reg2
- Move o valor de reg2 para reg1, é apenas um aptalho paraadd #reg1 $ZERO #reg2
li #reg1 valor
- Aloca em reg1 o valor passado, é apenas um atalho paraaddi #reg1 $ZERO valor
beq #reg1 #reg2 ponto_de_jump
- Se reg1 for igual a reg2 pula para o ponto de pulobne #reg1 #reg2 ponto_de_jump
- Se reg1 for diferente de reg2 pula para o ponto de puloslt #reg1 #reg2 #reg3
- se reg2 < reg3, reg1 é setado para 1, caso contrario, reg1 é 0slti #reg1 #reg2 valor
- se reg2 < valor, reg1 é setado para 1, caso contrario, reg1 é 0jump ponto_de_jump
- Move a execução do codigo para outra linha (um goto)jal ponto_de_jump
- Move a execução do codigo para outra linha, e salva a linha original no registrador $rajr
- Retorna para o ponto armazenado em $rassc valor
- seta o registrador responsavel por chamar syscallssyscall
- Realiza a chamada de uma Syscall utilizando
Imprime na tela o valor armazenado no registrador $a1
Recebe do usuario um numero inteiro e armazena em $v1
Melhorar as condicionais Implementação de uma memoria fora os registradores Implementação de mais syscalls Implementação de uso de strings