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 >>
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 Simples no MIPS
Comentários:
Notificações
Notificar
guest
10 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
sara
sara
28/11/2019 13:42

na representação o registrador destino é 18?

Paulo Freitas
Paulo Freitas
14/11/2019 23:59

Tem a possibilidade de fazer mais de um if no mesmo código?

Paulo Freitas
Paulo Freitas
Reply to  Paulo Freitas
15/11/2019 00:17

Como responderia essa questão por exemplo em Mips?
Leia a distância em Km e a quantidade de litros de gasolina consumidos por um carro
em um percurso, calcule o consumo em Km=l e escreva uma mensagem de acordo com
a tabela abaixo:
CONSUMO (Km/l) MENSAGEM
menor que 8 Venda o carro!
entre 8 e 14 Econômico!
maior que 12 Super econômico!

Lais
Lais
01/04/2019 00:38

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
Ola rsrs
19/02/2019 15:55

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
Jeneffer Gonçalves
11/09/2018 08:40

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
Elaine Cecília Gatto
Reply to  Jeneffer Gonçalves
17/10/2018 14:16

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

vitor v
vitor v
18/06/2018 09:59

vcs tem a resoluçao do exercicio acima
?

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