Explique a instrução MIPS abaixo:
BEQ $t0, $t1, 20

Passo 1

O enunciado dá a instrução MIPS BEQ \$t0, \$t1, 20. Ou seja:
  • A instrução é BEQ (branch if equal).
  • Os registradores comparados são \$t0 e \$t1.
  • O campo imediato é 20 (um valor inteiro de 16 bits fornecido no encodamento).
O que se pede: explicar o que essa instrução faz, como o offset 20 é interpretado e como a instrução é codificada/execultada na arquitetura MIPS.

Passo 2

O significado funcional da instrução: BEQ rs, rt, offset faz a comparação entre os conteúdos dos registradores \$rs e \$rt. Se os valores forem iguais, o fluxo de execução salta para um endereço calculado a partir do campo offset; se não forem iguais, a execução continua na instrução seguinte. No nosso caso, rs é \$t0 e rt é \$t1.
Importante: a comparação é uma igualdade bit-a-bit entre os conteúdos de \$t0 e \$t1 — não há flags de sinal nem comparação separada para signed/unsigned.

Passo 3

Formato da instrução (tipo I):
  • Campos e tamanhos: opcode (6 bits) | rs (5 bits) | rt (5 bits) | immediate (16 bits).
  • Para BEQ o opcode é binário 000100 (decimal 4).
  • Nos registradores de propósito geral MIPS: \$t0 é o registro número 8 e \$t1 é o registro número 9. Então rs = 8 e rt = 9.

Passo 4

Como o campo imediato é interpretado:
  • O immediate é um inteiro de 16 bits com sinal (sign-extended).
  • Ele representa um deslocamento em palavras (ou seja, número de instruções), não em bytes. Na formação do endereço final o hardware faz um deslocamento de 2 bits à esquerda (multiplica por 4) para transformar palavras em bytes.
  • Fórmula padrão do destino do salto:
\text{target} = \text{PC} + 4 + (\text{sign\_extend}(\text{offset}) \ll 2).
Aqui \text{PC} é o endereço da instrução BEQ atual; \text{PC}+4 é o endereço da próxima instrução sequencial.

Passo 5

Aplicando ao nosso offset 20:
  • Primeiro converte-se 20 (decimal) em deslocamento de bytes: 20 \times 4 = 80 bytes. Isto é o resultado do (\text{offset} \ll 2).
  • Então o destino do salto é
\text{target} = \text{PC} + 4 + 80 = \text{PC} + 84\\ \text{bytes}.
Exemplo numérico: se a instrução BEQ estiver em \text{PC} = \text{0x00400000}, então o destino será
\text{target} = \text{0x00400000} + 4 + 80 = \text{0x00400054}.

Passo 6

Comportamento em tempo de execução:
  • Se \$t0 = \$t1: o próximo contador de programa (PC) será carregado com o valor \text{PC}+4 + (20\ll 2), ou seja salta para \text{PC}+84 bytes.
  • Se \$t0 \neq \$t1: o PC continua com \text{PC}+4 (executa a instrução seguinte).
  • Observação de pipeline (conceito importante para provas): em implementações clássicas MIPS existe um branch delay slot — a instrução imediatamente seguinte à BEQ (a que está em \text{PC}+4) é executada sempre, independentemente de o salto ser tomado ou não. Em MIPS modernos esse comportamento pode ser mascarado pelo hardware, mas em muitos exercícios e códigos de baixo nível deve-se assumir a existência do delay slot.

Passo 7

Codificação em máquina (32 bits) — cálculo:
  • Usando a fórmula de encodamento:
\text{instr} = (\text{opcode}\ll 26) \;|\; (\text{rs}\ll 21) \;|\; (\text{rt}\ll 16) \;|\; (\text{immediate}\,\&\,0xFFFF).
  • Substituindo: \text{opcode}=4, \text{rs}=8, \text{rt}=9, \text{immediate}=20, obtemos em hex
\text{instr} = 0x11090014.
Em binário (dividido por campos):
000100\;01000\;01001\;0000000000010100
ou seja 000100 01000 01001 0000 0000 0001 0100.

Passo 8

Resumo em pseudocódigo (para usar em prova ou entender rápido):
\text{if }(\$t0 == \$t1)\\ \text{PC} \leftarrow \text{PC}+4+(20\ll 2);\\ \text{else }\text{PC}\leftarrow\text{PC}+4.
Lembrete prático: o offset 20 desloca em instruções, não em bytes — por isso multiplica-se por 4 ao obter o endereço em bytes.

Resposta

Salta para \text{PC}+4+(20\ll 2)=\text{PC}+84 bytes se \$t0=\$t1; caso contrário continua em \text{PC}+4. A instrução é do tipo I com opcode 4, registradores \$t0=8 e \$t1=9, e codificação máquina 0x11090014.

Exercícios relacionados