Instrução IF Simples no MIPS

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

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

  • ADD (soma)
  • SUB (subtração)
  • LW (transferência da memória para um registrador)
  • SW (transferência de um registrador para a memória)

 

Hoje apresentarei a vocês uma instrução chamada BEQ, utilizada em desvios condicionais. Nosso exemplo de uso dessa instrução será com um IF Simples no MIPS.

 

 

A instrução BEQ

 

BEQ significa Branch On Equal, em português, Desvie se for igual. Essa instrução força um desvio para o comando com o LABEL (nome de desvio) se o valor no registrador 1 for igual ao valor no registrador 2, portanto, é uma instrução de comparação.

 

BEQ registrador1, registrador2, endereço de desvio

 

opcodersrtendereço
6 bits5 bits5 bits16 bits

 

RS e RT são os registradores que serão comparados e o endereço de 16 bits é o desvio. A Figura 1 ilustra o funcionamento da instrução BEQ.

 

Representação de BEQ
Figura 1: Representação de BEQ

  

Basicamente, se r1 = r2 então, desvia para o endereço que está sendo apontado pelo LABEL e execute as instruções que ali estão. Caso contrário, o programa continuará executando as instruções seguintes. Vamos ver um exemplo:

 

if ( x == y ) go to L2;

a = b + c;

L2 : a = b - c;

 

Considere x = $s0, y = $s1, a = $s2, b = $s3, c = $s4. Começamos a conversão pela primeira linha if ( x == y ) go to L2

 

BEQ $s0, $s1, L2              #desvia para L2 se x = y

 

Observe que o endereço fica ao fim da instrução. Devemos continuar a conversão da instrução seguindo a sequência de comandos original. A segunda linha então deve ser convertida a = b + c. Essa já é mais fácil não é? A conhecemos bem, ficará assim:

 

ADD $s2, $s3, $s4

 

Essa instrução será executada se x não for igual a y. Por fim, a última linha, L2 : a = b - c, também já a conhecemos:

 

L2 : SUB $s2, $s3, $s4

 

Essa linha será executada se x for igual a y. Assim a Linguagem de Montagem ficará da seguinte forma:

 

BEQ $s0, $s1, L2              #desvia para L2 se x = y

ADD $s2, $s3, $s4           # Executa se x <> y

L2 : SUB $s2, $s3, $s4    # Executa se x = y

 

A Figura 2 ilustra o uso de BEQ nessa sequencia de instruções:

 

Sequência de Instruções
Figura 2: Sequência de Instruções

 

Portanto, se x = y, vai para L2, que executará a = b - c e, se x <> y executa a instrução seguinte, a = b + c.

 

 

Linguagem de Máquina

 

A linguagem de máquina ficará como a seguir:

 

BEQ $16, $17, L2

ADD $18, $19, $20

L2 : SUB $18, $19, $20

 

 

Representação

 

A forma de representar BEQ é parecida com LW e SW, como já mostrado anteriormente. O endereço de memória aqui é apontado por L1, não sabemos que endereço é este, mas podemos fazer uma simulação, supondo algum endereço para que possa ser indicado na conversão para o código de máquina. Um pouco mais pra frente, falarei sobre detalhes a respeito do endereçamento e de seu cálculo, então, por hora, não se preocupem com isso. L1 aponta para 10008.

  

Endopcodersrtrdshamtfunct
1000051617L1
100040181920032
100080181920034

 

 

Código de Máquina

 

O código de máquina fica da seguinte forma:

 

Endopcodersrtrdshamtfunct
1000000010110000100010010 0111 0001 1000‬
10004000 00010010100111010000000100000
10008000 00010010100111010000000100010

 

 

0001011000010001‭0010011100011000‬
00000010010100111010000000100000
00000010010100111010000000100000

 

Observem que no lugar de L1 eu coloquei o endereço 10008 que é o mesmo que ‭0010011100011000‬. O número do endereço de memória é apenas representativo. A instrução um está no endereço 10000, que é a instrução do IF, a segunda instrução está no endereço 10004 e a terceira está em 10008.

 

 

Exercícios

 

Faça a conversão da sequencia de instruções abaixo

 

if ( x == y) go to L2

a[1] = b - c;

b = a[2] + c;

c = b + c[3];

L2: a[4] = a[6] + a[5]

 

considere: a = $s0, b = $s1, c = $s2, x = $s3, y = $s4

Outros artigos da série

<< Instruções LW e SW com Array no MIPSInstrução IF Composto 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
3 Followers
 
Most reacted comment
Hottest comment thread
5 Comment authors
LaisOla rsrsElaine Cecília GattoJeneffer GonçalvesElaine Cecília Gatto Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Lais
Visitante
Lais

Na parte que fala da representação a segunda linha(referente ADD) e a terceira linha(referente SUB) não esta errado não? Não seria $19(primeiro operando), $20(segundo operando), $18(destino)

Ola rsrs
Visitante
Ola rsrs

Eu fiz o exercício ali, mas não sei se esta certo, vc poderia corrigir?

beq $s3, $s4, $s5, AQUI
sub $t0,$s1, $s2
sw $t0, 4($s0)
lw $t0, 8($s0)
add $s1, $t0, $s2
lw $t0, 12($s2)
add $s2, $s1, $t0

AQUI:
lw $t1, 24($s0)
lw $t2, 20($s0)
add $t3, $t1, $t2
sw $t0, 16($s0)

Eu fui fazendo instrução por instrução e tentei economizar registradores, ali no caso do $t0, esta certo?
Ou seria melhor/correto deixar um registrador para cada 'lw' e 'sw'?

Jeneffer Gonçalves
Visitante
Jeneffer Gonçalves

Oi! Preciso carregar os valores a[2] (por exemplo) em uma variável temporária antes de fazer as somas?
ex: lw $t2, 4($s0)

Elaine Cecília Gatto
Visitante
Elaine Cecília Gatto

oi! Sempre é preciso carregar os valores antes de fazer qq operação tá bom!

vitor v
Visitante
vitor v

vcs tem a resoluçao do exercicio acima
?