A palavra de instrução do MIPS tem 2 endereços de registradores de 5 bits cada. Como o MIPS consegue endereçar endereços de memória com valor maior que 32 ?

Passo 1

O enunciado pergunta: “Como o MIPS consegue endereçar endereços de memória com valor maior que 32?” (ou seja, maiores do que o número 32 que aparece relacionado aos bits de endereço de registrador). As informações relevantes dadas ou implícitas no enunciado:
  • A instrução MIPS tem campos de endereço de registrador de 5 bits cada (portanto cada campo pode identificar 2^5=32 registradores distintos).
  • Queremos entender como, mesmo com campos de apenas 5 bits, o processador acessa endereços de memória cujo valor numérico é bem maior (por exemplo endereços de 32 bits).
  • Não há figura nem outros dados fornecidos.

Passo 2

Entendimento básico (sem resolver ainda): o campo de 5 bits nas instruções serve para selecionar qual registrador vai ser usado, não para conter o próprio endereço de memória. Ou seja:
  • Cada campo de 5 bits identifica um registrador do arquivo de registradores (um índice entre 0 e 31).
  • Cada registrador em MIPS é largo \,32 bits (no MIPS32), ou seja guarda um valor de 32 bits que pode ser usado como endereço de memória.
    Explicação curta do porquê isso importa: selecionar um registrador com 5 bits não limita o tamanho do valor que esse registrador guarda — o registrador pode conter um número de até \,32 bits.

Passo 3

Como as instruções load/store formam o endereço efetivo: formato I-type (ex.: \texttt{lw}, \texttt{sw}) e cálculo do endereço.
  • Formato genérico tem campos: opcode (6 bits), \text{rs} (5 bits), \text{rt} (5 bits), immediate (16 bits).
  • A fórmula usada para obter o endereço efetivo (EA) é:
\text{EA} = \text{Reg}[\text{rs}] + \operatorname{sign\_ext}(\text{immediate}_{16})
onde:
  • \text{Reg}[\text{rs}] é o conteúdo de 32 bits do registrador apontado pelo campo de 5 bits \text{rs},
  • \operatorname{sign\_ext}(\text{immediate}_{16}) é o valor de 16 bits da instrução estendido para 32 bits com sinal (intervalo -32768 a 32767).
  • Conclusão: o endereço final é um valor de 32 bits produzido somando um conteúdo de registrador de 32 bits com um deslocamento de 16 bits. Portanto podemos referenciar endereços grandes se o registrador já contém a parte alta do endereço.

Passo 4

Como colocar um endereço de 32 bits em um registrador (método prático usado no MIPS): instruções \texttt{lui}, \texttt{ori} e pseudo-instrução \texttt{la}.
  • \texttt{lui} (load upper immediate) carrega os 16 bits altos de um registrador e zera os 16 baixos:
\text{Reg}[r] \leftarrow (\text{immed}_{16}) \ll 16.
  • Depois pode-se usar \texttt{ori} ou \texttt{addi} para colocar os 16 bits baixos:
\text{Reg}[r] \leftarrow \text{Reg}[r] \;|\; (\text{low\_16}).
  • A pseudo-instrução \texttt{la} (load address) do montador expande para estas instruções quando necessário.

Passo 5

Exemplo concreto passo a passo (para fixar): suponha que queremos acessar o endereço \,0x10010010.
  1. Carregar os 16 bits altos \,0x1001 em \$t0:
\texttt{lui }\$t0,\,0x1001 \quad\Rightarrow\quad \text{Reg}[\$t0]=0x10010000.
  1. Somar o deslocamento baixo \,0x0010 para formar o endereço completo (duas opções):
  • usar \texttt{ori}:
\texttt{ori }\$t0,\,\$t0,\,0x0010 \quad\Rightarrow\quad \text{Reg}[\$t0]=0x10010010.
  • ou manter \texttt{Reg}[\$t0]=0x10010000 e usar o deslocamento imediato da carga:
\texttt{lw }\$t1,\,16(\$t0)
que implementa \text{EA} = 0x10010000 + 16 = 0x10010010.
3. Observação: o montador pode transformar \texttt{la }\$t0,0x10010010 em \texttt{lui}/ \texttt{ori} automaticamente.

Passo 6

Por que os 5 bits são suficientes e não limitam o endereço:
  • Os 5 bits apenas escolhem qual dos 32 registradores será usado. O valor do endereço está no registrador (e esse valor tem 32 bits); os campos na instrução não precisam conter o endereço inteiro.
  • Assim, mesmo endereços muito grandes (até \,2^{32}-1 em MIPS32) são acessíveis porque o conteúdo do registrador fornece os bits altos e o imediato dá os bits baixos ou um pequeno deslocamento.

Passo 7

Nota sobre variações e limites:
  • Em MIPS32 o tamanho de palavra e dos registradores é 32 bits; em MIPS64 os registradores são 64 bits e o mesmo princípio vale com maiores larguras.
  • O campo immediate de 16 bits limita o deslocamento direto, mas isso é contornado carregando a base completa no registrador (com \texttt{lui} / \texttt{ori} / pseudo-instruções).
  • Em sistemas com memória maior do que o espaço de endereçamento do ISA, entrariam técnicas de gerenciamento (MMU, segmentos, etc.), mas esse é outro tópico.

Resposta

Porque os 5 bits selecionam apenas qual registrador (entre 32) será usado; o próprio registrador guarda um valor de endereço com largura completa ( 32 bits em MIPS32), e a instrução forma o endereço efetivo somando esse conteúdo de 32 bits com um imediato de 16 bits (sign-extended). Para criar endereços de 32 bits o montador/instruções usam sequências como \texttt{lui} + \texttt{ori} (ou \texttt{lui} + deslocamento) para carregar a parte alta e baixa do endereço no registrador.

Exercícios relacionados