Befehlssatzarchitektur - Instruction set architecture

In der Informatik ist eine Instruction Set Architecture ( ISA ), auch Computerarchitektur genannt , ein abstraktes Modell eines Computers . Ein Gerät, das von dieser ISA beschriebene Anweisungen ausführt, wie beispielsweise eine Zentraleinheit (CPU), wird als Implementierung bezeichnet .

Im Allgemeinen definiert eine ISA die unterstützten Befehle , Datentypen , Register , die Hardwareunterstützung für die Verwaltung des Hauptspeichers , grundlegende Funktionen (wie Speicherkonsistenz , Adressierungsmodi , virtueller Speicher ) und das Eingabe-/Ausgabemodell einer Familie von Implementierungen des ISA.

Eine ISA spezifiziert das Verhalten von Maschinencode, der auf Implementierungen dieser ISA läuft, in einer Weise, die nicht von den Eigenschaften dieser Implementierung abhängt, wodurch binäre Kompatibilität zwischen Implementierungen bereitgestellt wird . Dies ermöglicht mehrere Implementierungen einer ISA, die sich in Merkmalen wie Leistung , physische Größe und finanzielle Kosten (unter anderem) unterscheiden, aber in der Lage sind, denselben Maschinencode auszuführen, sodass eine Maschine mit geringerer Leistung und niedrigeren Kosten durch eine teurere, leistungsfähigere Maschine ersetzt werden, ohne dass die Software ausgetauscht werden muss. Es ermöglicht auch die Weiterentwicklung der Mikroarchitekturen der Implementierungen dieser ISA, so dass eine neuere Implementierung einer ISA mit höherer Leistung Software ausführen kann, die auf früheren Generationen von Implementierungen läuft.

Wenn ein Betriebssystem eine standardmäßige und kompatible binäre Anwendungsschnittstelle (ABI) für eine bestimmte ISA unterhält , wird Maschinencode auf zukünftigen Implementierungen dieser ISA und dieses Betriebssystems ausgeführt. Wenn eine ISA jedoch die Ausführung mehrerer Betriebssysteme unterstützt, garantiert sie nicht, dass Maschinencode für ein Betriebssystem auf einem anderen Betriebssystem ausgeführt wird, es sei denn, das erste Betriebssystem unterstützt die Ausführung von Maschinencode, der für das andere Betriebssystem erstellt wurde.

Eine ISA kann durch Hinzufügen von Befehlen oder anderen Fähigkeiten oder durch Hinzufügen von Unterstützung für größere Adressen und Datenwerte erweitert werden; eine Implementierung der erweiterten ISA wird weiterhin Maschinencode für Versionen der ISA ohne diese Erweiterungen ausführen können. Maschinencode, der diese Erweiterungen verwendet, wird nur auf Implementierungen ausgeführt, die diese Erweiterungen unterstützen.

Die von ihnen bereitgestellte Binärkompatibilität macht ISAs zu einer der grundlegendsten Abstraktionen in der Datenverarbeitung .

Überblick

Eine Befehlssatzarchitektur unterscheidet sich von einer Mikroarchitektur , die der Satz von Prozessorentwurfstechniken ist , die in einem bestimmten Prozessor verwendet werden, um den Befehlssatz zu implementieren. Prozessoren mit unterschiedlichen Mikroarchitekturen können sich einen gemeinsamen Befehlssatz teilen. Beispielsweise implementieren der Intel Pentium und der Advanced Micro Devices Athlon nahezu identische Versionen des x86-Befehlssatzes , haben aber radikal unterschiedliche interne Designs.

Das Konzept einer Architektur , das sich vom Design einer bestimmten Maschine unterscheidet, wurde von Fred Brooks bei IBM während der Designphase von System/360 entwickelt .

