Operações Lógicas no MIPS

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

Oi pessoal!!!! Tudo bem com todos? Espero que sim. Hoje darei continuidade às operações que podemos realizar com o conjunto de instruções MIPS. Já vimos algumas instruções para operações aritméticas, salto e transferência de dados, hoje vamos aprender um pouco sobre as operações lógicas no MIPS! Partiu então?

 

 

Operações Lógicas

 

Cinco são as operações lógicas definidas no MIPS, conforme mostra a Tabela 1:

 

Tabela1: Operações Lógicas MIPS

Operações LógicasInstruções MIPS
Shift à direitaSLL
Shift à esquerdaSRL
And bit a bitAND, ANDI
Or bit a bitOR, ORI
Not bit a bitNOR

 

As instruções de operações lógicas ajudam a simplificar o empacotamento e o desempacotamento dos bits em words. Todos lembram o que é uma word? Sim? Não? Vale a pena relembrar né? A unidade de informação que trabalhamos em máquinas digitais, como a grande maioria já deve saber, são os bits, isto é, os zeros e uns. Quando os zeros e uns são agrupados em uma determinada quantidade eles recebem nomes, conforme mostra a Tabela 2:

 

Tabela 2: Bits

Bit1 bits0
Nibble4 bits0000
Byte8 bits0000 0000
Word16 bits0000 0000 0000 0000
Double Word32 bits0000 0000 0000 0000 0000 0000 0000 0000 
Quad Word64 bits0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 

 

Um bit é correspondente a um único bit, isto é, ou ele tem o valor zero, ou tem o valor um, um nibble corresponde a 4 bits, um byte são 8 bits, e assim, consecutivamente, até chegarmos no número de bits máximo.

 

A Tabela 2 apresenta Word como uma quantidade de 16 bits, entretanto, Word é usada atualmente como sinônimo de PALAVRA. Uma Word (ou Palavra) é a quantidade de bits que se consegue transmitir, portanto, não é obrigatoriamente 16 bits, pode ser 32 bits. Esclarecida esta questão, vamos estudar agora a operação SHIFT e, nos artigos posteriores, veremos as outras operações.

 

 

Operação SHIFT

 

Shift significa deslocamento, assim um shift à esquerda significa um deslocamento à esquerda e, um shift à direita, significa um deslocamento à direita. Mas, você está aí se perguntando: "ora, bolas, carambolas, deslocamento de quem?". Pois bem, é o deslocamento dos bits da palavra. Os shifts movem todos os bits de uma palavra, preenchendo os  bits que ficaram vazios com zeros. Vamos ver um exemplo para entender melhor. Suponha que um registrador tivesse armazenado o valor 9:

 

0000 0000 0000 0000 0000 0000 1001

 

Agora imagine que é executada uma instrução de deslocamento que comanda o deslocamento de 4 bits à esquerda. O novo valor desse registrador será:

 

0000 0000 0000 0000 0000 1001 0000

 

Conseguiram notar a diferença? Agora o valor não é mais o 9, mas sim 144. Portanto, ao realizarmos o deslocamento de 4 bits à esquerda, mudamos o valor decimal que estava armazenado no registrador também.

 

SLL significa Shift Left Logical (deslocamento lógico à esquerda) e SRL significa Shift Right Logical (deslocamento lógico à direita), que são os mnemônicos e nomes das instruções MIPS. Assim, o exemplo acima fica da seguinte forma na linguagem de montagem:

 

SLL $t2, $s0, 4                              # $t2 = $s0 << 4 bits

 

 

A linguagem de máquina fica da seguinte forma:

 

SLL $10, $16, 4                                               

 

A representação fica assim:

 

opcodersrtrdshamtfunct
00161040
6 bit5 bits5 bits5 bits5 bits6 bits

 

Para finalizar a compilação, o código da máquina:

 

000000 00000 ‭10000‬ 01010 00100 000000

 

Assim, 4 é o número de bits que deve ser deslocado, portanto, ele deve ser colocado no campo SHAMT, que significa Shift Amount. Esse campo armazena a quantidade de deslocamento e é usado apenas para instruções de deslocamento. $t2 ($10) é o registrador que armazenará o resultado, portanto, registrador destino e, por isso, é colocado no campo RD. $s0 ($16) deve ser inserido no campo RT. O campo RS não é utilizado, por isso colocamos zero. A codificação padrão para SLL é zero pra o campo de código e para funct. Portanto, SLL é uma instrução do tipo R.

 

Em nosso exemplo o número decimal inicial era 9 e o resultado do deslocamento em 4 bits foi 144. Se vocês fizerem 9 x 24 o resultado será 144, ou seja, a instrução SLL é equivalente a uma multiplicação por 2i.

 

A instrução SRL é muito parecida com a SLL, a diferença básica é que a SRL desloca os bits para a direita. O código de FUNCT para SLL é 2 e o opcode é 0. Vejamos um exemplo:

 

