Jede CPU ist von Grund auf so konzipiert, dass sie einen bestimmten Befehlssatz unterstützt. Ein Befehlssatz ist ein Satz fest codierter Operationen, die die CPU ausführen kann. Diese Operationen können beispielsweise das Addieren zweier Zahlen, das Springen zu einem anderen Teil des Programms oder das Vergleichen zweier Werte sein. Jede Operation, die ein Computer ausführen kann, wird eindeutig durch einen Opcode repräsentiert.
Opcodes
Beim Ausführen eines Programms verwendet die CPU einen Programmzähler, um zu verfolgen, welche Anweisung als nächstes ausgeführt werden muss. Wenn eine Anweisung abgerufen wird, wird der Programmzähler um die Länge der Anweisung inkrementiert, so dass er auf den Beginn der nächsten Anweisung zeigt. Jede Anweisung besteht aus einem Opcode. Abhängig von der Anweisung kann sie Operanden enthalten oder nicht. Operanden können ein konstanter Wert oder ein Zeiger auf die Position eines Werts im CPU-Register oder im System-RAM sein.
Nachdem die vollständige Anweisung abgerufen wurde, muss sie decodiert werden. Dies ist der Prozess, bei dem die CPU den Opcode und alle Operanden trennt. Der decodierte Opcode wird verwendet, um bestimmte elektrische Pfade in der CPU zu aktivieren oder zu deaktivieren, die zu einem korrekten Betrieb führen.
Sobald die Anweisung dekodiert wurde, wird sie ausgeführt. Das genaue Verhalten der CPU hängt von der Operation ab. Eine Additionsoperation summiert zwei Werte zusammen. Eine Sprungoperation berechnet, wohin im Programm gesprungen werden soll. Eine Vergleichsoperation vergleicht zwei Werte. Eine NOP-Operation bleibt im Leerlauf, da NOP für No Operation steht.
Die meisten Anweisungen geben dann das Ergebnis der Operation aus. Diese Ausgabe kann zu den Prozessorregistern und, falls erforderlich, zum System-RAM gehen. Jede dieser Operationen dauert einen einzelnen Taktzyklus, um abgeschlossen zu werden.
Unzulässige Opcodes
Jede CPU-Architektur hat ihre spezifische Liste von Opcodes, die vom Hersteller veröffentlicht wird. Die Werte dieser Opcodes sind nicht unbedingt plattformübergreifend gleich, weshalb Software für unterschiedliche Architekturen kompiliert werden muss. In einigen Fällen fügt der Hersteller auch undokumentierte Opcodes hinzu. Diese werden als „illegale Opcodes“ bezeichnet. Illegale Opcodes, obwohl undokumentiert, führen bei jedem Aufruf die gleiche Funktion aus. Als undokumentierte und nicht standardmäßige Funktionen können sie jedoch durch Aktualisierungen der CPU-Architektur einfach entfernt werden.
Einige frühe Computerspiele auf dem Apple II stützten sich auf bestimmte illegale Opcodes. Sie litten dann unter Leistungs- und Stabilitätsproblemen bei der späteren Apple IIc-CPU-Revision, als der IIc die illegalen Opcodes entfernte, die die Spiele erforderten. Illegale Opcodes wurden auch in Urheberrechtsschutzkreisen als Sicherheitsmethode durch Unklarheit im Kampf gegen Piraten verwendet, die ihre Inhalte knacken. Einige illegale Opcodes sind einfach als Debugging-Tools und Fehlerbehandler gedacht.
Der x86-Befehlssatz enthält eine große Anzahl undokumentierter illegaler Opcodes. Interessanterweise werden einige davon von Intel- und AMD-CPUs geteilt, was darauf hinweist, dass sich beide Unternehmen ihres Zwecks öffentlich bewusst sind, obwohl sie nicht dokumentiert sind.
Compiler und Assembler
Die meisten Programme sind in Hochsprachen geschrieben. Diese sind relativ einfach zu lesen und verwenden oft englische Wörter oder Kurzschrift, um die Lernkurven zu minimieren. Damit ein Computer diese Programme ausführen kann, müssen sie kompiliert werden. Ein Compiler ist im Grunde ein Übersetzer. Es nimmt den High-Level-Code und wandelt ihn in Computercode um, die Anweisungen, die die CPU verstehen kann.
In einigen Sprachen ist es auch möglich, nicht kompilierten Code über ein zuvor kompiliertes Programm auszuführen, das Maschinencode on the fly generiert. Assembly ist eine Low-Level-Programmiersprache, die Kurzschrift verwendet, um Entwicklern direkte Sichtbarkeit und Kontrolle über die durchgeführten Operationen zu ermöglichen. NOP ist ein Beispiel für eine Assembler-Kurzschrift.
Fazit
Ein Befehlssatz ist eine Liste offizieller Funktionen, die eine CPU-Architektur ausführen kann. Es ist eine Liste von Operationen, die durchgeführt werden können. Diese Operationen sind in der CPU fest codiert und werden unter Verwendung ihrer jeweiligen Opcodes aufgerufen.
Software verwendet im Allgemeinen einen Compiler, um vom Menschen lesbaren High-Level-Code in den Maschinencode zu übersetzen, den die CPU lesen kann. Manchmal kann eine CPU-Architektur undokumentierte Opcodes haben, die als illegale Opcodes bezeichnet werden. Illegale Opcodes sind technisch gesehen Teil des Befehlssatzes. Sie sind jedoch in zukünftigen Plattformiterationen möglicherweise nicht zuverlässig verfügbar. Vergessen Sie nicht, Ihre Gedanken in den Kommentaren unten zu hinterlassen.