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 >>
NEWSLETTER

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

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Elaine Cecília Gatto
Bacharel em Engenharia de Computação. Mestre em Ciência da Computação. Doutoranda em Ciência da Computação. Co-fundarora e Líder das #GarotasCPBr. Pesquisadora Convidada no Grupo de Pesquisa: "Artes em Tecnologias Emergentes" do Programa de Pós Graduação em Design na UNESP Campus Bauru. Cantora, Docente no Magistério Superior, Geek, Nerd, Otaku e Gamer. Apaixonada por Michael Jackson, Macross, Rocky Balboa, Séries, Filmes, Cervejas e Vinhos. Mais informações sobre mim você encontra em: http://lattes.cnpq.br/8559022477811603.

7
Deixe um comentário

avatar
 
4 Comment threads
3 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
6 Comment authors
Ryan Lucas De OliveiraElaine Cecília GattoKleberRoniere RezendeElaine Cecília Gatto Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Ryan Lucas De Oliveira
Visitante
Ryan Lucas De Oliveira

Sera que alguem poderia me ajudar a resolver um exercicio?

Kleber
Visitante
Kleber

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

Elaine Cecília Gatto
Visitante
Elaine Cecília Gatto

Oi Kleber, muito obrigada =)

Roniere Rezende
Visitante
Roniere Rezende

@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
Visitante
Elaine Cecília Gatto

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
Visitante
Renato Giovanini

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
Visitante
Elaine Cecília Gatto

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