Considere um microprocessador de 32 bits hipotético com instruções de 32 bits, compostas de dois campos: o primeiro byte contém o opcode e o restante, o operando imediato ou o endereço de um operando.
a. Qual é a capacidade de memória máxima endereçável diretamente (em bytes)?
b. Discuta o impacto sobre a velocidade do sistema se o barramento do microprocessador tiver
  1. um barramento de endereço local de 32 bits e um barramento de dados local de 16 bits, ou
  2. um barramento de endereço local de 16 bits e um barramento de dados local de 16 bits.
    c. Quantos bits são necessários para o contador de programa e o registrador de instrução?

Passo 1

O enunciado dá as seguintes informações e pede três coisas claras:
  • Informação 1: É um microprocessador “de 32 bits hipotético” cujas instruções têm tamanho de 32 bits.
  • Informação 2: Cada instrução é composta de dois campos: o primeiro byte (ou seja, 8 bits) contém o opcode; o restante da instrução (os 24 bits que sobram) contém ou um operando imediato ou o endereço de um operando. Portanto o campo de endereço/imediato tem 24 bits.
  • Informação 3: Há duas configurações de barramento a serem discutidas:
    1. barramento de endereço local de 32 bits e barramento de dados local de 16 bits;
    2. barramento de endereço local de 16 bits e barramento de dados local de 16 bits.
  • O que se pede:
    a. Calcular a capacidade de memória máxima endereçável diretamente (em bytes).
    b. Discutir o impacto sobre a velocidade do sistema para as duas configurações de barramento listadas.
    c. Dizer quantos bits são necessários para o contador de programa (PC) e para o registrador de instrução (IR).
Não vou resolver nada aqui; apenas organizei o que o enunciado dá e o que é pedido. Agora vou desenvolver passo a passo.

Passo 2

Conceitos fundamentais que vamos usar (aulas rápidas e intuitivas):
  • Endereçamento byte-a-byte: quando falamos que um processador endereça memória por byte, cada endereço aponta para um byte distinto. Com n bits de endereço podemos endereçar 2^{n} bytes distintos. Exemplo simples: com 8 bits de endereço endereçamos 2^{8}=256 bytes.
  • Campo de endereço em uma instrução: se a instrução carrega um endereço direto no seu campo de operando e esse campo tem m bits, então, por esse modo de endereçamento direto, ela pode referir até 2^{m} endereços distintos (novamente, assumindo endereçamento por byte).
  • Barramento de endereço vs. registrador PC: o barramento de endereço determina quantos endereços a placa/memória consegue acessar fisicamente em um ciclo de barramento; o contador de programa (PC) precisa ter largura suficiente para conter os endereços que o processador irá gerar/usar. Se o barramento de endereço for mais largo que o campo de endereço da instrução, o processador pode ter modos para construir endereços maiores (ex.: carregando bits altos em registradores), mas o campo imediato direto fica limitado ao seu tamanho.
  • Barramento de dados: define quantos bits são transferidos por ciclo entre CPU e memória. Se a CPU usa palavras de 32 bits mas o barramento de dados é de 16 bits, cada palavra de 32 bits exige duas transferências de barramento (normalmente dois ciclos de leitura/escrita).
Com esses conceitos claros, vamos aplicar ao problema.

Passo 3

O campo de endereço disponível dentro da instrução tem 24 bits (o enunciado disse: primeiro byte é opcode; sobraram 32-8=24 bits para imediato/endereços). Assumindo endereçamento por byte, a capacidade de memória máxima endereçável diretamente por esse campo é
2^{24}
bytes. Vamos calcular e converter para unidades mais amigáveis:
  • 2^{10}=1024 (aprox. 1 KiB), 2^{20}=1\,048\,576 (aprox. 1 MiB).
  • Assim 2^{24}=2^{4}\cdot 2^{20}=16\cdot 1\,048\,576=16\,777\,216 bytes.
    Em termos de mebibytes (MiB):
2^{24}=16\\ \text{MiB}.
Portanto a resposta numérica para (a) é 2^{24}=16\,777\,216 bytes (ou 16 MiB).

Passo 4

