Gründe auf hohem Niveau
Wenn Sie darüber nachdenken, macht ein Mikroprozessor eine erstaunliche Sache: Mit ihm können Sie eine Maschine (wie eine Waschmaschine oder einen Aufzug) nehmen und einen ganzen Block von kundenspezifischen Mechanismen oder Schaltkreisen durch billiges, in Massenproduktion hergestelltes Silizium ersetzen Chip. Sie sparen viel Geld für Teile und viel Zeit für das Design.
Aber warten Sie, ein Standard- Chip, der unzählige Sonderanfertigungen ersetzt ? Es kann keinen einzigen perfekten Mikroprozessor geben, der für jede Anwendung perfekt ist. Einige Anwendungen müssen den Stromverbrauch minimieren, müssen jedoch nicht schnell sein. andere müssen schnell sein, müssen aber nicht einfach zu programmieren sein, andere müssen kostengünstig sein usw.
Wir haben also viele verschiedene "Geschmacksrichtungen" von Mikroprozessoren, jede mit ihren eigenen Stärken und Schwächen. Es ist wünschenswert, dass alle Benutzer einen kompatiblen Befehlssatz verwenden, da dies die Wiederverwendung von Code ermöglicht und es einfacher macht, Personen mit den richtigen Fähigkeiten zu finden. Der Befehlssatz wirkt sich jedoch auf die Kosten, die Komplexität, die Geschwindigkeit, die Benutzerfreundlichkeit und die physischen Einschränkungen des Prozessors aus. Daher haben wir einen Kompromiss: Es gibt einige "Mainstream" -Befehlssätze (und viele kleinere) und In jedem Befehlssatz gibt es viele Prozessoren mit unterschiedlichen Eigenschaften.
Oh, und wenn sich die Technologie ändert, ändern sich all diese Kompromisse, sodass sich Anweisungssätze entwickeln, neue entstehen und alte sterben. Selbst wenn es einen "besten" Befehlssatz von heute gäbe, könnte es nicht in 20 Jahren sein.
Hardware-Details
Die wahrscheinlich größte Entwurfsentscheidung in einem Befehlssatz ist die Wortgröße , dh wie groß eine Zahl ist, die der Prozessor "natürlich" manipulieren kann. 8-Bit-Prozessoren verarbeiten Zahlen von 0 bis 255, während 32-Bit-Prozessoren Zahlen von 0 bis 4.294.967.295 verarbeiten. Code, der für einen entwickelt wurde, muss für einen anderen komplett überarbeitet werden.
Es geht nicht nur darum, Anweisungen von einem Befehlssatz in einen anderen zu übersetzen. Ein völlig anderer Ansatz kann in einem anderen Befehlssatz vorzuziehen sein. Auf einem 8-Bit-Prozessor kann beispielsweise eine Nachschlagetabelle ideal sein, während auf einem 32-Bit-Prozessor eine arithmetische Operation für denselben Zweck besser wäre.
Es gibt andere Hauptunterschiede zwischen Befehlssätzen. Die meisten Anweisungen lassen sich in vier Kategorien einteilen:
- Berechnung (Arithmetik und Logik)
- Kontrollfluss
- Datentransfer
- Prozessorkonfiguration
Prozessoren unterscheiden sich darin, welche Art von Berechnungen sie ausführen können und wie sie sich dem Kontrollfluss, der Datenübertragung und der Prozessorkonfiguration nähern.
Beispielsweise können einige AVR-Prozessoren weder multiplizieren noch dividieren. Während alle x86-Prozessoren können. Wie Sie sich vielleicht vorstellen können, kann die Eliminierung der für Aufgaben wie Multiplikation und Division erforderlichen Schaltkreise einen Prozessor einfacher und billiger machen. Diese Vorgänge können weiterhin mithilfe von Softwareroutinen ausgeführt werden, wenn sie benötigt werden.
Mit x86 können arithmetische Anweisungen ihre Operanden aus dem Speicher laden und / oder ihre Ergebnisse im Speicher speichern. ARM ist eine Load-Store-Architektur und verfügt daher nur über wenige dedizierte Anweisungen für den Speicherzugriff. Mittlerweile verfügt x86 über dedizierte Anweisungen für bedingte Verzweigungen, während ARM die bedingte Ausführung praktisch aller Anweisungen ermöglicht . ARM ermöglicht auch das Durchführen von Bitverschiebungen als Teil der meisten arithmetischen Anweisungen. Diese Unterschiede führen zu unterschiedlichen Leistungsmerkmalen, Unterschieden im internen Design und den Kosten der Chips sowie Unterschieden in den Programmiertechniken auf Assemblersprachenebene.
Fazit
Der Grund, warum es unmöglich ist, eine universelle Assemblersprache zu haben, ist, dass man den Code neu entwerfen muss, um Assembler-Code von einem Befehlssatz in einen anderen zu konvertieren - etwas, das Computer noch nicht können.