Razões de alto nível
Quando você pensa sobre isso, um microprocessador faz uma coisa incrível: permite pegar uma máquina (como uma máquina de lavar ou um elevador) e substituir um pedaço inteiro de design personalizado mecanismos ou circuitos com uma barata, o silício produzido em massa lasca. Você economiza muito dinheiro em peças e muito tempo em design.
Mas espere, um chip padrão , substituindo inúmeras configurações personalizadas designs ? Não pode haver um único microprocessador perfeito para todas as aplicações. Alguns aplicativos precisam minimizar o uso de energia, mas não precisam ser rápidos; outros precisam ser rápidos, mas não precisam ser fáceis de programar, outros precisam ser de baixo custo etc.
Portanto, temos muitos "sabores" diferentes de microprocessador, cada um com suas próprias forças e fraquezas. É desejável que todos eles usem um conjunto de instruções compatível, pois isso permite a reutilização de código e facilita a localização de pessoas com as habilidades certas. No entanto, o conjunto de instruções não afetar o custo, complexidade, velocidade, facilidade de uso e limitações físicas do processador, e por isso temos um compromisso: há algumas "mainstream" conjuntos de instruções (e muitos outros menores), e dentro de cada conjunto de instruções, existem muitos processadores com características diferentes.
Ah, e à medida que a tecnologia muda, todas essas trocas são alteradas, assim os conjuntos de instruções evoluem, novos surgem e os antigos morrem. Mesmo se houvesse um "melhor" conjunto de instruções de hoje, talvez não seja daqui a 20 anos.
Detalhes de hardware
Provavelmente, a maior decisão de design em um conjunto de instruções é o tamanho da palavra , ou seja, qual o número que o processador pode "naturalmente" manipular. Os processadores de 8 bits lidam com números de 0 a 255, enquanto os de 32 bits lidam com números de 0 a 4.294.967.295. O código projetado para um precisa ser completamente repensado para outro.
Não se trata apenas de traduzir instruções de uma instrução definida para outra. Uma abordagem completamente diferente pode ser preferível em um conjunto de instruções diferente. Por exemplo, em um processador de 8 bits, uma tabela de pesquisa pode ser ideal, enquanto em um processador de 32 bits uma operação aritmética seria melhor para a mesma finalidade.
Existem outras grandes diferenças entre os conjuntos de instruções. A maioria das instruções se enquadra em quatro categorias:
- Computação (aritmética e lógica)
- Controle de fluxo
- Transferência de dados
- Configuração do processador
Os processadores diferem em que tipo de computação eles podem executar, bem como em sua abordagem do fluxo de controle, transferência de dados e configuração do processador.
Por exemplo, alguns processadores AVR não podem se multiplicar nem dividir; enquanto todos os processadores x86 podem. Como você pode imaginar, a eliminação do circuito necessário para tarefas como multiplicação e divisão pode tornar um processador mais simples e mais barato; essas operações ainda podem ser executadas usando rotinas de software, se forem necessárias.
O x86 permite instruções aritméticas para carregar seus operandos da memória e / ou salvar seus resultados na memória; O ARM é uma arquitetura de armazenamento de carga e, portanto, possui apenas algumas instruções dedicadas para acessar a memória. Enquanto isso, o x86 tem instruções de ramificação condicional dedicadas, enquanto o ARM permite praticamente todas instruções sejam executadas condicionalmente. Além disso, o ARM permite a troca de bits como parte da maioria das instruções aritméticas. Essas diferenças levam a diferentes características de desempenho, diferenças no design interno e no custo dos chips e diferenças nas técnicas de programação no nível da linguagem assembly.
Conclusão
A razão pela qual é impossível ter uma linguagem assembly universal é que, para converter adequadamente o código do assembly de um conjunto de instruções para outro, é necessário projetar o código novamente - algo que os computadores ainda não podem fazer.