Antes de analisar os dois casos específicos, vamos fixar o que significa cada largura de barramento para o desempenho:
  • Largura do barramento de endereço (A bits): determina o espaço de endereçamento físico por ciclo. Com A bits podemos gerar endereços de 2^{A} posições (bytes se o endereçamento for por byte).
  • Largura do barramento de dados (D bits): quantos bits a memória entrega/recebe em uma única transferência. Para transferir uma palavra de W bits, precisamos de \lceil W/D \rceil transferências de dados (ciclos de barramento).
  • Cada transferência de dados costuma envolver colocar o endereço no barramento, aguardar a memória responder e mover os dados — ou seja, cada transferência tem sobrecarga de tempo. Logo, se você precisa de 2 transfers em vez de 1, normalmente dobra o tempo de leitura/escrita de uma palavra (aproximação prática).
Com isso, vamos analisar os dois casos dando exemplos concretos de fetch de instrução e de acesso a um dado de 32 bits.

Passo 5

O que isso significa:
  • Barramento de endereço 32 bits permite endereçar até 2^{32}bytes (isto é, 4\,294\,967\,296 bytes ≈ 4 GiB) na memória física por um ciclo de barramento.
  • Barramento de dados 16 bits significa que a memória fornece 16 bits (2 bytes) por transferência de barramento.
Impacto sobre a velocidade — exemplos práticos e explicados passo a passo:
  1. Fetch da instrução (instrução tem 32 bits):
    • Como o barramento de dados é de 16 bits, cada fetch de instrução de 32 bits exige \lceil 32/16 \rceil = 2transferências de barramento (tipicamente dois ciclos de memória).
    • Em comparação, se o barramento de dados fosse de 32 bits, seria só uma transferência. Logo, o fetch de instrução fica aproximadamente duas vezes mais lento em relação ao caso ideal de 32-bit data bus (ignorando latências adicionais, pipelining, burst transfers etc.).
  2. Acesso a dados de 32 bits (load/store):
    • Mesmo raciocínio: cada load/store de 32 bits necessita de 2 transferências de 16 bits, dobrando o tempo de memória para operações de palavra completa.
    • Se muitas instruções dependem de acessos à memória (memoria-bound), o throughput do sistema cai aproximadamente pela metade nessas operações.
  3. Vantagem: barramento de endereço 32 bits permite trabalhar com um espaço de memória físico grande sem artifícios, o que é bom para programas grandes ou memória mapeada. Porém, a largura de dados reduzida é o gargalo de throughput.
Resumo qualitativo para (b.1):
  • Capacidade de memória suportada pelo barramento: até 2^{32} bytes.
  • Penalidade de performance: fetchs e transfers de palavras de 32 bits exigem duas transferências no barramento de dados, aumentando latência e diminuindo throughput de memória aproximadamente pela metade para operações de 32 bits (comparado a um barramento de dados de 32 bits).

Passo 6

O que isso significa:
  • Barramento de endereço 16 bits permite endereçar até 2^{16}=65\,536bytes, isto é, 64 KiB (kilobytes).
  • Barramento de dados 16 bits igual ao caso anterior: 2 transfers para cada palavra de 32 bits.
Impacto e problemas práticos:
  1. Limitação de memória física direta:
    • O barramento de endereço de 16 bits limita o espaço endereçável a 64 KiB. Isso é pequeno para praticamente qualquer sistema moderno; muitos programas e dados não caberiam.
    • Observação importante: a instrução contém um campo de endereço de 24 bits. Há uma contradição prática entre o campo de endereço da instrução (poderia especificar até 2^{24} endereços) e o barramento físico de endereço (apenas 2^{16} endereços). Como resolver isso na prática? O processador teria que usar técnicas extras (por exemplo, registradores de banco alto com instruções adicionais para compor o endereço completo, segmentação, paginar, ou efetuar múltiplas operações para acessar a parte alta dos bits do endereço). Tudo isso adiciona overhead (mais instruções, mais ciclos) e deixa o sistema mais lento e mais complexo.
  2. Fetch de instrução e acesso a dados de 32 bits:
    • Mesmo que o endereço caiba em 16 bits, o barramento de dados de 16 bits força 2 transferências para cada instrução de 32 bits ou para cada load/store de 32 bits. Logo, essas operações são mais lentas do que num barramento de dados de 32 bits.
    • Se o código referenciar endereços maiores que 64 KiB, cada acesso implicará em passos extras (montar endereço em registradores, mudar banco/segmento etc.), multiplicando o tempo.
  3. Resumo qualitativo para (b.2):
  • Capacidade de memória suportada pelo barramento: até 2^{16}=65\,536 bytes ( 64 KiB).
  • Penalidade de performance: além da penalidade óbvia do barramento de dados de 16 bits (duas transferências por palavra de 32 bits), existe um custo funcional e de tempo muito maior quando o programa precisa acessar memória fora dos 64 KiB — porque o processador terá de usar sequências de instruções para construir endereços maiores, degradando ainda mais o desempenho e complicando compiladores/código.