Vor NPL [System/360] war es den Computerdesignern des Unternehmens freigestellt, Kostenziele nicht nur durch die Auswahl von Technologien, sondern auch durch funktionale und architektonische Verfeinerungen zu erreichen. Im Gegensatz dazu postulierte das SPREAD-Kompatibilitätsziel eine einzige Architektur für eine Reihe von fünf Prozessoren, die einen breiten Kosten- und Leistungsbereich abdecken. Keines der fünf Konstruktionsteams konnte sich darauf verlassen, dass die architektonischen Spezifikationen angepasst werden konnten, um die Schwierigkeiten beim Erreichen von Kosten- und Leistungszielen zu lindern.

Einige virtuellen Maschinen , dass die Unterstützung Bytecode als ISA wie Smalltalk , die Java Virtual Machine und Microsoft ‚s Common Language Runtime , implementieren diese durch den Bytecode für häufig verwendete Codepfade in nativen Maschinencode zu übersetzen. Außerdem führen diese virtuellen Maschinen weniger häufig verwendete Codepfade durch Interpretation aus (siehe: Just-in-Time-Kompilierung ). Transmeta hat auf diese Weise den x86-Befehlssatz auf VLIW- Prozessoren implementiert .

Klassifizierung von ISAs

Ein ISA kann auf verschiedene Weise klassifiziert werden. Eine übliche Klassifizierung erfolgt nach architektonischer Komplexität . Ein Computer mit komplexem Befehlssatz (CISC) hat viele spezialisierte Befehle, von denen einige in praktischen Programmen nur selten verwendet werden. Ein Computer mit reduziertem Befehlssatz (RISC) vereinfacht den Prozessor, indem er nur die Befehle, die häufig in Programmen verwendet werden, effizient implementiert, während die weniger verbreiteten Operationen als Unterroutinen implementiert werden, deren resultierende zusätzliche Prozessorausführungszeit durch seltene Verwendung versetzt wird.

Andere Typen umfassen Architekturen mit sehr langen Befehlswörtern (VLIW) und die eng verwandten Architekturen mit langen Befehlswörtern (LIW) und explizit parallelen Befehlsberechnungen (EPIC). Diese Architekturen versuchen, die Parallelität auf Befehlsebene mit weniger Hardware als RISC und CISC auszunutzen, indem sie den Compiler für die Befehlsausgabe und das Scheduling verantwortlich machen.

Architekturen mit noch geringerer Komplexität wurden untersucht, wie beispielsweise der Minimal-Instruction-Set-Computer (MISC) und der One-Instruction-Set-Computer (OISC). Dies sind theoretisch wichtige Typen, die jedoch nicht kommerzialisiert wurden.

Anweisungen

Maschinensprache ist aus diskreten Anweisungen oder Anweisungen aufgebaut . Auf der Verarbeitungsarchitektur kann eine gegebene Anweisung Folgendes angeben:

  • Opcode (die auszuführende Anweisung) zB hinzufügen, kopieren, testen
  • beliebige explizite Operanden:
registriert
wörtliche/konstante Werte
Adressierungsmodi für den Zugriff auf den Speicher

Komplexere Operationen werden durch Kombinieren dieser einfachen Befehle aufgebaut, die sequentiell ausgeführt werden oder auf andere Weise durch Kontrollflussbefehle angewiesen werden.

Befehlstypen

Beispiele für Operationen, die vielen Befehlssätzen gemeinsam sind, umfassen:

Datenverarbeitung und Speicheroperationen

  • Setzen Sie ein Register auf einen festen konstanten Wert.
  • Kopieren Sie Daten von einem Speicherplatz oder einem Register in einen Speicherplatz oder ein Register (ein Maschinenbefehl wird oft als Verschieben bezeichnet ; der Begriff ist jedoch irreführend). Wird verwendet, um den Inhalt eines Registers, das Ergebnis einer Berechnung zu speichern oder um gespeicherte Daten abzurufen, um später eine Berechnung durchzuführen. Oft als Lade- und Speicheroperationen bezeichnet .
  • Lesen und Schreiben von Daten von Hardwaregeräten.