0000 0000 0000 0000 0000 1001 0000 = 14410

 

Deslocando 4 bits a direita:

 

0000 0000 0000 0000 0000 0000 1001 = 910

 

Assim a instrução na linguagem de montagem fica da seguinte forma:

 

SRL $t2, $s0, 4                              # $t2 =  $s0 >> 4 bits

 

Na linguagem de máquina fica:

 

SRL $10, $16, 4

 

A representação fica da seguinte forma:

 

opcodersrtrdshamtfunct
00161042
6 bit5 bits5 bits5 bits5 bits6 bits

 

Finalizando a compilação, o código de máquina:

 

000000 00000 ‭10000‬ 01010 00100 000010

 

 

Conclusão

 

Acharam muito dificil? Ou acharam divertido? Estão um pouco perdidos ainda? Não se preocupem, estou disponível para tirar todas as suas dúvidas, basta deixá-las ali nos comentários. Deixarei alguns exercícios para vocês praticarem. Lembrem-se: é importante ler todos os artigos anteriores pois estou os escrevendo em uma ordem para facilitar a aprendizagem. Ao final deste artigo coloquei um tópico chamado RECAPITULANDO, que contém um resumo de todas as instruções que já estudamos até este artigo. Então, está combinado? Fechou? Até a próxima.

 

 

Exercícios

 

Considere os seguintes números decimais:

 

  1. 10
  2. 25
  3. 43
  4. 89

 

  1. Faça a compilação do deslocamento à direita em 8 bits para cada um deles.
  2. Faça a compilação do deslocamento à esquerda em 4 bits para cada um deles.

 

 

Recapitulando

 

Registradores

 

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

 

 

Formato das Instruções

 

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

 

 

Tabela 3: Representação de Instruções do Formato Tipo I

opcodersrtendereço
6 bits5 bits5 bits16 bits
código de operaçãoregistrador destinoregistrador fonteendereço de memória

 

 

Tabela 4: Representação de Instruções do Formato Tipo J

opcodeendereço
6 bits26 bits
código de operaçãoendereço de memória do salto

 

 

OPCODES

 

Tabela 5: 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
SRL0000 000
SLL0000 000

 

 

Linguagem Assembly

 

Aritméticas

  • Formato R
 SintaxeExemplo
Somaadd registrador_destino, registrador_fonte, registrador_fonteadd $t1, $s0, $s1
Subtraçãosub registrador_destino, registrador_fonte, registrador_fontesub $t2, $s2, $s3
Shift à direitasrl registrador_destino, registrador_fonte, deslocamentosrl $t0, $s1, 5
Shift à esquerdasll registrador_destino, registrador_fonte, deslocamentosll $t0, $s1, 5

 

 

Transferências de dados

  • Formato I
 SintaxeExemplo 
Memória para Registradorlw registrador_destino, endereço, registrador_fontelw $s1, 20 ( $s2 )$s1 = Memória [ $s2 + 20 ]
Registrador para Memóriasw registrador_fonte, endereço, registrador_destinosw $s1, 20 ( $s2 )Memória [ $s2 + 20 ] = $s1

 

 

Desvios Condicionais

  • Formato R
 SintaxeExemplo 
Desvie se Igual (Teste de Igualdade)beq registrador_fonte1, registrador_fonte2, labelbeq $s1, $s2, label

se ($s1 = $s2) vá para o label

Desvie se não for Igual (Teste de desigualdade)bne registrador_fonte1, registrador_fonte2, labelbne $s1, $s2, labelse ($s1 != $s2) vá para o label
Setar se menor queslt registrador_destino, registrador_fonte1, registrador_fonte2slt $s1, $s2, $s32

se ($s2 < $s3) então $s1 = 1 senão $s1 = 0

 

 

Desvios Incondicionais

  • Formato J
 SintaxeExemplo
Saltoj endereço_de_memóriaj 25000

 

 

Conceitos Importantes

 

Conjunto de Instruções: é o vocabulário dos comandos entendidos por uma determinada arquitetura.

 

Conceito de Programa Armazenado: é a ideia de que as instruções e os dados de muitos tipos podem ser armazenados na memória como números, levando ao computador de programa armazenado.

 

Instrução de Transferência de memória: é um comando que move dados entre a memória e os registradores.

 

Endereço: é um valor usado para delinear o local de um elemento de dados específico dentro de uma sequência da memória.

 

Palavra (Word): é a unidade de acesso natural de um computador, normalmente um grupo de 32 bits, corresponde ao tamanho de um registrador na arquitetura MIPS.

Outros artigos da série

<< Instrução SLT no MIPSOperação Lógica AND 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.
recentes antigos mais votados
Notificar
André Luchon
Visitante
André Luchon

Eliane,
Parabéns , muito bem explicado. Estou tendo Arquitetura de Computadores nesse semestre na faculdade e vai ajudar bastante.