Dentre as alternativas, quais programas em MIPS traduzem o código em C abaixo?
int min(int a, int b) {
if (a < b)
return a;
else
return b;
}
a) min:
blt \(a0,\)a1, then
add \(v0,\)0, $a0
j min_exit
then:
add \(v0,\)0, $a1
min_exit:
jr $ra
b) min:
add \(v0,\)0, $a0
blt \(a0,\)a1, min_xt
add \(v0,\)0, $a1
min_xt:
jr $ra
c) min:
blt \(a0,\)a1, then
add \(v0,\)0, $a1
j min_exit
then:
add \(v0,\)0, $a0
min_exit:
jr $ra
d) min:
bge \(a0,\)a1, then
add \(v0,\)0, $a1
j min_exit
then:
add \(v0,\)0, $a0
min_exit:
jr $ra
int min(int a, int b) {
if (a < b)
return a;
else
return b;
}
a) min:
blt \(a0,\)a1, then
add \(v0,\)0, $a0
j min_exit
then:
add \(v0,\)0, $a1
min_exit:
jr $ra
b) min:
add \(v0,\)0, $a0
blt \(a0,\)a1, min_xt
add \(v0,\)0, $a1
min_xt:
jr $ra
c) min:
blt \(a0,\)a1, then
add \(v0,\)0, $a1
j min_exit
then:
add \(v0,\)0, $a0
min_exit:
jr $ra
d) min:
bge \(a0,\)a1, then
add \(v0,\)0, $a1
j min_exit
then:
add \(v0,\)0, $a0
min_exit:
jr $ra
Passo 1
O enunciado pede: dentre as quatro alternativas (a), (b), (c) e (d), quais programas em MIPS traduzem corretamente a função C abaixo:
Informações relevantes dadas (pressuposições padrão de MIPS que usaremos):
- Os parâmetros chegam em
(que representa ) e em (que representa ). - O valor de retorno deve estar em
. - O retorno para o chamador é feito com
via instrução . - Precisamos que a função retorne o menor entre
e : se então retornar , caso contrário retornar . - Vou analisar cada alternativa instrução por instrução e testar os dois casos relevantes:
e .
Passo 2
Breve explicação das instruções MIPS que aparecerão nas alternativas (para você entender o que cada linha faz):
-
: copia o valor de para (porque é o registrador com valor 0). Em palavras: . -
: copia para . Em palavras: . -
: se então desvia para label, caso contrário continua na próxima instrução. -
: se então desvia para label, caso contrário continua. -
: salto incondicional para label. -
: retorna ao chamador (usa como endereço de retorno).
Essas semânticas são fundamentais para rastrear o fluxo de controle e decidir se um trecho implementa corretamente o if/else.
Passo 3
Análise da alternativa (a):
Código dado (reproduzido aqui com os registradores entre para ficar claro):
Código dado (reproduzido aqui com os registradores entre
-
,
,\ then) -
,
, ) -
-
-
,
, ) -
- )
Vamos seguir os dois casos:
- Caso
: a instrução é verdadeira, portanto pula para o rótulo . No rótulo a instrução é ,$0,$a1)) — isto faz . Resultado: retorna . - Mas o esperado quando
é retornar . Então isso está invertido.
- Mas o esperado quando
- Caso
: a falha, então executa a linha seguinte ,$0,$a0)) que faz , e depois salta para e retorna. Resultado: retorna . - No caso
o esperado é retornar . Aqui também está invertido.
- No caso
Conclusão da (a): o código devolve o valor oposto ao desejado (quando
retorna
, quando
retorna
). Portanto (a) está INCORRETA.
Passo 4
Análise da alternativa (b):
Código:
Código:
-
,
, ) -
,
,\ min_xt) -
,
, ) -
- )
Interpretando passo a passo:
- A primeira instrução já faz
. Ou seja, por padrão o retorno é preparado como . - Em seguida vem
,
,\ min_xt). Se (caso em que queremos retornar ), a instrução é verdadeira e o fluxo vai para , que é imediatamente seguido por : assim o valor já carregado em (que é ) é retornado. - Se
, a falha e a execução continua na próxima instrução: ,$0,$a1)), que sobrescreve com . Depois vem e : retorna .
Testes rápidos:
- Se
(ou seja ): antes do branch ; branch verdadeiro pula para ; retorna 1 — correto. - Se
(ou seja ): falso; executa ; retorna 3 — correto.
Conclusão da (b): comportamento correto, implementa exatamente o if: se
retorna
, senão retorna
. Portanto (b) está CORRETA.
Passo 5
Análise da alternativa (c):
Código:
Código:
-
,
,\ then) -
,
, ) -
-
-
,
, ) -
- )
Seguimento dos casos:
- Se
: é verdadeira, então pula para , onde se executa ; depois chega em e faz : retorna — correto. - Se
: falha, então executa a instrução seguinte , depois salta para e retorna — correto.
Observação: (c) usa a forma “se então faz A; senão faz B” com um salto incondicional para pular o ramo contrário — padrão clássico e correto.
Conclusão da (c): implementa corretamente a função min, portanto (c) está CORRETA.
Passo 6
Análise da alternativa (d):
Código:
Código:
-
,
,\ then) -
,
, ) -
-
-
,
, ) -
- )
Vamos ver:
- Se
: a instrução é verdadeira, então pula para e executa , retornando . Mas o correto quando é retornar . Aqui está errado. - Se
: falha, então executa a próxima instrução e retorna . Quando o correto é retornar , mas aqui retorna . Também errado.
Portanto (d) também está invertido (semelhante a (a) mas usando bge).
Conclusão da (d): INCORRETA.
Passo 7
Resumo do raciocínio (motivação prática para a prova):
- O comportamento desejado é: se
então , senão . - Ao analisar cada trecho, basta seguir o fluxo das instruções condicionais (
, ) e ver que valor fica em antes do . - Alternativas (b) e (c) deixam
com o menor dos dois registros nos dois casos; (a) e (d) fazem o contrário.
Resposta
(b) e (c)