Arithmetische und logische Operationen

  • Addiere , subtrahiere , multipliziere oder dividiere die Werte von zwei Registern, platziere das Ergebnis in einem Register und setze möglicherweise einen oder mehrere Bedingungscodes in einem Statusregister .
    • inkrementieren ,Dekrementieren in einigen ISAs, wodurch das Abrufen von Operanden in trivialen Fällen gespart wird.
  • Führen Sie bitweise Operationen durch , z. B. Nehmen Sie die Konjunktion und Disjunktion entsprechender Bits in einem Registerpaar vor, und nehmen Sie die Negation jedes Bits in einem Register vor.
  • Vergleichen Sie zwei Werte in Registern (z. B. um zu sehen, ob einer kleiner oder gleich ist).
  • Gleitkommaanweisung sfür die Arithmetik von Gleitkommazahlen.

Der Steuerfluss Operationen

Coprozessor- Anweisungen

  • Laden/Speichern von Daten zu und von einem Coprozessor oder Austausch mit CPU-Registern.
  • Coprozessoroperationen ausführen.

Komplexe Anweisungen

Prozessoren können "komplexe" Befehle in ihren Befehlssatz aufnehmen. Eine einzelne "komplexe" Anweisung führt etwas aus, das auf anderen Computern viele Anweisungen benötigen kann. Typisch für solche Befehle sind Befehle, die mehrere Schritte ausführen, mehrere Funktionseinheiten steuern oder auf andere Weise in einem größeren Maßstab erscheinen als die Masse einfacher Befehle, die von dem gegebenen Prozessor implementiert werden. Einige Beispiele für "komplexe" Anweisungen sind:

Komplexe Befehle sind in CISC-Befehlssätzen häufiger als in RISC-Befehlssätzen, aber RISC-Befehlssätze können sie ebenfalls enthalten. RISC-Befehlssätze enthalten im Allgemeinen keine ALU-Operationen mit Speicheroperanden oder Befehle zum Verschieben großer Speicherblöcke, aber die meisten RISC-Befehlssätze enthalten SIMD- oder Vektorbefehle , die dieselbe arithmetische Operation an mehreren Datenstücken gleichzeitig ausführen. SIMD-Befehle haben die Fähigkeit, große Vektoren und Matrizen in minimaler Zeit zu manipulieren. SIMD-Anweisungen ermöglichen eine einfache Parallelisierung von Algorithmen, die üblicherweise bei der Ton-, Bild- und Videoverarbeitung verwendet werden. Verschiedene SIMD-Implementierungen wurden unter Handelsnamen wie MMX , 3DNow! und AltiVec .

Befehlscodierung

Ein Befehl kann mehrere Felder aufweisen, die die logische Operation identifizieren, und kann auch Quell- und Zieladressen und konstante Werte enthalten. Dies ist der MIPS-Befehl "Immediate hinzufügen", der die Auswahl von Quell- und Zielregistern und die Aufnahme einer kleinen Konstanten ermöglicht.

Auf traditionellen Architekturen enthält eine Anweisung einen Opcode , der die auszuführende Operation spezifiziert, wie zum Beispiel Speicherinhalt zu Register hinzufügen – und null oder mehr Operandenspezifizierer , die Register , Speicherorte oder Literaldaten spezifizieren können . Die Operandenspezifizierer können Adressierungsmodi haben , die ihre Bedeutung bestimmen, oder sie können sich in festen Feldern befinden. In Architekturen mit sehr langen Befehlsworten (VLIW), die viele Mikrocode- Architekturen umfassen, werden mehrere gleichzeitige Opcodes und Operanden in einem einzigen Befehl spezifiziert.

Einige exotische Befehlssätze haben kein Opcode-Feld, wie beispielsweise transportgetriggerte Architekturen (TTA), sondern nur Operanden.

