Raisons de haut niveau
Quand on y pense, un microprocesseur fait une chose étonnante: il vous permet de prendre une machine (comme une machine à laver ou un ascenseur), et de remplacer un morceau entier de sur mesure des mécanismes ou des circuits avec un pas cher, produit en masse silicium puce. Vous économisez beaucoup d'argent sur les pièces et beaucoup de temps sur la conception.
Mais attendez, une puce standard , remplaçant d'innombrables personnalisées designs ? Il ne peut pas y avoir un seul microprocesseur parfait qui soit parfait pour chaque application. Certaines applications doivent réduire la consommation d'énergie mais n'ont pas besoin d'être rapides; d'autres doivent être rapides mais ne doivent pas être faciles à programmer, d'autres doivent être peu coûteux, etc.
Nous avons donc de nombreuses «saveurs» différentes de microprocesseur, chacune avec ses propres forces et faiblesses. Il est souhaitable qu'ils utilisent tous un jeu d'instructions compatible, car cela permet la réutilisation du code et facilite la recherche de personnes possédant les bonnes compétences. Cependant, le jeu d'instructions ne n'influent sur le coût, la complexité, la rapidité, la facilité d'utilisation et des contraintes physiques du processeur, et nous avons donc un compromis: il quelques jeux d'instructions « mainstream » (et beaucoup de ceux mineurs), et dans chaque jeu d'instructions, il existe de nombreux processeurs avec des caractéristiques différentes.
Oh, et à mesure que la technologie change, tous ces compromis changent, donc les ensembles d'instructions évoluent, de nouveaux émergent et les anciens meurent. Même s'il y avait un «meilleur» ensemble d'instructions d'aujourd'hui, ce ne serait peut-être pas dans 20 ans.
Détails du matériel
La plus grande décision de conception dans un jeu d'instructions est probablement la taille des mots , c'est-à-dire le nombre que le processeur peut manipuler "naturellement". Les processeurs 8 bits traitent les nombres de 0 à 255, tandis que les processeurs 32 bits traitent les nombres de 0 à 4 294 967 295. Le code conçu pour l'un doit être complètement repensé pour l'autre.
Il ne s'agit pas seulement de traduire des instructions d'un ensemble d'instructions à un autre. Une approche complètement différente peut être préférable dans un ensemble d'instructions différent. Par exemple, sur un processeur 8 bits, une table de recherche peut être idéale, tandis que sur un processeur 32 bits, une opération arithmétique serait préférable dans le même but.
Il existe d'autres différences majeures entre les jeux d'instructions. La plupart des instructions se répartissent en quatre catégories:
- Calcul (arithmétique et logique)
- Flux de contrôle
- Transfert de données
- Configuration du processeur
Les processeurs diffèrent dans le type de calculs qu'ils peuvent effectuer, ainsi que dans leur approche du flux de contrôle, du transfert de données et de la configuration du processeur.
Par exemple, certains processeurs AVR ne peuvent ni se multiplier ni se diviser; alors que tous les processeurs x86 le peuvent. Comme vous pouvez l'imaginer, l'élimination des circuits requis pour des tâches comme la multiplication et la division peut rendre un processeur plus simple et moins cher; ces opérations peuvent toujours être effectuées à l'aide de routines logicielles si elles sont nécessaires.
x86 permet aux instructions arithmétiques de charger leurs opérandes de la mémoire et / ou de sauvegarder leurs résultats en mémoire; ARM est une architecture de magasin de charge et n'a donc que quelques instructions dédiées pour accéder à la mémoire. Pendant ce temps, x86 a des instructions de branchement conditionnel dédiées, tandis que ARM permet à pratiquement toutes les instructions d'être exécutées sous condition. En outre, ARM permet d'effectuer des décalages de bits dans le cadre de la plupart des instructions arithmétiques. Ces différences entraînent des caractéristiques de performances différentes, des différences dans la conception interne et le coût des puces, et des différences dans les techniques de programmation au niveau du langage d'assemblage.
Conclusion
La raison pour laquelle il est impossible d'avoir un langage d'assemblage universel est que, pour convertir correctement le code d'assemblage d'un jeu d'instructions à un autre, il faut reconcevoir le code, ce que les ordinateurs ne peuvent pas encore faire.