ÍNDICE DE CONTEÚDO
- Arquitetura de Conjunto de Instruções MIPS
- Primeira Instrução MIPS
- Compilação de Expressões no MIPS
- Convertendo uma instrução com Array no MIPS
- Armazenando um valor em Array no MIPS
- Instruções LW e SW com Array no MIPS
- Instrução IF Simples no MIPS
- Instrução IF Composto no MIPS
- Instrução SLT no MIPS
- Operações Lógicas no MIPS
- Operação Lógica AND no MIPS
- Operação Lógica OR no MIPS
- Operação Lógica NOT no MIPS
- Endereços de Memória no MIPS
- Operandos Imediatos e Constantes no MIPS
- Compilando Arrays com índice variável no MIPS
- Testando as instruções MIPS no MARS
- Executando um Array no MARS para MIPS
- Sinal e Overflow no MIPS
- Compilando instruções com ou sem Sinal, Overflow e Imediato no MIPS
- Compilando While no MIPS
- Compilando Switch/Case no MIPS
- Compilando Funções e Procedimentos no MIPS
- Compilando Procedimentos Recursivos e Aninhados no MIPS
- Detalhamento da Compilação de Procedimentos no MIPS
- MIPS: Instruções de Multiplicação
- MIPS: Instruções de Divisão
- MIPS: Subtração e outras instruções
- Compilando o comando FOR no MIPS
- Ponto Flutuante no MIPS
- Convertendo Código de Máquina em Assembly MIPS – Parte 1
- MIPS: Resolução dos exercícios – Parte 1
- MIPS: Resolução de Exercícios Parte 2
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
opcode | rs | rt | endereço |
6 bits | 5 bits | 5 bits | 16 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.
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:
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.
End | opcode | rs | rt | rd | shamt | funct |
10000 | 5 | 16 | 17 | L1 | ||
10004 | 0 | 18 | 19 | 20 | 0 | 32 |
10008 | 0 | 18 | 19 | 20 | 0 | 34 |
Código de Máquina
O código de máquina fica da seguinte forma:
End | opcode | rs | rt | rd | shamt | funct |
10000 | 000101 | 10000 | 10001 | 0010 0111 0001 1000 | ||
10004 | 000 000 | 10010 | 10011 | 10100 | 00000 | 100000 |
10008 | 000 000 | 10010 | 10011 | 10100 | 00000 | 100010 |
00010110000100010010011100011000
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
na representação o registrador destino é 18?
Oi Sata, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. Vou conferir ok. [ ]s
Tem a possibilidade de fazer mais de um if no mesmo código?
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!
Oi Paulo, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. É um exercício que vc precisa fazer? [ ]s
Oi Paulo, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. Tem sim!
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)
Oi Lais, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. Vou conferir ok. [ ]s
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’?
Oi me parece que está certo, mas estou preparando um artigo com as correções ta bom. Desculpem a demora.
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)
oi! Sempre é preciso carregar os valores antes de fazer qq operação tá bom!
vcs tem a resoluçao do exercicio acima
?
Oi Vitor!!! Não tenho a correção, mas se você fizer aí, me manda pra eu corrigir ok!