Der virtuellen Forth-Maschine und anderen 0-Operanden- Befehlssätzen fehlen jegliche Operandenspezifiziererfelder, wie beispielsweise einige Stapelmaschinen einschließlich NOSC.

Bedingte Befehle haben oft ein Prädikatsfeld – einige Bits, die die spezifische Bedingung codieren, um zu bewirken, dass eine Operation ausgeführt wird, anstatt sie nicht auszuführen. Beispielsweise überträgt ein bedingter Verzweigungsbefehl die Steuerung, wenn die Bedingung wahr ist, so dass die Ausführung zu einem anderen Teil des Programms fortschreitet, und überträgt die Steuerung nicht, wenn die Bedingung falsch ist, so dass die Ausführung sequentiell fortgesetzt wird. Einige Befehlssätze haben auch bedingte Bewegungen, so dass die Bewegung ausgeführt wird und die Daten an der Zielposition gespeichert werden, wenn die Bedingung wahr ist, und nicht ausgeführt wird, und die Zielposition nicht modifiziert wird, wenn die Bedingung falsch ist. In ähnlicher Weise verfügt IBM z/Architecture über eine bedingte Speicheranweisung. Einige Befehlssätze enthalten in jeder Anweisung ein Prädikatsfeld; dies wird als Branch-Prädikation bezeichnet .

Anzahl Operanden

Befehlssätze können nach der maximalen Anzahl von Operanden kategorisiert werden, die explizit in Befehlen angegeben sind.

(In den folgenden Beispielen sind a , b und c (direkte oder berechnete) Adressen, die sich auf Speicherzellen beziehen , während sich reg1 usw. auf Maschinenregister bezieht.)

C = A+B
  • 0-Operand ( Null-Adress-Maschinen ), sogenannte Stack-Maschinen : Alle arithmetischen Operationen finden unter Verwendung der obersten ein oder zwei Positionen auf dem Stack statt: push a, push b, add, pop c.
    • C = A+Bbraucht vier Anweisungen . Bei Stapelmaschinen gelten die Begriffe "0-Operand" und "Nulladresse" für arithmetische Befehle, jedoch nicht für alle Befehle, da Push- und Pop-Befehle mit einem Operanden für den Zugriff auf den Speicher verwendet werden.
  • 1-Operand ( Maschinen mit einer Adresse ), sogenannte Akkumulatormaschinen , umfassen frühe Computer und viele kleine Mikrocontroller : Die meisten Befehle spezifizieren einen einzelnen rechten Operanden (d. h. eine Konstante, ein Register oder eine Speicherstelle), mit dem impliziten Akkumulator als der linke Operand (und das Ziel, falls vorhanden): load a, add b, store c.
    • C = A+Bbraucht drei Anweisungen .
  • 2-Operand — viele CISC- und RISC-Maschinen fallen in diese Kategorie:
    • CISC — move Abis C ; dann add Bzu C .
      • C = A+Bbraucht zwei Anweisungen . Dies "speichert" das Ergebnis effektiv ohne eine explizite Speicheranweisung .
    • CISC — Oft sind Maschinen auf einen Speicheroperanden pro Befehl beschränkt: load a,reg1; add b,reg1; store reg1,c; Dies erfordert ein Laden/Speichern-Paar für jede Speicherbewegung, unabhängig davon, ob das addErgebnis eine Erweiterung ist, die an einem anderen Ort gespeichert ist, wie in C = A+B, oder an derselben Speicherstelle: A = A+B.
      • C = A+Bbraucht drei Anweisungen .
    • RISC — Erfordert explizites Laden des Speichers, die Anweisungen wären: load a,reg1; load b,reg2; add reg1,reg2; store reg2,c.
      • C = A+Bbraucht vier Anweisungen .
  • 3-Operand, der eine bessere Wiederverwendung von Daten ermöglicht:
    • CISC — Es wird entweder eine einzelne Anweisung: add a,b,c
      • C = A+Bbraucht eine Anweisung .
    • CISC — Oder, auf Maschinen, die auf zwei Speicheroperanden pro Befehl beschränkt sind, move a,reg1; add reg1,b,c;
      • C = A+Bbraucht zwei Anweisungen .
    • RISC — Arithmetische Befehle verwenden nur Register, daher sind explizite 2-Operanden-Lade-/Speicherbefehle erforderlich: load a,reg1; load b,reg2; add reg1+reg2->reg3; store reg3,c;
      • C = A+Bbraucht vier Anweisungen .
      • Anders als 2-Operand oder 1-Operand bleiben alle drei Werte a, b und c in Registern für die weitere Wiederverwendung verfügbar.
  • mehr Operanden – einige CISC-Maschinen erlauben eine Vielzahl von Adressierungsmodi, die mehr als 3 Operanden (Register oder Speicherzugriffe) zulassen, wie z. B. der VAX- Polynomauswertungsbefehl "POLY".

