Onde o resultado de MULT $t0, $t1 é armazenado? Qual instrução extrai o resultado para registradores normais?
Passo 1
O que o enunciado pergunta e o que sabemos:
- Pergunta 1: Onde o resultado da instrução MULT
é armazenado? - Pergunta 2: Qual instrução extrai esse resultado para registradores normais (de uso geral)?
Informações relevantes que já temos do enunciado: a instrução é a clássica MULT do conjunto de instruções MIPS que multiplica dois registradores de 32 bits.
Passo 2
Entendendo o que a instrução MULT faz (explicação conceitual):
- Quando se multiplica dois inteiros de 32 bits, o resultado pode precisar de até 64 bits para ser representado sem perda.
- A instrução MULT em MIPS realiza uma multiplicação inteira (signed) de 32 bits por 32 bits e produz um produto de 64 bits.
- Em MIPS esse produto de 64 bits NÃO é colocado diretamente em um registrador geral: ele é armazenado em registradores especiais chamados HI e LO. Expliquei isso porque é o ponto central da pergunta.
Passo 3
O que são HI e LO e como eles guardam o resultado (detalhes práticos):
- HI e LO são dois registradores especiais (cada um com 32 bits) no banco de registradores do processador MIPS.
- A convenção de armazenamento do produto é:
- os 32 bits menos significativos (low 32 bits) do produto vão para o registrador LO;
- os 32 bits mais significativos (high 32 bits) do produto vão para o registrador HI.
- Em outras palavras: o produto de 64 bits fica distribuído como (HI:LO) — HI guarda a parte alta, LO guarda a parte baixa.
Passo 4
Quais instruções pegam o conteúdo de HI/LO e colocam em registradores normais (a resposta direta com explicação):
- Para extrair a parte baixa (conteúdo de LO) para um registrador de uso geral usa-se a instrução MFLO. Por exemplo: MFLO
copia o conteúdo de LO para . - Para extrair a parte alta (conteúdo de HI) usa-se a instrução MFHI. Por exemplo: MFHI
copia o conteúdo de HI para . - Essas duas são as instruções “move from” que transferem de registradores especiais para registradores gerais.
Passo 5
Exemplo prático passo a passo (para você poder reproduzir na prova):
- Suponha que antes de multiplicar temos valores em
e . - Código MIPS típico:
- MULT
# faz a multiplicação; produto fica em HI e LO - MFLO
# pega os low 32 bits (parte baixa) para - MFHI
# pega os high 32 bits (parte alta) para
- MULT
- Interpretação: após MFLO e MFHI,
contém a parte baixa do produto e contém a parte alta. Se o produto couber em 32 bits, a parte alta (em HI) será zero (ou sinal estendido dependendo do caso signed), mas normalmente basta usar MFLO se só se quer o resultado truncado para 32 bits.
Passo 6
Observações importantes que costumam cair na prova ou causar dúvidas:
- MULT é para multiplicação com sinal. Para multiplicação sem sinal usa-se MULTU; o mecanismo de armazenamento (HI/LO) e a extração (MFHI/MFLO) permanecem iguais.
- Se você só precisa do produto menor (como em muitas operações que ignoram overflow), basta fazer MFLO e usar só a parte baixa. Se precisa do produto completo de 64 bits, precisa usar MFHI e MFLO e tratá-los como duas palavras de 32 bits.
- Também existem instruções MTHI e MTLO que movem valores de registradores gerais para HI e LO (úteis em rotinas mais baixas ou manipulação de resultados).
Passo 7
Exemplo numérico simples para fixar (mostrando o fluxo):
- Suponha
e . Então MULT produz o produto 6, que em 64 bits é 0x0000000000000006 . - LO ficará com 0x00000006 e HI com 0x00000000. Após MFLO
teremos . MFHI resultará em . - Isso mostra como usar MFLO/MFHI para obter os valores em registradores normais.
Resposta
O resultado de MULT
é armazenado nos registradores especiais HI (parte alta) e LO (parte baixa).
As instruções que extraem o resultado para registradores normais são MFLO (para pegar LO) e MFHI (para pegar HI).
As instruções que extraem o resultado para registradores normais são MFLO (para pegar LO) e MFHI (para pegar HI).