Porque é que o código da máquina é interpretado por microcódigo em vez de ser compilado para microcódigo?
Em algum nível, você tem que finalmente se submeter a um conjunto de portas lógicas, registros, contadores e assim por diante. O microcódigo é capaz de controlá-los diretamente com base no código da máquina que está interpretando. O próprio código da máquina pode ser feito para operar estes portões e coisas diretamente, e de fato ele faz em muitos projetos. Mas os designers de hardware também são pessoas, portanto erros são possíveis - pode haver bugs no hardware.
Microcoding permite que eles corrijam bugs de hardware facilmente, ou implementem novas instruções, para uma mudança relativamente pequena no die do processador - é apenas mais um nível de indireção que fornece algum seguro e flexibilidade. Também lhes permite implementar um determinado conjunto de instruções em diferentes hardwares, uma vez que o microcódigo cuida de lidar com as diferenças.
Microcódigo realmente é de baixo nível - ele liga diretamente alguns portões e desliga outros para rotear sinais em torno do chip. Ele é altamente dependente de hardware. Se você compilou diretamente no microcódigo, você teria que ter um compilador que levasse em conta não apenas o número exato do modelo do chip, mas a revisão exata desse modelo, e assim por diante. A microcodificação permite que todas essas diferenças sejam resolvidas pelo próprio chip, para que ele possa rodar código comum. Você pode apostar que os engenheiros também otimizaram o código, e também não é bem como um código de propósito geral - por exemplo, se você tem uma instrução que leva 2 ciclos de relógio para ser executada, as chances são que isso significa que levou 2 instruções de microcódigo. É muito duvidoso que você realmente economizaria qualquer tempo compilando diretamente no microcódigo - você ainda acabaria com uma determinada operação levando exatamente os mesmos 2 ciclos, porque isso é uma limitação de hardware - é provavelmente o melhor que consegue.
Um ponto adicional: o microcódigo não é bem o que você pensa que é. Eu não posso falar por todos os designs, mas num que eu trabalhei, o 'microcódigo' era apenas uma grande tabela. Cada coluna da tabela era 1 bit que controlava um portão em algum lugar que permitia dados em um determinado local em um barramento interno. Cada linha da tabela era um passo em uma seqüência. A instrução da máquina era desmontada e usada para chamar a linha de partida na tabela para aquela instrução. Cada ciclo de relógio apenas passava pelas linhas da tabela até chegar a uma linha final que tinha um pouco que agia como um 'goto' que apenas colocava o processador de volta no início do próximo fetch. O código era apenas um grande bitmap sequencial. Nem mesmo no modo que o código da máquina é.
Artigos semelhantes
- Em termos leigos, o que é código de byte, código de montagem, código de máquina e código fonte?
- Quais são as diferenças entre Código de Máquina, Código de Byte, Código de Objeto e Código Fonte?
- Qual é a diferença entre bytecode, código nativo, código de máquina e código de montagem?
- Há alguma forma de viajar no tempo antes da máquina ser ligada? Posso passar pela máquina a ser ligada? Como?