Aufgrund der großen Anzahl von Bits, die zum Codieren der drei Register eines 3-Operanden-Befehls erforderlich sind, handelt es sich bei RISC-Architekturen mit 16-Bit-Befehlen ausnahmslos um 2-Operanden-Designs, wie Atmel AVR, TI MSP430 und einige Versionen von ARM Thumb . RISC-Architekturen mit 32-Bit-Befehlen sind normalerweise 3-Operanden-Designs, wie die ARM- , AVR32- , MIPS- , Power ISA- und SPARC- Architekturen.

Jeder Befehl spezifiziert eine bestimmte Anzahl von Operanden (Register, Speicherorte oder unmittelbare Werte) explizit . Einige Befehle geben einen oder beide Operanden implizit zurück, beispielsweise indem sie oben auf dem Stapel oder in einem impliziten Register gespeichert werden. Werden einige Operanden implizit angegeben, müssen weniger Operanden in der Anweisung angegeben werden. Wenn ein "Zieloperand" das Ziel explizit angibt, muss ein zusätzlicher Operand geliefert werden. Folglich kann die Anzahl der in einer Anweisung codierten Operanden von der mathematisch notwendigen Anzahl von Argumenten für eine logische oder arithmetische Operation (der arität ) abweichen . Operanden sind entweder in der "Opcode"-Darstellung des Befehls kodiert oder werden als Werte oder Adressen nach dem Opcode angegeben.

Druck registrieren

Der Registerdruck misst die Verfügbarkeit freier Register zu jedem Zeitpunkt während der Programmausführung. Der Registerdruck ist hoch, wenn eine große Anzahl der verfügbaren Register verwendet wird; je höher der Registerdruck ist, desto häufiger müssen die Registerinhalte in den Speicher geschüttet werden. Eine Erhöhung der Anzahl von Registern in einer Architektur verringert den Registerdruck, erhöht jedoch die Kosten.

Während eingebettete Befehlssätze wie Thumb unter extrem hohem Registerdruck leiden, weil sie kleine Registersätze haben, genießen Allzweck-RISC-ISAs wie MIPS und Alpha einen niedrigen Registerdruck. CISC-ISAs wie x86-64 bieten trotz kleinerer Registersätze einen niedrigen Registerdruck. Dies liegt an den vielen Adressierungsmodi und Optimierungen (wie z. B. Subregisteradressierung, Speicheroperanden in ALU-Befehlen, absolute Adressierung, PC-relative Adressierung und Register-zu-Register-Überlauf), die CISC-ISAs bieten.

Anweisungslänge

