Primeira Instrução MIPS

instrução MIPS LW e SW IF Simples no MIPS

Oi pessoal. Hoje nós vamos começar com as instruções MIPS e, conforme formos "caminhando", vou apresentando os detalhes do MIPS.

Todo software é traduzido para a linguagem binária (0 e 1) pra poder ser executado pelo processador. Quando você está com o computador ligado, usando quaisquer programas, todos eles estão sendo traduzidos e executados pelo seu processador. Se você desenvolve software, sabe que as instruções do seu programa serão convertidas para 0 e 1. Enfim, a linguagem da máquina é 0 e 1, mas a nossa linguagem não.

Eu não sei falar Chinês, mas se eu precisar conversar com um Chinês, solicitarei a ajuda de alguém que saiba essa língua, provavelmente um tradutor. Assim, com um tradutor, o Chinês e eu poderemos conversar igualmente. É a mesma coisa entre os programas e o hardware.

Considere a seguinte instrução em linguagem C:

a = b + c;

Essa instrução, para ser executada no processador, deve ser convertida para MIPS e depois para 0 e 1. Para poder manipular as variáveis é necessário utilizar os registradores do MIPS. Acredito que todos já saibam que a CPU é composta por registradores, que é a memória mais rápida e mais cara do projeto de um microprocessador, justamente porque está na CPU, para ajudar a executar as instruções.

Para as conversões usamos os registradores de uso geral do MIPS. Normalmente, nas nossas conversões, as variáveis que armazenam valores usam os registradores de nome t e as variáveis que contêm os operandos usam os registradores de nome s. A Tabela 1 apresenta os 32 registradores do MIPS 32 bits.

Tabela 1: Os 32 Registradores de uso geral do MIPS 32 bits.

Nome do RegistradorNúmeroBinárioUso
$zero0000 000constante zero
$at1000 001reservado para o montador
$v02000 010avaliação de expressão e resultados de uma função
$v13000 011avaliação de expressão e resultados de uma função
$a04000 100argumento 1 (passam argumentos para as rotinas)
$a15000 101argumento 2
$a26000 110argumento 3
$a37000 111argumento 4
$t08001 000temporário (valores que não precisam ser preservados entre chamadas)
$t19001 001temporário
$t210001 010temporário
$t311001 011temporário
$t412001 100temporário
$t513001 101temporário
$t614001 110temporário
$t715001 111temporário
$s016010 000temporário salvo (valores de longa duração e devem ser preservados entre chamadas)
$s117010 001temporário salvo
$s218010 010temporário salvo
$s319010 011temporário salvo
$s420010 100temporário salvo
$s521010 101temporário salvo
$s622010 110temporário salvo
$s723010 111temporário salvo
$t824011 000temporário
$t925011 001temporário
$k026011 010reservado para o Kernel do sistema operacional
$k127011 011reservado para o Kernel do sistema operacional
$gp28011 100ponteiro para área global
$sp29011 101stack pointer (aponta para o último local da pilha)
$fp30011 110frame pointer (aponta para a primeira palavra do frame de pilha do procedimento)
$ra31011 111endereço de retorno de uma chamada de procedimento

De acordo com a tabela, usaremos então os registradores que vão de $t0 à $t7 e de $s0 à $s7. A instrução a = b + c ficará da seguinte forma:

ADD $t0, $s0, $s1

ADD é o mnemônico para ADIÇÃO, $s0 é o valor que está armazenado em b, $s1 o valor da variável c e $t0 é a variável a. Essa é a instrução Assembly MIPS correspondente à instrução em linguagem C, também chamada de Linguagem de Montagem. Mas isso ainda não é suficiente para que a instrução seja executada no microprocessador. Os nomes dos registradores usados aqui foram escolhidos arbitrariamente, mas durante a execução real são usados os registradores que estiverem livres naquele instante.

O próximo agora é converter a instrução de Linguagem de Montagem para Linguagem de Máquina. Cada registrador tem um número, conforme apresenta a Tabela 1. A Linguagem de Máquina corresponde a trocar o NOME DO REGISTRADOR pelo seu NÚMERO. A instrução ficará da seguinte forma:

ADD $8, $16, $17

Simples né? Agora, o próximo passo é fazer a REPRESENTAÇÃO da instrução. No MIPS existem três FORMATOS de instruções, veremos um agora, que é o formato do tipo R (registrador).

Tabela 2: Formato de Instrução do Tipo R

oprsrtrdshamtfunct
6 bits5 bits5 bits5 bits5 bits6 bits
opcode ou código da operaçãoregistrador do primeiro operando fonteregistrador do segundo operando fonteregistrador do operando destinodeslocamento

função de operação ou código de função

Todas as instruções no MIPS 32 têm exatamente 32 bits e cada formato de instrução tem campos diferentes. O formato R é dividido em seis campos, sendo os campos OP e FUNCT com 6 bits e o restante com 5 bits, totalizando 32 bits.

O primeiro campo, OP, é destinado para identificação do código de operação que será realizada. O último campo seleciona uma operação secundária, por exemplo, a operação principal é a aritmética, mas a secundária é uma soma. Nem todas as operações têm dois códigos (op-funct) e nesse caso o campo FUNCT é setado com o valor zero.

