Wikipedia · einfach zusammengefasst · Stand
Opcode
Ein spezielles Programm, der Assembler, erzeugt Maschinencode, indem es im Wesentlichen die Mnemonics durch ihre jeweiligen Opcodes ersetzt. Die meisten …
Inhalt5 Abschnitte
Grundidee und Bedeutung
Ein Opcode, auch op code oder operation code, ist eine Zahl, die die Nummer eines Maschinenbefehls für einen bestimmten Prozessortyp angibt. Alle Opcodes zusammen bilden den Befehlssatz eines Prozessors oder einer Prozessorfamilie. Ein Maschinenbefehl ist eine Anweisung, die der Prozessor direkt ausführen kann, zum Beispiel Addition, Multiplikation, Kopieren von Registern, Laden und Speichern von Registerinhalten aus dem Arbeitsspeicher oder Ein- und Ausgabe.
Manche Opcodes bilden allein schon einen vollständigen Maschinenbefehl. Bei anderen müssen noch weitere Angaben folgen, etwa Adressen, Konstanten oder ähnliche Daten. Erst Opcode und Zusatzdaten zusammen ergeben dann den vollständigen Maschinenbefehl. Die meisten modernen Prozessoren besitzen einige hundert Opcodes.
Mnemonics und Assemblersprache
Jedem Opcode wird meist ein kurzes Wort oder eine Abkürzung zugeordnet. Diese lesbare Kurzform heißt Mnemonic. Mnemonics sind die Grundlage von Assemblersprachen: In einer Textdatei steht pro Zeile ein Mnemonic, gegebenenfalls gefolgt von Adressen oder Konstanten.
Ein spezielles Programm, der Assembler, erzeugt daraus Maschinencode. Dabei ersetzt er im Wesentlichen die Mnemonics durch die zugehörigen Opcodes. So können Menschen Programme in einer lesbareren Form schreiben, während der Prozessor am Ende die numerischen Maschinenbefehle erhält.
Undefinierte Opcodes
Ältere Prozessoren hatten oft „undefinierte“ oder „illegale“ Opcodes. Das waren Opcodes, die vom Hersteller nicht für die normale Programmierung vorgesehen waren. Wegen ihrer Nebenwirkungen auf den internen Schaltungsaufbau konnten sie seltsame, schädliche oder seltener auch nützliche Effekte auslösen.
Solche Opcodes wurden manchmal in Computerspielen auf Heimcomputern und frühen Spielkonsolen eingesetzt, etwa um bestimmte Vorgänge etwas schneller ablaufen zu lassen oder um Kopierschutzmechanismen schwerer durchschaubar zu machen. Der Nachteil war, dass diese Opcodes nicht garantiert waren und auf Nachfolgemodellen eines Prozessors oft nicht mehr funktionierten. Heutige Prozessoren reagieren auf unbekannte Opcodes meist entweder ohne Wirkung oder wechseln in einen klar definierten Fehlerzustand.
Beispiel Z80
Beim 8-Bit-Prozessor Z80 lassen sich Opcodes gut an einfachen Befehlen zeigen. Der Opcode 04 steht für das Mnemonic INC B und bedeutet: Register B wird um eins erhöht. Der Opcode 05 steht für DEC A und bedeutet: Register A wird um eins vermindert. Der Opcode 90 steht für SUB B und bedeutet: Register B wird vom Akkumulator A subtrahiert.
Ein Befehl kann auch zusätzliche Daten enthalten. Der Opcode 21 ll hh steht für LD HL,hhll und lädt das Registerpaar HL mit der Konstante hhll. Für den Z80 gibt es bei manchen Befehlen verschiedene Mnemonics, zum Beispiel LD M,B beziehungsweise LD (HL),B; für die Vorgänger-CPU Intel 8085 existiert zusätzlich MOV M,B.
Die Z80-Mnemonics DEC A, INC B, SUB B und LD HL,1234h erzeugen das Maschinenprogramm 05 04 90 21 34 12. Maschinenprogramme werden heute praktisch immer hexadezimal dargestellt. Selten werden sie dezimal oder oktal angegeben. Manchmal werden 16-Bit-Werte nicht als zwei 8-Bit-Worte in der Bytereihenfolge im Hauptspeicher gezeigt, sondern als ein 16-Bit-Wort in logischer Reihenfolge, also zum Beispiel 05 04 90 21 1234.
Beispiel Zuse Z3
Die Z3 von Konrad Zuse aus dem Jahr 1941 hatte zwei Register R1 und R2, 64 Speicherzellen und beherrschte Ein- und Ausgabe, die vier Grundrechenarten sowie die Wurzelberechnung von Gleitkommazahlen. Programme wurden auf Lochstreifen gespeichert. Die Opcodes der neun Befehle bestanden aus Lochstreifencodierungen.
Zu den Befehlen gehörten Lu für Anhalten und Eingabe einer Dezimalzahl von der Tastatur in R1, wobei R2 undefiniert wurde, sowie Ld für Anhalten und dezimale Anzeige des Ergebnisses. Speicherzugriffe waren Pr z zum Lesen der Speicherzelle z und Ps z zum Schreiben von R1 in Speicherzelle z. Rechenbefehle waren La für Addition R1:=R1+R2, Ls für Subtraktion R1:=R1-R2, Lm für Multiplikation R1:=R1*R2, Li für Division R1:=R1/R2 und Lw für Wurzelberechnung R1:=Wurzel(R1); bei diesen Rechenbefehlen wurde jeweils R2:=0 gesetzt.
In der Lochstreifencodierung steht O für Loch, - für kein Loch, · für das Transportloch und zzzzzz für eine binär codierte Speicherstelle von 0 bis 63. Der Lochstreifen ist 8 Bits breit und besitzt ein asymmetrisches Transportloch zwischen dem zweiten und dritten Bit. Die Opcodes für Speicherzugriffe belegen nur 2 Bits, gefolgt von der Adresse der Speicherzelle. Die anderen Opcodes belegen 5 Bits; 3 Bits sind unbenutzt.