Die Größe oder Länge eines Befehls variiert stark, von nur vier Bits in einigen Mikrocontrollern bis zu vielen Hundert Bits in einigen VLIW- Systemen. Prozessoren, die in Personalcomputern , Großrechnern und Supercomputern verwendet werden, haben Befehlsgrößen zwischen 8 und 64 Bit. Der längste mögliche Befehl auf x86 ist 15 Byte (120 Bit). Innerhalb eines Befehlssatzes können verschiedene Befehle unterschiedliche Längen haben. In einigen Architekturen, insbesondere den meisten Computern mit reduziertem Befehlssatz (RISC),Anweisungen haben eine feste Länge , die typischerweise der Wortgröße dieser Architektur entspricht. In anderen Architekturen haben Befehle variable Länge, typischerweise ganzzahlige Vielfache eines Bytes oder eines Halbworts . Einige, wie der ARM mit Thumb-Erweiterung, haben eine gemischte variable Kodierung, d. h. zwei feste, normalerweise 32-Bit- und 16-Bit-Kodierungen, bei denen Anweisungen nicht frei gemischt werden können, sondern auf einer Verzweigung (oder Ausnahmegrenze in ARMv8 .) umgeschaltet werden müssen ).

Ein RISC-Befehlssatz hat normalerweise eine feste Befehlslänge (oft 4 Byte = 32 Bit), wohingegen ein typischer CISC-Befehlssatz Befehle von stark variierender Länge haben kann (1 bis 15 Byte für x86). Befehle mit fester Länge sind aus mehreren Gründen weniger kompliziert zu handhaben als Befehle mit variabler Länge (es muss nicht überprüft werden, ob ein Befehl beispielsweise eine Cache-Zeile oder eine Seitengrenze des virtuellen Speichers überspannt) und sind daher etwas einfacher hinsichtlich der Geschwindigkeit zu optimieren.

Codedichte

In den Computern der frühen 1960er Jahre war der Hauptspeicher teuer und sehr begrenzt, sogar auf Großrechnern. Die Minimierung der Größe eines Programms, um sicherzustellen, dass es in den begrenzten Speicher passt, war oft von zentraler Bedeutung. Somit war die kombinierte Größe aller Befehle, die zum Ausführen einer bestimmten Aufgabe erforderlich sind, die Codedichte , ein wichtiges Merkmal jedes Befehlssatzes. Es blieb wichtig für die anfangs winzigen Speicher von Minicomputern und dann von Mikroprozessoren. Dichte ist auch heute noch wichtig für Smartphone-Anwendungen, Anwendungen, die über langsame Internetverbindungen in Browser heruntergeladen werden, und in ROMs für eingebettete Anwendungen. Ein allgemeinerer Vorteil einer erhöhten Dichte ist eine verbesserte Effektivität von Caches und Befehlsvorabrufen.

Computer mit hoher Codedichte haben oft komplexe Anweisungen für die Prozedureingabe, parametrisierte Rückgaben, Schleifen usw. (daher rückwirkend Complex Instruction Set Computers , CISC genannt ). Typischere oder häufigere "CISC"-Befehle kombinieren jedoch lediglich eine grundlegende ALU-Operation, wie "Add", mit dem Zugriff auf einen oder mehrere Operanden im Speicher (unter Verwendung von Adressierungsmodi wie direkt, indirekt, indiziert usw.) . Bestimmte Architekturen können zwei oder drei Operanden (einschließlich des Ergebnisses) direkt im Speicher zulassen oder in der Lage sein, Funktionen wie automatisches Zeigerinkrementieren usw. auszuführen. Softwareimplementierte Befehlssätze können noch komplexere und leistungsfähigere Befehle aufweisen.

Computer mit reduziertem Befehlssatz , RISC , wurden zum ersten Mal in einer Zeit schnell wachsender Speichersubsysteme in großem Umfang implementiert. Sie opfern die Codedichte, um die Implementierungsschaltung zu vereinfachen, und versuchen, die Leistung durch höhere Taktfrequenzen und mehr Register zu steigern. Ein einzelner RISC-Befehl führt typischerweise nur eine einzelne Operation durch, wie beispielsweise ein "Hinzufügen" von Registern oder ein "Laden" von einer Speicherstelle in ein Register. Ein RISC-Befehlssatz hat normalerweise eine feste Befehlslänge , wohingegen ein typischer CISC-Befehlssatz Befehle von stark variierender Länge hat. Da RISC-Computer jedoch normalerweise mehr und oft längere Anweisungen benötigen, um eine gegebene Aufgabe zu implementieren, nutzen sie von Natur aus Busbandbreite und Cache-Speicher weniger optimal aus.