Os campos RS e RT são destinados aos operandos fontes, em ordem, da esquerda para a direita, conforme aparecem na operação. Já o campo RD é destinado para o armazenamento do resultado da operação, portanto, operando destino. Shamt é um campo usado para setar uma quantidade de deslocamento mas, por hora, não o usaremos, por isso será setado com o valor zero.

Precisamos também conhecer as operações e seus valores decimais correspondentes. A Tabela 3 apresenta os valores binários e decimais para cada instrução que utilizaremos nesta série. Por hora, guardem a Tabela e não se preocupem com as instruções, nós as aprenderemos ao longo da série.

Tabela 3: Opcodes

OPCODEDECIMALBINÁRIO
ADD32100 000
SUB34100 010
OR36100 100
AND37100 101
SLT42101 010
BNE4000 100
BEQ5000 101
J2000 010
JR8001 000
LW35100 011
SW43101 011

Consultando a Tabela 3, a instrução ficará da seguinte forma: 

oprsrtrdshamtfunct
0$16$17$8032

Instruções de formato tipo R sempre terão o opcode igual a zero e funct será correspondente à instrução específica. A instrução está representada no seu formato específico, agora fica bem mais fácil pra chegar no código de máquina, conforme abaixo: 

oprsrtrdshamtfunct
00000010000100010100000000100000

O código binário 00000010000100010100000000100000 é a instrução a = b + c em MIPS 32 bits. Diante de tudo o que vimos até aqui, podemos fazer um algoritmo passo a passo para realizar a conversão: 

1. Converter a instrução de alto nível para Linguagem de Montagem;

2. Converter a instrução na Linguagem de Montagem para Linguagem de Máquina;

3. Fazer a representação correspondente da Linguagem de Máquina;

4. Converter a representação da Linguagem de Máquina para Código de Máquina.

Tranquilo não é? Bom, no próximo artigo veremos outros detalhes, mostrarei outra instrução e como ela será convertida. Espero que este artigo tenha sido útil pra vocês. Caso tenham dúvidas, por favor, deixem nos comentários. Muito Obrigada!

Outros artigos da série

<< Arquitetura de Conjunto de Instruções MIPSCompilação de Expressões no MIPS >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Hardware » Sistemas Digitais » Primeira Instrução MIPS
Comentários:
Notificações
Notificar
guest
9 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
IGOR DE OLIVEIRA MOTA
29/05/2020 21:48

Parabéns pelos artigos que elaborou, nesse momento de quarentena estão servindo muito para expandir os conhecimentos...estou perdendo o preconceito com a área de eletrônica e da ciência da computação e estou me apaixonando, sem nenhum esforço rs'. Espero que continue nos enriquecendo com seus conhecimentos, forte abraço ^ ^.

Ryan Lucas De Oliveira
Ryan Lucas De Oliveira
12/04/2019 12:22

Sera que alguem poderia me ajudar a resolver um exercicio?

Kleber
Kleber
15/03/2018 12:18

Parabéns Elaine pela qualidade do material que disponibiliza. Sucesso! Kleber.

Elaine Cecília Gatto
Elaine Cecília Gatto
Reply to  Kleber
17/10/2018 13:29

Oi Kleber, muito obrigada =)

Roniere Rezende
Roniere Rezende
15/10/2016 11:04

@elainececliagatto:disqus, muito bom o artigo, parabéns! Já estou aguardando o próximo artigo! Só fiquei com uma dúvida básica. Por exemplo, quando quero somar 4 + 2, tenho que converter esse dois valores em decimas para binário e colocar os valores correspondentes nos registradores rs e rt, e o resultado que é 6 ficará armazenado em binário em rd. Está correto esse meu entendimento?

Elaine Cecília Gatto
Elaine Cecília Gatto
Reply to  Roniere Rezende
17/10/2016 19:45

Roniere, na verdade pra trabalhar com valores diretamente como você está sugerindo temos de usar outro tipo de instrução, que chamamos de instruções IMEDIATAS! Ao invés de usar ADD usamos ADDI e elas funcionam relativamente iguais, mas o MODO DE ENDEREÇAMENTO é outro. Neste artigo estou mostrando como somar QUAISQUER valores que estejam armazenados em memória, independente do seu valor real, são instruções que utilizam Registradores temporários para manipular esses valores. Sem sombra de dúvidas que em algum momento os valores armazenados nas variáveis deverão ser codificados para 0 ou 1, mas isso ficará mais claro quando eu mostrar pra… Leia mais »

Renato Giovanini
Renato Giovanini
04/10/2016 08:14

Gostei muito do artigo, Elaine. É difícil encontrar materiais sobre MIPS didáticos assim em língua portuguesa.

Parabéns pela didática. Aguardando o próximo! =]

Elaine Cecília Gatto
Elaine Cecília Gatto
Reply to  Renato Giovanini
04/10/2016 11:40

Oi Renato!!! Muito Obrigada =) Fico feliz que você tenha gostado. Semana que vem tem mais, aguarde.

Talvez você goste:

Séries



Outros da Série

Menu

WEBINAR
 
RISC-V:
Novidades de 2020

 

Data: 26/08 às 19:30h - Apoio: Mouser Elecctronics
 
INSCREVA-SE AGORA »



 
close-link