Woher weiß eine CPU, was Befehle und Anweisungen eigentlich bedeuten?

39813
Simon Verbeke

Woher weiß ein Prozessor, was die verschiedenen Befehle bedeuten?

Ich denke an Montagebefehle wie MOV, PUSH, CALL usw.

71
Dies ist sehr informativ, aber was ich suche, ist es, was einer CPU das Empfangen und Senden von Befehlen ermöglicht? vor 13 Jahren 0
Ich verstehe diesen Kommentar nicht. Eine CPU "empfängt" Anweisungen aus dem Speicher, indem sie nach Adresse gefragt werden. Die einzigen Befehle, die eine CPU "sendet" (zumindest in der vereinfachten Ansicht), sind Befehle an den Speicher, um Daten zu liefern, und Befehle an E / A-Busse, um E / A-Geräte zu betreiben. Daniel R Hicks vor 13 Jahren 0
Das Herzstück einer jeden CPU ist eine Logik, die (wörtlich) fest verdrahtet ist, um eine einfache Prozedur auszuführen: Nehmen Sie den Wert aus dem Befehlsadreßregister, senden Sie ihn in den Speicher, rufen Sie die Anweisung ab, die der Speicher zurückgibt, und stecken Sie ihn in einen eher mehr komplexe Verschachtelung fest verdrahteter Logik, die "versteht", was der Befehl bedeutet und wie er ausgeführt werden soll. Oh, und irgendwo dort inkrementieren Sie das Befehlsadressenregister. Daniel R Hicks vor 13 Jahren 0
Leser könnten an der Frage [Wie funktioniert ein Computer?] (Http://cs.stackexchange.com/q/3390/98) über [cs.SE] interessiert sein. Raphael vor 11 Jahren 0

6 Antworten auf die Frage

88
Breakthrough

Wenn ein Computer Anweisungen auf Montageebene interpretiert, werden diese Anweisungen in ihre binären Entsprechungen umgewandelt, damit die CPU sie lesen kann. Wenn die CPU die Anweisungen ausführt, interpretiert sie den Opcode-Teil der Anweisung in einzelne "Mikroprogramme", die ihre Mikrocode- Äquivalente enthalten. Nur um zu wissen, besteht eine vollständige Montageanweisung aus einem Opcode und ggf. zugehörigen Daten (z. B. Registernamen, Speicheradressen).

Mikrocode-Befehle haben einen extrem niedrigen Pegel (mehr als eine Baugruppe) und steuern die tatsächlichen digitalen Signale, die den Logikfluss im Mikroprozessor steuern. Beispielsweise könnte ein Mikrocode-Befehl ein Bedingungscoderegister mit einem neuen Wert aktualisieren oder ein CPU- Register mit einer der ALU- Einheiten verbinden. Komplexere Aufgaben sind möglich, aber dies zeigt Ihnen die allgemeine Vorstellung, wofür der Mikrocode verwendet wird.

Der allgemeine Ablauf von der Kompilierung zur Ausführung ist wie folgt. Die Montageanweisungen werden zusammengestellt (in ihre binären äquivalenten 0 und 1 oder von nun an logische Signale umgewandelt). Diese Logiksignale werden wiederum von der CPU interpretiert und in logisch niedrigere Signale umgewandelt, die den Fluss der CPU anweisen, die bestimmte Anweisung auszuführen. Dies kann einen oder mehrere Taktzyklen dauern, abhängig von der Architektur und dem Design des Prozessors (die meisten Referenzhandbücher für Prozessoren geben an, wie viele Taktzyklen erforderlich sind, um einen bestimmten Befehl auszuführen, wie z. B. diesen ).

All dies geschieht mit einem hart programmierten Mikrocode (physisch im Prozessor in einem ROM eingebettet, der während der Herstellung festgelegt wird), der den Fluss durch die tatsächlichen Low-Level- Logikgatter leitet . Dies stellt eine Schnittstelle zwischen den abstrakten Montageanweisungen und der physikalischen elektrischen Logik im Prozessor bereit.


Zusammenfassend werden also Prozessoranweisungen vom Prozessor zusammengestellt und geladen. Der Prozessor verwendet dann diese Anweisungen, um das Mikroprogramm (in Form eines Mikrocodes) entsprechend dieser bestimmten Anweisung nachzuschlagen, was "tatsächlich" die Anweisung ausführt. Sobald die Mikrocodes für die bestimmte Anweisung ausgeführt wurden (was einen oder mehrere Taktzyklen dauern kann), führt der Prozessor den Mikrocode aus, um die nächste Anweisung abzurufen, und der Zyklus wiederholt sich.

Ok, ich verstehe, denke ich :) Also schaltet der Befehl Bits um, der den Prozessor veranlasst, bestimmte Dinge mit den empfangenen Daten zu tun? Simon Verbeke vor 13 Jahren 2
@ Simon Verbeke, genau richtig. Sie schalten lediglich die Schalter um, um den Fluss der elektrischen Signale im Prozessor zu lenken (was dazu führen kann, dass weitere Befehle erneut geladen werden!). Die Switch-Analogie ist gut, da alles digital ist (entweder logisch 1/0 oder wahr / falsch). Der logische Pegel ist nur eine tatsächliche Spannung. Es ist Sache des Ingenieurs, anzugeben, was eine 0 oder eine 1 ist (zum Beispiel könnte eine logische 1 als mehr als 2 Volt angegeben werden). Breakthrough vor 13 Jahren 4
"Binäre äquivalente Anweisungen", auf die der Compiler oder Assembler alles aufbaut, werden als Opcodes bezeichnet. Wenn Sie die Opcode-Struktur einer RISC-Architektur wie MIPS oder ARM betrachten, können Sie sehen, wie verschiedene Bits im Opcode bestimmten Operationen zugeordnet werden. Intel hat aufgrund seiner Langlebigkeit und der Tendenz, immer und immer wieder erweitert zu werden, keine einfache Mapping-Struktur mehr. LawrenceC vor 13 Jahren 1
@ultrasawblade danke, das ist richtig. Ich habe den ersten Absatz der Antwort aktualisiert, um dies korrekt wiederzugeben (Anweisungen sind Opcodes und Register / Adressen). Ich würde jedoch behaupten, dass die Entscheidung von Intel, sich für eine Architektur von [CISC] (http://en.wikipedia.org/wiki/Complex_instruction_set_computer) zu entscheiden, wenig mit ihrer Langlebigkeit und mehr mit ihrem Performance-Layout (z. B. spezifisch) zu tun hat Anweisungen zur Videokodierung, die mit Bewegungsvektoren umgehen). Breakthrough vor 13 Jahren 0
Nein, ich sagte, aufgrund der Langlebigkeit und der zeitlichen und zeitlichen Erweiterung der x86-Architektur ist das Mapping einzelner Bits in Operationscodes auf Mikrooperationen nicht einfach sauber, wie in MIPS oder ARM zu einem gewissen Grad (siehe http://www.d.umn.edu/~gshute/spimsal/talref.html, zum Beispiel sind Intel-Opcodes nichts dergleichen). Ich glaube nicht, dass "RISC" viel zu spüren war, als Intel 1978 x86-Prozessoren auf den Markt brachte. LawrenceC vor 13 Jahren 3
Tut mir leid für diese Fehlinterpretation. Übrigens: [erstaunliche Referenzseite] (http://www.d.umn.edu/~gshute/spimsal/), auf die Sie dort verlinkt haben, +1. Breakthrough vor 13 Jahren 0
Es sei darauf hingewiesen, dass nur ** einige ** CPUs mikrocodiert sind. Einige (meist kleinere Geräte) arbeiten direkt mit den Assemblycodes zusammen. Das hängt von der Architektur ab. Fake Name vor 13 Jahren 5
@Fake Name, ja, Sie haben Recht - der Begriff dafür ist eine festverdrahtete CPU (im Gegensatz zu einer Mikrocodierung, wie Sie gesagt haben). Für alle, die mehr erfahren möchten, [hier ist eine großartige Ressource] (http://foldoc.org/microcode) von der erstaunlichen [FOLDOC] (http://foldoc.org/). Breakthrough vor 13 Jahren 0
Ich habe noch nie zuvor "Hard-Wired" gehört. Es ist immer nur mikrocodiert oder nicht mikrocodiert, z. B. normal. Dann arbeite ich fast ausschließlich mit eingebetteten Mikrocontrollern. Es ist erwähnenswert, dass ein Prozessor, der nicht mikrocodiert ist, immer noch mehrere Taktzyklen benötigen kann, um jeden Befehl auszuführen. Eines der Geräte, mit denen ich viel arbeite, verwaltet alle 4 Taktzyklen eine Anweisung. Fake Name vor 13 Jahren 0
@Breakthrough, Wenn Sie sagen "Diese Logiksignale werden von der CPU interpretiert", wie kann eine CPU interpretieren? Es ist wie ein Computer in einem Computer, eine unendliche Frage! Oder wann wird das Binärsignal zu "Logiksignalen"? trogne vor 6 Jahren 0
@trogne, was ich mit "interpretiert" meinte, sind die Signale, die von Logikgattern verwendet werden, um Teile der CPU basierend auf dem, was die Signale sind, ein- / auszuschalten, wodurch die "Interpretation" der Signale erreicht wird. Am Ende des Tages gibt es grundlegende Gatter (XOR, NOR, NAND, AND, OR), die diese speziellen Anweisungen ausführen. Gute Frage :) Breakthrough vor 6 Jahren 1
37
Craig Gidney

Der Prozessor weiß nicht wirklich, was die Befehle sind. Die Befehle sind lediglich binäre Muster, die den Prozessor dazu veranlassen, das zu tun, was wir als Befehle 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 die Ausgabe des Addierers anstelle der verschiedenen anderen Elemente verwendet und die Ausgabe 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 reale Prozessoren sehr komplizierte Optimierungen verwenden.

Es ist so, als ob Sie fragen, wie ein Auto weiß, dass es langsamer wird, wenn Sie die Bremsen betätigen. Das Auto weiß nicht, das Bremspedal steuert nur indirekt, wie harte Beläge gegen die Räder gedrückt werden.

Nizza Analogie zum Bremspedal von Autos. rjmunro vor 13 Jahren 5
10
Nate

Nehmen Sie zum Beispiel die Anweisung, die einen x86 / IA-32-Prozessor anweist, einen unmittelbaren 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. Der Bezeichner 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 für den Benutzer lesbarer gemacht werden, indem er wie folgt hexadezimal ausgedrückt wird

B0 61

Hier bedeutet B0 'Eine Kopie des folgenden Werts in AL verschieben', und 61 ist eine hexadezimale Darstellung des Werts 01100001, der in Dezimalzahl 97 ist. Die Assemblersprache von Intel enthält das mnemonische MOV (eine Abkürzung für "Move") für Anweisungen wie diese, sodass der obige Maschinencode in der Assemblersprache wie folgt geschrieben werden kann. Falls erforderlich, wird nach dem Semikolon ein erklärender Kommentar hinzugefügt. Dies ist viel einfacher zu lesen und zu merken.

http://en.wikipedia.org/wiki/Assembler_language

Mit anderen Worten, wenn Sie Ihr Montageprogramm "zusammenbauen", werden Ihre Anweisungen wie z

MOV AL, 61h

werden in Zahlen umgewandelt, die der CPU eine spezielle Bedeutung zuordnen und dann entsprechend handeln.

Es ist auch erwähnenswert, dass die Zuordnung des mnemonischen Symbols "mov" zu diesem bestimmten Bitmuster * völlig * willkürlich war. Ich könnte prinzipiell einen Assembler schreiben, der diese Anweisung "oof" genannt hat, und es würde genauso gut funktionieren, abgesehen davon, dass es schwieriger ist, sich daran zu erinnern. dmckee vor 13 Jahren 2
6
nibot

Vorgeschlagene Literatur:

Lesen Sie auch die Kursnotizen aus CS152: Computer Architecture and Engineering an der UC Berkeley, einem Kurs, in dem die Studenten eine CPU implementieren.

Wenn Sie nach "selbstgebauter CPU" suchen, werden Sie viele Goodies finden.

4
n0pe

Auf der untersten Ebene kann die CPU nur noch hinzufügen. Von der Addition kann es subtrahieren, multiplizieren und dividieren (da dies nur eine Addition auf unterschiedliche Art und Weise ist). Die CPU verwendet dies, um Daten in den Speicher zu verschieben, indem die Zusätze auf Speicheradressen angewendet werden.

Beachten Sie jedoch, dass dies auf der niedrigsten möglichen Ebene liegt. Die CPU "versteht" tatsächlich bestimmte Befehle in Form eines Mikrocodes. Siehe die Antwort von Breakthrough, sie ist sehr gut geschrieben.

Logische Operationen wie AND, OR und NOT sowie Bit-Shifting sind grundlegender als das Hinzufügen. Das Hinzufügen kann tatsächlich in Form dieser Operationen ausgedrückt werden. Es gibt tatsächlich diskrete ICs (die Texas Instruments LS-Serie), die diese Operationen nur durchführen, und es ist möglich, eine CPU daraus zu bauen. Google "Pong-Schaltplan", um zu sehen, wie zum Beispiel ein Spiel ohne CPU erstellt wird. LawrenceC vor 13 Jahren 7
Ich meinte von einem Software-Standpunkt aus :) Ja, in Bezug auf Hardware / Logik haben Sie eine verrückte Menge an NAND- und NOR-Gattern. Guter Punkt. n0pe vor 13 Jahren 0
2
Lie Ryan

Ich habe auf programmers.stackexchange.com eine verwandte Antwort gegeben, siehe Wie funktionieren Computer? Dort ging ich von Grund auf kurz darüber, wie Computer Anweisungen zum Bewegen von Elektronen interpretieren.