Bestimmte eingebettete RISC-ISAs wie Thumb und AVR32 weisen aufgrund einer als Codekompression bezeichneten Technik typischerweise eine sehr hohe Dichte auf. Diese Technik packt zwei 16-Bit-Befehle in ein 32-Bit-Wort, das dann in der Dekodierungsstufe entpackt und als zwei Befehle ausgeführt wird.

Computer mit minimalem Befehlssatz (MISC) sind eine Form von Stapelmaschinen , bei denen es wenige separate Befehle (16-64) gibt, so dass mehrere Befehle in ein einzelnes Maschinenwort passen. Diese Art von Kernen benötigt oft wenig Silizium, um sie zu implementieren, sodass sie leicht in einem FPGA oder in einer Multi-Core- Form realisiert werden können. Die Codedichte von MISC ist ähnlich der Codedichte von RISC; die erhöhte Befehlsdichte wird ausgeglichen, indem mehr der primitiven Befehle benötigt werden, um eine Aufgabe zu erledigen.

Es wurde eine ausführbare Komprimierung als Mechanismus zur Verbesserung der Codedichte erforscht . Die Mathematik der Kolmogorov-Komplexität beschreibt die Herausforderungen und Grenzen dieser.

Darstellung

Die ein Programm bildenden Anweisungen werden selten in ihrer internen, numerischen Form ( Maschinencode ) spezifiziert ; sie können von Programmierern spezifiziert werden, die eine Assemblersprache verwenden, oder, häufiger, können von Compilern aus höheren Programmiersprachen generiert werden .

Entwurf

Die Gestaltung von Befehlssätzen ist ein komplexes Thema. Es gab zwei Phasen in der Geschichte des Mikroprozessors. Der erste war der CISC (Complex Instruction Set Computer), der viele verschiedene Befehle hatte. In den 1970er Jahren forschten jedoch Orte wie IBM und stellten fest, dass viele Anweisungen im Set eliminiert werden konnten. Das Ergebnis war der RISC (Reduced Instruction Set Computer), eine Architektur, die einen kleineren Befehlssatz verwendet. Ein einfacherer Befehlssatz kann das Potenzial für höhere Geschwindigkeiten, verringerte Prozessorgröße und verringerten Energieverbrauch bieten. Ein komplexerer Satz kann jedoch allgemeine Operationen optimieren, die Speicher- und Cache- Effizienz verbessern oder die Programmierung vereinfachen.

Einige Befehlssatz-Designer reservieren einen oder mehrere Opcodes für irgendeine Art von Systemaufruf oder Software-Interrupt . Beispielsweise verwendet MOS Technology 6502 00 H , Zilog Z80 verwendet die acht Codes C7,CF,D7,DF,E7,EF,F7,FF H , während Motorola 68000 Codes im Bereich A000..AFFF H verwendet .

Schnelle virtuelle Maschinen sind viel einfacher zu implementieren, wenn ein Befehlssatz die Virtualisierungsanforderungen von Popek und Goldberg erfüllt .

Der bei der immunitätsbewussten Programmierung verwendete NOP-Schieber ist viel einfacher zu implementieren, wenn der "unprogrammierte" Zustand des Speichers als NOP interpretiert wird .

Auf Systemen mit mehreren Prozessoren sind nicht-blockierende Synchronisationsalgorithmen viel einfacher zu implementieren, wenn der Befehlssatz Unterstützung für Dinge wie „ Abrufen und Hinzufügen “, „ Laden-Link/Speichern-Bedingt “ (LL/SC) oder . enthält "atomares Vergleichen und Tauschen ".

Implementierung des Befehlssatzes