Passo 7

Comparando os dois casos:
  • Caso 1 (A=32, D=16): grande espaço de endereçamento físico ( 2^{32} bytes) — bom para capacidade —, mas data throughput limitado: cada instrução/word de 32 bits exige duas transferências, reduzindo taxas de leitura/escrita de memória. Em sistemas com muito acesso à memória, o desempenho sofre.
  • Caso 2 (A=16, D=16): espaço de endereçamento muito restrito ( 2^{16}=64 KiB) — pode tornar o sistema impraticável —, e igualmente sofre com transfers duplos por palavra de 32 bits. Além disso, existe overhead extra quando se tenta usar o campo de 24 bits da instrução (porque o barramento físico só aceita 16 bits), o que torna acesso a endereços maiores ainda mais lento.
Observação prática final: o gargalo imediato de velocidade em ambos os casos é o barramento de dados de 16 bits quando o processador usa palavras de 32 bits — isso dobra o número de transfêrencias para instruções e dados de 32 bits. A largura do barramento de endereço afeta principalmente a quantidade de memória que pode ser acessada sem truques; se o endereço físico permitido for menor que o campo de endereço da instrução, haverá overhead extra para formar endereços, prejudicando ainda mais a velocidade.

Passo 8

Primeiro, o registrador de instrução (IR):
  • A instrução tem 32 bits (dado no enunciado). O IR precisa armazenar a instrução completa para que a unidade de controle faça a decodificação. Portanto o IR precisa ter exatamente
32\\ \text{bits}.
Agora, o contador de programa (PC):
  • O objetivo do PC é conter o endereço da próxima instrução (ou do byte onde está a próxima instrução) — portanto o PC precisa ter largura suficiente para endereçar todo o espaço de memória que o processador usa para buscar instruções.
  • Existem duas respostas relevantes, dependendo do que se considera “necessário”:
    1. Resposta mínima baseada no campo de endereço da instrução (endereçamento direto): como o campo de endereço direto na instrução tem 24 bits, para que a instrução possa colocar qualquer endereço imediato direto no PC (sem mecanismos adicionais), o PC precisa ter pelo menos
    24\\ \text{bits}.
    Isso permite endereçar diretamente os 2^{24} bytes que calculamos na letra (a).
    1. Resposta baseada no barramento de endereço físico: se o barramento de endereço local do processador for de 32 bits (como no caso (b.1)), o PC normalmente precisa ter 32 bits para poder dirigir o barramento de endereço sem truncamento, ou seja, para gerar qualquer endereço que o barramento possa carregar. Se o barramento de endereço for 16 bits (caso (b.2)), o PC precisaria de 16 bits para endereçar diretamente o barramento (mas isso também restringe o espaço endereçável a 2^{16} bytes, e muitas vezes o hardware usa registradores adicionais para contornar isso).
  • Em resumo prático e direto:
    • IR: 32 bits (necessário e suficiente).
    • PC: mínimo 24 bits para usar o campo de endereço direto da instrução; porém, se o barramento de endereço físico for maior (por exemplo 32 bits), o PC normalmente terá de ser 32 bits para controlar o barramento sem operações extras; se o barramento for menor ( 16 bits) o PC pode ser 16 bits mas isso impõe limitações e necessidade de técnicas adicionais.

Resposta

a) 2^{24}=16\,777\,216 bytes =16 MiB
b1) Barramento de endereço 32 bits e dados 16 bits: endereçamento físico até 2^{32} bytes (≈ 4 GiB); porém, como o barramento de dados é de 16 bits, fetch de instrução de 32 bits e operações de 32-bit requerem duas transferências de barramento, aproximando-se de redução de throughput (latência de memória) em ~2× para essas operações.
b2) Barramento de endereço 16 bits e dados 16 bits: endereçamento físico limitado a 2^{16}=65\,536 bytes ( 64 KiB); além da penalidade do barramento de dados (duas transferências por palavra de 32 bits), há overhead extra e perda de desempenho quando se tenta usar o campo de endereço de 24 bits da instrução (é preciso compor endereços em múltiplas instruções/etapas).
c) Contador de programa (PC): mínimo \,24 bits para corresponder ao campo de endereço direto da instrução; se o barramento de endereço físico for 32 bits, o PC normalmente precisa ser 32 bits (se for 16 bits, o PC teria 16 bits mas isso impõe limitações). Registrador de instrução (IR): 32 bits.

Exercícios relacionados