Woher weiß ein Prozessor, was die verschiedenen Befehle bedeuten?
Ich denke an Befehle auf Assembly-Ebene wie MOV, PUSH, CALL, etc ...
Woher weiß ein Prozessor, was die verschiedenen Befehle bedeuten?
Ich denke an Befehle auf Assembly-Ebene wie MOV, PUSH, CALL, etc ...
Antworten:
Wenn ein Computer Anweisungen auf Baugruppenebene interpretiert , werden diese Anweisungen in ihre binären Entsprechungen umgewandelt, damit die CPU sie lesen kann. Wenn die CPU die Befehle ausführt, interpretiert sie den Operationscode-Teil des Befehls in einzelne "Mikroprogramme", die ihre Mikrocode- Äquivalente enthalten. Nur damit Sie wissen, besteht eine vollständige Montageanleitung aus einem Opcode und allen dazugehörigen Daten (z. B. Registernamen, Speicheradressen).
Mikrocodebefehle sind extrem niederpegelig (mehr als Assemblierung) und steuern die tatsächlichen digitalen Signale, die den Logikfluss im Mikroprozessor steuern. Beispielsweise könnte ein Mikrocode-Befehl ein Bedingungscode-Register- Flag mit einem neuen Wert aktualisieren oder ein CPU- Register mit einer der ALU- Einheiten verbinden. Es sind komplexere Aufgaben möglich, aber dies zeigt Ihnen die allgemeine Idee, wofür der Mikrocode verwendet wird.
Der allgemeine Ablauf von der Kompilierung bis zur Ausführung sieht wie folgt aus. Die Montageanweisungen werden zusammengesetzt (in ihre binären äquivalenten Nullen und Einsen oder von nun an in logische Signale umgewandelt). Diese Logiksignale werden wiederum von der CPU interpretiert und in Logiksignale mit niedrigerem Pegel umgewandelt, die den Fluss der CPU anweisen, den bestimmten Befehl auszuführen. Dies kann abhängig von der Architektur und dem Design des Prozessors einen oder mehrere Taktzyklen dauern (die meisten Referenzhandbücher für Prozessoren geben an, wie viele Taktzyklen für die Ausführung eines bestimmten Befehls erforderlich sind, z. B. dieser ).
All dies geschieht mit einem fest programmierten Mikrocode (der physisch in den Prozessor in eine Art ROM eingebettet ist , der während der Herstellung eingestellt wird), der den Fluss durch die tatsächlichen Logikgatter auf niedriger Ebene lenkt . Dies bietet eine Schnittstelle zwischen den abstrakten Montageanweisungen und der physischen elektrischen Logik im Prozessor.
Zusammenfassend werden also Prozessoranweisungen vom Prozessor zusammengestellt und geladen. Der Prozessor wird dann diese Anweisungen verwenden, um das Mikroprogramm (in Form eines Mikrocodes) nachzuschlagen, das dieser bestimmten Anweisung entspricht, die "tatsächlich" die Anweisung ausführt. Sobald die Mikrocodes für den bestimmten Befehl ausgeführt wurden (was einen oder mehrere Taktzyklen dauern kann), führt der Prozessor den Mikrocode aus, um den nächsten Befehl abzurufen, und der Zyklus wird wiederholt.
Der Prozessor "weiß" nicht wirklich, was die Befehle sind. Die Befehle sind nur binäre Muster, die den Prozessor dazu veranlassen, das zu tun, was wir unter Befehlen verstehen.
Beispielsweise bewirkt eine ADD-R1-in-R2-Operation, dass die Werte der Register 1 und 2 die ALU (Arithmetik- und Logikeinheit) erreichen, dass die ALU den Ausgang des Addierers anstelle der verschiedenen anderen Daten verwendet und die Ausgang der ALU, um den Wert in Register 2 zu ersetzen. Es gibt einfache Logikschaltungen, um all diese Dinge zu erreichen ( Multiplexer , Addierer , Zähler , ...), obwohl echte Prozessoren sehr komplizierte Optimierungen verwenden.
Es ist so, als würdest du fragen, wie ein Auto langsamer werden kann, wenn du auf die Bremse drückst. Das Auto weiß es nicht, das Bremspedal steuert indirekt, wie stark die Bremsbeläge gegen die Räder gedrückt werden.
Nehmen wir zum Beispiel den Befehl, der einen x86 / IA-32-Prozessor anweist, einen sofortigen 8-Bit-Wert in ein Register zu verschieben. Der Binärcode für diesen Befehl lautet 10110, gefolgt von einer 3-Bit-Kennung, für die das Register verwendet werden soll. Die Kennung für das AL-Register ist 000, daher lädt der folgende Maschinencode das AL-Register mit den Daten 01100001.
10110000 01100001
Dieser binäre Computercode kann besser lesbar gemacht werden, indem er wie folgt hexadezimal ausgedrückt wird
B0 61
Hier bedeutet B0 "Verschiebe eine Kopie des folgenden Werts nach AL" und 61 ist eine hexadezimale Darstellung des Werts 01100001, der 97 dezimal ist. Die Intel Assembler-Sprache stellt für Anweisungen wie diese die Mnemonik MOV (eine Abkürzung für Move) zur Verfügung, sodass der obige Maschinencode wie folgt in Assembler-Sprache geschrieben werden kann, wobei nach dem Semikolon gegebenenfalls ein erklärender Kommentar eingefügt wird. Dies ist viel einfacher zu lesen und zu merken.
http://en.wikipedia.org/wiki/Assembler_language
Mit anderen Worten, wenn Sie Ihr Assemblerprogramm "zusammenstellen", folgen Sie Ihren Anweisungen wie
MOV AL, 61h
werden in Zahlen umgewandelt, denen die CPU eine besondere Bedeutung zuordnet und dann entsprechend handelt.
Vorgeschlagene Literatur:
Beachten Sie auch die Kursnotizen aus CS152: Computer Architecture and Engineering an der UC Berkeley, einem Kurs, in dem Studenten eine CPU implementieren.
Wenn Sie für "hausgemachte CPU" googeln, finden Sie viele Leckereien.
Auf der untersten Ebene kann die CPU lediglich etwas hinzufügen. Von Addition kann subtrahiert, multipliziert und dividiert werden (da dies nur Addition auf andere Weise ist). Die CPU verwendet dies, um Daten im Speicher zu verschieben, indem die Additionen auf die Speicheradressen angewendet werden.
Beachten Sie jedoch, dass dies auf dem niedrigstmöglichen Niveau ist. Die CPU "versteht" tatsächlich bestimmte Befehle in Form eines Mikrocodes. Siehe die Antwort von Breakthrough, sie ist sehr gut geschrieben.
Ich habe unter programmers.stackexchange.com eine entsprechende Antwort gegeben. Weitere Informationen finden Sie unter Funktionsweise von Computern. Dabei habe ich mich von Grund auf kurz damit beschäftigt, wie Computer Anweisungen interpretieren, um Elektronen zu bewegen.