Jeder gegebene Befehlssatz kann auf verschiedene Weise implementiert werden. Alle Wege zum Implementieren eines bestimmten Befehlssatzes stellen das gleiche Programmiermodell bereit , und alle Implementierungen dieses Befehlssatzes können die gleichen ausführbaren Dateien ausführen. Die verschiedenen Möglichkeiten, einen Befehlssatz zu implementieren, ergeben unterschiedliche Kompromisse zwischen Kosten, Leistung, Stromverbrauch, Größe usw.

Beim Entwerfen der Mikroarchitektur eines Prozessors verwenden Ingenieure Blöcke von "festverdrahteten" elektronischen Schaltungen (oft separat entworfen) wie Addierer, Multiplexer, Zähler, Register, ALUs usw. Eine Art von Registerübertragungssprache wird dann oft verwendet, um zu beschreiben die Dekodierung und Sequenzierung jedes Befehls einer ISA unter Verwendung dieser physikalischen Mikroarchitektur. Es gibt zwei grundlegende Möglichkeiten, ein Steuergerät zu bauen , um diese Beschreibung zu implementieren (obwohl viele Designs Mittelwege oder Kompromisse verwenden):

  1. Einige Computer entwerfen "festverdrahtet" die komplette Befehlssatz-Decodierung und Sequenzierung (genau wie der Rest der Mikroarchitektur).
  2. Andere Designs verwenden Mikrocode- Routinen oder -Tabellen (oder beides), um dies zu tun – typischerweise als On-Chip- ROMs oder PLAs oder beides (obwohl in der Vergangenheit separate RAMs und ROMs verwendet wurden). Der Western Digital MCP-1600 ist ein älteres Beispiel, das einen dedizierten, separaten ROM für Mikrocode verwendet.

Einige Designs verwenden eine Kombination aus festverdrahtetem Design und Mikrocode für die Steuereinheit.

Einige CPU-Designs verwenden einen beschreibbaren Steuerspeicher – sie kompilieren den Befehlssatz in einen beschreibbaren RAM oder Flash innerhalb der CPU (wie der Rekursiv- Prozessor und der Imsys Cjip ) oder ein FPGA ( rekonfigurierbares Computing ).

Ein ISA kann auch durch einen Interpreter in Software emuliert werden . Aufgrund des Interpretationsaufwands ist dies natürlich langsamer als das direkte Ausführen von Programmen auf der emulierten Hardware, es sei denn, die Hardware, auf der der Emulator ausgeführt wird, ist eine Größenordnung schneller. Heutzutage ist es bei Anbietern neuer ISAs oder Mikroarchitekturen gängige Praxis, Software-Entwicklern Software-Emulatoren zur Verfügung zu stellen, bevor die Hardware-Implementierung fertig ist.

Oftmals haben die Details der Implementierung einen starken Einfluss auf die jeweiligen Anweisungen, die für den Anweisungssatz ausgewählt werden. Viele Implementierungen der Befehlspipeline erlauben beispielsweise nur ein einziges Laden oder Speichern eines Speichers pro Befehl, was zu einer Lade-Speicher-Architektur (RISC) führt. Als ein weiteres Beispiel führten einige frühe Wege zum Implementieren der Befehlspipeline zu einem Verzögerungsschlitz .

Die Anforderungen an eine schnelle digitale Signalverarbeitung haben sich in die entgegengesetzte Richtung verschoben und zwingen dazu, Anweisungen auf eine bestimmte Weise zu implementieren. Um beispielsweise digitale Filter schnell genug ausführen zu können, muss der MAC-Befehl in einem typischen digitalen Signalprozessor (DSP) eine Art Harvard-Architektur verwenden , die einen Befehl und zwei Datenwörter gleichzeitig abrufen kann, und erfordert eine Multiplikation-Akkumulation in einem einzigen Zyklus Multiplikator .

Siehe auch

Verweise

Weiterlesen

Externe Links