O Zilog8001 de 16 bits possui o seguinte formato geral da instrução:
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
Modo
Opcode
Operando 2
0
O campo modo define como localizar operandos a partir dos campos operando. O campo w/b é usado em certas instruções para determinar se os operandos são bytes ou palavras de 16 bits. O campo operando 1 pode (dependendo do conteúdo do campo modo) definir um dos 16 registra-dores de uso geral. O campo operando 2 pode definir qualquer registrador de uso geral exceto registrador O. Quando o campo operando 2 for todo zero, cada um dos opcodes originais assume um novo significado.
Quantos opcodes são fornecidos em Z8001?
Sugira uma maneira eficiente para prover mais opcodes e indique a negociação envolvida.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
| Modo | Opcode |
|
Operando 2 | 0 |
Quantos opcodes são fornecidos em Z8001?
Sugira uma maneira eficiente para prover mais opcodes e indique a negociação envolvida.
Passo 1
O enunciado pede duas coisas claras:
- Quantos opcodes são fornecidos no Z8001?
- Sugerir uma maneira eficiente para prover mais opcodes e indicar a negociação (trade‑offs) envolvida.
Informações dadas pelo enunciado (listei tudo que nos foi dado e que vamos usar):
- A instrução tem formato geral de 16 bits.
- Há um campo chamado “modo”.
- Há um campo chamado “Opcode”.
- Há um bit
(usado para escolher byte/word). - Há um campo “operando 1” que, dependendo do modo, pode definir um dos
registradores de uso geral (logo esse campo precisa poder endereçar valores). - Há um campo “operando 2” que pode definir qualquer registrador de uso geral exceto o registrador
; além disso, quando o campo “operando 2” for todo zero, cada um dos opcodes originais assume um novo significado (ou seja, a combinação opcode + operando2=0 dá um opcode alternativo). - O enunciado supõe que a descrição do formato é suficiente (não falta figura necessária).
Observação importante sobre terminologia que vou usar mais adiante:
- Quando eu digo “valor do campo opcode” refiro‑me a uma combinação de bits dentro do campo Opcode.
- Quando eu digo “opcode distinto” refiro‑me a uma operação de máquina única reconhecível pelo decodificador (p. ex. ADD, SUB, LOAD imediata, etc.), quer venha do campo opcode sozinho quer de combinações especiais como operando2=0 que mudam o significado.
Passo 2
Definindo tamanhos de campo a partir das informações óbvias (isso é um passo de modelagem para poder contar combinações):
- O campo “operando 1” precisa poder apontar para
registradores. Para endereçar valores precisamos de bits porque . Logo o campo “operando 1” tem bits. - O campo “operando 2” também codifica registradores; mesmo que uma entrada (o registrador
) não seja usada, precisamos de bits para representar até padrões binários possíveis (um desses padrões será o padrão todo-zero, que o enunciado declara ter significado especial). Logo o campo “operando 2” tem bits. - O bit
ocupa bit. - Restam
bits para dividir entre os campos “Modo” e “Opcode”. O enunciado não dá explicitamente quantos bits tem cada um, mas é comum reservar alguns poucos bits para “Modo” e o restante para o “Opcode”. Uma divisão plausível (e suficiente para contar opcodes) é: “Modo” = bits e “Opcode” = bits, porque . Esta divisão é consistente com a afirmação de que o campo “operando 1” pode definir registradores “dependendo do modo” (o modo usa bits próprios para escolher como interpretar operando1). - Resumo dos tamanhos assumidos (baseados nas informações do enunciado e na necessidade de codificar 16 registradores):
- “Modo”:
bits. - “Opcode”:
bits. - “
”: bit. - “Operando 2”:
bits. - “Operando 1”:
bits.
- “Modo”:
Nota pedagógica rápida: quando você distribui bits num formato de instrução, a soma dos tamanhos dos campos tem de dar o tamanho total da instrução (aqui
). Para codificar
possibilidades num campo, precisa de pelo menos
bits; por exemplo
possibilidades exigem
bits porque
.
Passo 3
Contando as possibilidades básicas:
- O campo “Opcode” com
bits permite valores diferentes para o campo opcode puro. Vou chamar isso de “valores de opcode primários”. - O campo “Operando 2” tem
bits e portanto tem padrões binários possíveis. Segundo o enunciado, quando esse campo for todo-zero (um desses padrões) cada código de opcode primário “assume um novo significado” — ou seja, a combinação (valor de opcode primário, operando2=0000) oferece uma alternativa que é tratada como outro opcode distinto. Para os outros padrões do campo operando2 (que endereçam registradores reais), a instrução representa variantes do mesmo opcode que dependem do registrador destino/fonte. - Portanto, para cada um dos
valores do campo opcode existem interpretações distintas se contarmos as variantes produzidas pelos padrões do campo operando2 (os registros mais a forma especial quando operando2=0000).
Cálculo do número total de opcodes distintos codificáveis por essa combinação direta:
Comentário didático: aqui estamos contando “opcodes distintos” como todas as operações que o decodificador pode identificar diretamente a partir dos bits dessa palavra de instrução (incluindo o caso especial operando2=0000, que o enunciado diz que muda o significado). Em outras palavras, o par (campo opcode, padrão operando2) fornece até
combinações que o microcódigo/decodificador pode mapear para 256 operações diferentes.
Passo 4
Interpretação alternativa curta (para evitar confusões na hora da prova):
- Se a pergunta fosse apenas “quantos valores distintos o campo Opcode pode assumir?”, a resposta seria
. - Mas o enunciado sublinha que operando2=0000 dá um novo significado a cada opcode — isso amplia o número de instruções distintas que podem ser codificadas diretamente para
. Em problemas de arquitetura é importante esclarecer qual definição o enunciado pede: valor do campo vs. operações distintas. Pelo contexto da questão (querem saber “quantos opcodes são fornecidos”), a interpretação prática — número de operações distintas codificáveis — é a mais útil e é a que vamos adotar: .
Passo 5
Sugestão prática e eficiente para prover mais opcodes (método):
- Use um esquema de escape (prefixo) aproveitando o padrão reservado do campo “operando 2” (o padrão
) como sinal de que esta instrução é uma instrução estendida cuja operação real está codificada em um segundo byte/palavra que vem imediatamente após a primeira palavra da instrução. Esquematicamente: - Se o campo “operando 2”
: instrução normal (uma palavra). - Se o campo “operando 2”
: a decodificação lê uma palavra/byte adicional e usa esse valor adicional como espaço de opcode estendido (por exemplo, mais bits extra, ou até – bits dependendo de quanta extensão você quer).
- Se o campo “operando 2”
- Exemplo numérico simples: usar o padrão operando2=0000 como escape e então ler mais
bits extras dá novas operações para cada valor de opcode primário ou, se preferir, pode formar um novo opcode estendido combinando o byte estendido com o campo opcode primário para obter muito mais combinações.
Passo 6
Negociação (trade‑offs) dessa solução — o que você ganha e o que você perde:
- Ganhos:
- Aumenta significativamente o espaço de opcode sem modificar os registradores nem aumentar o tamanho do campo opcode original.
- Compatível com decodificadores: instruções normais permanecem de tamanho curto; só as instruções estendidas ficam maiores.
- Simples de implementar no decodificador (um teste do padrão 0000 seguida por um fetch extra).
- Perdas / custos:
- Perda do padrão
em operando2 como um registrador normal: você “perde” uma codificação de registrador direto (mas como o enunciado já diz que operando2 nunca define o registrador , e considerando que um padrão já é tratado como especial, é um custo conhecido). - Instruções estendidas ficam mais longas (fetch extra) → custo em tempo de execução e em densidade de código quando usadas frequentemente.
- Aumenta a complexidade do pipeline e do decodificador (suporte a instr. de comprimento variável, pré-busca de palavra extra, tratamento de exceções e alinhamento).
- Possível impacto em caches e na predição de instrução (porque mais instruções têm tamanho variável).
- Perda do padrão
- Contrapartida de projeto: você precisa negociar entre a necessidade de muitas operações nativas (maior conjuntos de instruções) e a simplicidade do decodificador / desempenho médio. Normalmente a solução aceita é permitir um espaço de opcode estendido via escape, mantendo as instruções mais comuns de tamanho curto e reservando opcodes estendidos para instruções menos frequentes ou mais complexas.
Passo 7
Estimativa concreta de aumento de espaço usando a técnica de escape:
- Se você usa operando2=0000 como escape e depois lê
bits adicionais, o número total de opcodes codificáveis passa a ser, conservadoramente:
Mas como quando operando2=0000 você substitui as
combinações anteriores por uma interpretação estendida, uma forma mais prática é:
- Instruções normais (operando2
): (opcode) (registros) . - Instruções com escape (operando2=0000) que agora usam um byte extra de opcode:
possibilidades estendidas. - Soma total =
operações distintas codificáveis (um grande salto em relação a ).
Observação: esses números dependem de como você decide interpretar o conteúdo extra (se o byte extra substitui completamente a combinação anterior ou é combinado com ela). O exemplo acima mostra um cenário em que o escape abre um espaço debits por cada valor do opcode primário.
Passo 8
Resumo pedagógico e dica para prova
- Na prova: antes de contar, identifique claramente o que cada campo precisa codificar (quantos registradores, se há padrões reservados, etc.). Conte combinações como produto do número de estados de cada campo relevante.
- Ao propor extensões, explique sempre o mecanismo (escape/prefix), quantos bits você ganha e liste explicitamente os trade‑offs (latência média, complexidade do decodificador, perda de alguma codificação direta de registrador).
- Se tiver tempo, escreva um pequeno diagrama de fluxo do decodificador: se operando2=0000 -> fetch byte extra -> decodificar com tabela estendida; senão -> instrução curta normal. Isso comunica claramente a solução e os custos.
Resposta
Use o padrão
como um código de escape e ler uma palavra/byte adicional para formar opcodes estendidos; negociação: ganha muito espaço de opcode (p. ex. mais
ou muito mais possibilidades), mas perde o padrão
como operando normal, aumenta o tamanho médio das instruções quando usadas e complica o decodificador/pipeline.