Instrução IF Composto no MIPS

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

Oi galera! No último artigo falei com vocês a respeito do IF SIMPLES, usando uma instrução chamada BEQ. Hoje veremos como compilar uma instrução de IF COMPOSTO em linguagem de alto nível para MIPS, usando outra instrução chamada BNE (BRANCH ON NOT EQUAL). Também introduzirei um novo formato de instrução a partir de uma instrução de DESVIO INCONDICIONAL chamada JUMP e abreviada com J. É necessário que você siga a ordem de postagem da série ok? Caso não tenha lido o artigo IF SIMPLES, por favor, leia-o antes deste, fechado? Vamos lá!

Relembrando

Até agora, em nosso estudo sobre MIPS 32 bits, vimos as seguintes instruções:

Tabela 1: Conjunto de Instruções MIPS

CategoriaInstruçãoExemploSignificado 
Aritmética Adiçãoadd $s0, $s1, $s2$s0 = $s1 + $s2 
Subtraçãosub $s0, $s1, $s2$s0 = $s1 - $s2 
Transferência de Dados Load Wordlw $s0, 10 ( $s1)$s0 = Memória[$s1+10]Carregar Palavra
Store Wordsw $s0, 10 ( $s1)Memória[$s1+10] = $s1Armazenar Palavra
Desvio Condicional  Branch on Equalbeq $s0, $s1, L1if($s0 == $s1) go to L1Desvie se igual. Teste de igualdade.
Branch on not Equalbne $s0, $s1, L1if($s0 != $s1) go to L1Desvie se não for igual. Teste de desigualdade
Desvio IncondicionalJumpj 2500go to 2500Desvia para o endereço de destino

As instruções BNE e J serão estudadas hoje, portanto já as inclui na tabela para facilitar! Observando a Tabela notamos que não há muita diferença entre BNE e BEQ: ambas são instruções de desvio condicional, entretanto uma testa a igualdade e a outra testa a desigualdade.

A instrução BNE

"Uma instrução de desvio é uma instrução que requer a comparação de dois valores e que leva em conta uma transferência de controle subsequente para um novo endereço no programa, com base no resultado da comparação." (Patterson e Hanessey, 2014).

A instrução BNE avalia os valores armazenados em dois registradores diferentes. Se o valor no registrador 1 não for igual ao valor no registrador 2, então um desvio ocorre para um endereço, às vezes identificado por um Label. O formato da instrução é apresentado abaixo:

OpCodeRegistrador1Registrador2Desvio
6 bits5 bits5 bits16 bits

A sintaxe da instrução é: BNE registrador1, registrador2, desvio

A função da instrução BNE é: a próxima instrução a ser executada é aquela que estiver armazenada no endereço do LABEL se o valor no registrador1 for diferente do valor no registrador2, caso contrário, a execução do programa MIPS continua na sequência.

A Figura 1 apresenta o fluxograma da instrução BNE:

Fluxograma da Instrução BEQ para IF Composto no MIPS
Figura 1: Fluxograma da Instrução BEQ

Essa Figura tem um formato um pouco diferente da Figura apresentada para BEQ, mas é apenas a forma, se você reparar bem, é exatamente o mesmo fluxo. A instrução BEQ é codificada com o número decimal 04, enquanto BNE é 05.

O formato da instrução J é um tipo diferente das instruções R e I. As instruções J têm apenas dois campos, sendo o OPCODE com 6 bits e o Endereço com 26 bits. A instrução J é codificada com o número decimal 02.

OpCodeEndereço
6 bits26 bits

IF Composto

Dado o código em linguagem de alto nível (Linguagem C) abaixo, faça:

  1. Linguagem de Montagem
  2. Linguagem de Máquina
  3. Representação de Linguagem de Máquina
  4. Código de Máquina

Considere f = $s0; g = $s1; h = $s2; i = $s3 e j = $s4

a. Linguagem de Montagem

Vamos começar com if ( i == j ). Como agora temos um IF Composto, então, o endereço para o qual desviaremos será o ELSE! Sim, o ELSE agora é o nosso Label. Assim:

bne $s3, $s4, Else        # desvia para ELSE se i < > j

Isso parece confuso pra você? Usamos BNE em uma instrução originalmente de igualdade, i == j, mas BNE testa uma desigualdade. Bem, de acordo com os criadores do MIPS, o código será mais eficiente se for testada a desigualdade, isto é, se testarmos o THEN primeiro. Não deu pra entender? Vou tentar elucidar pra vocês, mas caso ainda persistam dúvidas, me avisem nos comentários deste artigo. Primeiro, vamos fazer o teste para o IF em C, supondo i = 10 e j = 5. Veja a Figura 2:

BNE Exemplo para IF Composto no MIPS
Figura 2: BNE Exemplo

Assim, if ( i == j ) temos if ( 10 == 5 ): 10 é igual a 5? Não! Então, vá para ELSE, isto é, execute f = g - h. Qual a probabilidade de i ser igual a j? Provavelmente ela é muito menor do que i ser diferente de j. E mais, como veremos no tópico de PIPELINE, muitas arquiteturas de conjuntos de instruções, incluindo o MIPS, consideram que o desvio sempre ocorre.

