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 >>
Website | Veja + conteúdo

Atuo como Professora de Informática e Computação desde 2001, atendendo de forma especial a Terceira Idade e Concurseiros. Desde 2009 venho atuando como Docente no Ensino Superior em diversos cursos de Graduação e Pós Graduação Lato Sensu, tanto presenciais, quanto semipresenciais e à distância. Ministrei várias disciplinas onde ensino os estudantes a desenvolverem plataformas e sistemas computacionais. Orientei vários trabalhos acadêmicos, desenvolvi inúmeros materiais, trabalhei com pesquisa, ensino, extensão e inovação, ministrei palestras em vários eventos. Mais recentemente venho ofertando serviços na área de tecnologia como desenvolvimento de sistemas, treinamentos, consultoria, mentoria, etc. Comecei meu Doutorado na área de Machine Learning (Multi-label Classification) na UFSCar em 02/2019 e devo terminar em 01/2023. Também estudo canto, jogo vôlei, sou geek, nerd, otaku e gamer!

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.

Comentários:
Notificações
Notificar
guest
14 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

Inteligência Artificial na Borda

DATA: 29/06 às 15:00h