( 1,0 pontos) Encontre a sequência mais curta de instruções MIPS para determinar se existe um carry (estouro) na soma de dois registradores, digamos, os registradores
\mathrm{t} 3
$\mathrm{t} 4
$$ t2 se o carry for 0 ou 1 , respectivamente.
Passo 1
O enunciado pede: determinar se, ao somar os registradores
e
, ocorre um carry (estouro no bit de carry inteiro, isto é, carry-out da soma de 32 bits). Colocar no registrador
o valor
se não houve carry, ou
se houve carry.\n
Informações relevantes dadas (explicitadas):
Informações relevantes dadas (explicitadas):
- Temos dois operandos em
e (valores de bits cada). - Precisamos escrever
ou em . - Podemos usar instruções MIPS usuais (adição sem exceção, comparação unsigned, etc.).
Não foi dada nenhuma restrição adicional sobre quais registradores temporários podemos usar.
Passo 2
Entendendo o que é “carry” no contexto de soma unsigned de
bits. Vou usar notação simples: seja
o valor em
e
o valor em
. A soma de
bits aritmética sem sinal está em módulo
; definimos
O carry (carry-out) ocorre exatamente quando
. Quando isso acontece, o valor armazenado em
é
, que é menor que
(porque subtraiu-se
). Quando não há carry,
. Logo, a condição do carry pode ser detectada testando se
Isso é uma propriedade padrão de soma em aritmética modular unsigned: o overflow de carry aparece como “wrap-around” que torna o resultado menor que um dos operandos. Conclusão prática: calcular
e testar se
(comparação sem sinal) indica se houve carry.
Passo 3
Traduzindo a ideia para instruções MIPS:
- Primeiro precisamos do resultado da soma sem causar exceção por overflow de sinal: usamos a instrução
(adição unsigned ou sem exceção). Guardamos o resultado em um registrador temporário, por exemplo . - Depois comparamos sem sinal
(o ) com (o ) usando (set less than unsigned). A instrução coloca no destino se o primeiro operando for menor que o segundo em ordem unsigned, caso contrário coloca . Portanto faz , exatamente o bit de carry que queremos.
Passo 4
Escrevendo explicitamente as instruções e explicando cada uma:
-
\n - Calcula
(sem exceção), guarda em . Aqui é temporário.
- Calcula
-
\n - Faz a comparação unsigned
. Se verdadeiro, recebe (houve carry); se falso, recebe .
- Faz a comparação unsigned
Exemplo numérico para fixar: suponha
(
) e
(
). Então
, o resultado em 32 bits é
(
), e
é verdadeiro →
. Para
,
:
e
é falso →
.
Passo 5
Por que essa sequência é minimal (mais curta) razoável:
- Precisamos tanto de
quanto de um teste comparativo unsigned. Não existe em MIPS uma única instrução que calcule e também escreva em um registrador ou baseado no carry-out. A instrução gera exceção em overflow de sinal e não fornece o bit de carry para registrador; dá o resultado but não o carry; faz comparação unsigned, mas precisa de dois registradores para comparar. Portanto precisamos ao menos de uma instrução para obter e outra para testar . Duas instruções é, portanto, o mínimo prático.
Resposta
addu
\n
sltu
sltu