Ambas as instruções BEQ e BNE FORÇAM a ida para o bloco de comando ELSE, sempre devemos nos lembrar disso. BEQ força a entrada para ELSE quando o conteúdo do primeiro registrador É IGUAL ao segundo registrador. BNE força a entrada para ELSE quando o conteúdo do primeiro registrador É DIFERENTE do conteúdo do segundo registrador. Em nosso exemplo, estamos fazendo if(i==j), então, se i for igual a j, ele vai entrar no bloco THEN, se i for diferente de j ele vai para ELSE.

Se usarmos BEQ funcionará? Bom, BEQ forçará a entrada para ELSE se e somente se i for igual a i. Quando no código em alto nível vai entrar no ELSE? Entrará no ELSE quando i for diferente de j e não o contrário. É por isso que usamos BNE ao invés de BEQ, pois queremos tratar o desvio condicional primeiro. A segunda linha do código em C é a adição, essa é fácil de compilar né?

add $s0, $s1, $s2            # f = g + h (salta esta instrução se i <> j)

Agora, precisamos adicionar uma instrução MIPS que chama-se JUMP e é abreviada como J. Temos de adicionar essa instrução para indicar o fim da execução desse bloco de instruções e, também, para que o processador continue a executar o programa. Essa instrução é um desvio INCONDICIONAL e EXIT indica o fim desse bloco de programa.

j Exit                # desvia para exit

Continuando a compilação para MIPS, a próxima linha em C é o ELSE e dentro dele temos a instrução de subtração. Ficará assim:

 
Else: sub $s0, $s1, $s2        # f = g – h (salta esta instrução se i = j)
Exit:

Dessa forma, a Linguagem de Montagem final é:

b. Linguagem de Máquina

Como sabemos, a linguagem de máquina é apenas a substituição dos nomes dos registradores pelo seu respectivo número.

c. Representação da Linguagem de Máquina

Como sabemos, a representação da linguagem de máquina é apenas a "conversão" das instruções de Linguagem de Máquina para os seus respectivos formatos.

EndereçoOpCodersrtrdshamtfunct
10 0004192010 016
10 0040171816032
10 008210 020
10 0160171816034
10 020EXIT     

d. Código de Máquina

Como sabemos, o código de máquina é a "conversão" representação da Linguagem de Máquina para o código de máquina.

EndereçoOpCodersrtrdshamtfunct
10 0004192010 016
10 0040171816032
10 008210 020
10 0160171816034
10 020EXIT     
EndereçoOpCodersrtrdshamtfunct
10 000000 100‭10011‬‭10100‬0010 0111 0010 0000‬
10 004000 000‭10001‬10010‬‭10000‬00000‭100 000‬
10 008000 01000 ‭0000 0000 0010 0111 0010 0100‬
10 016000 000‭10001‬10010‬‭10000‬00000‭100 010‬
10 020EXIT     

Assim:

000100‭10011‭10100‭0010011100100000‬
000000‭1000110010‭1000000000‭100000‬
000010‭00000000000010011100100100‬
000000‭1000110010‭1000000000‭100010‬

Exercícios

Tente resolver os exercícios abaixo. Se houver dúvidas, deixe nos comentários.

Referências

PATTERSON, D. A.; Hennessy, J. L. Organização e Projeto de Computadores: A Interface Hardware/Software. 4.ª ed. Rio de Janeiro: Elsevier, 2014. Capítulo 2 (páginas de 58 à 179)

Outros artigos da série

<< Instrução IF Simples no MIPSInstrução SLT 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.

Software » Instrução IF Composto no MIPS
Comentários:
Notificações
Notificar
guest
4 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Tatiana Almeida
Tatiana Almeida
03/09/2018 10:14

bne $19, $20, Else # desvia para ELSE se i j add $16, $17, $18 # f = g + h (salta esta instrução se i j) j Exit # desvia para exit Else: sub $16, $17, $18 # f = g – h (salta esta instrução se i = j Exit Como sabemos, a representação da linguagem de máquina é apenas a "conversão" das instruções de Linguagem de Máquina para os seus respectivos formatos. Endereço OpCode rs rt rd shamt funct 10 000 4 19 20 10 016 10 004 0 17 18 16 0 32 10 008 2… Leia mais »

Elaine Cecília Gatto
Elaine Cecília Gatto
Reply to  Tatiana Almeida
17/10/2018 14:22

Oi Tatiana! Você não entendeu o shmat? Onde tem essa palavra? Seria shamt? Se for o shamt, eu falo sobre ele em outros artigos. Shamt é um campo utilizado apenas para instruções de deslocamento, nas outras operações ele deve constar como zero.

Carlos
Carlos
05/04/2018 00:13

Boa noite. Muito bom o seu material, agradeço por compartilhar. Sou estudando de graduação de CC. Fiquei com dúvida quanto as condições a > b ou a < b.

Elaine Cecília Gatto
Elaine Cecília Gatto
Reply to  Carlos
17/10/2018 14:20

Oi Carlos! Qual exatamente é a dúvida? Não está muito claro pra mim o que você não entendeu. Grata

Talvez você goste:

Séries



Outros da Série

Menu

WEBINAR
 

Soluções inteligentes para acionamento de MOSFETs/IGBTs com família STDRIVE

Data: 08/10 às 15:00h - Apoio: STMicroelectronics
 
INSCREVA-SE AGORA »



 
close-link