X86_64-Architektur, wie geht sie mit Anweisungen um, die größer als 64 Bit sind?

Ich habe mich mehr mit der Funktionsweise der CPU beschäftigt und habe eine Frage. Wenn ich eine Anweisung habe, die zB eine 64-Bit-Adresse und ein Register nimmt und den Wert von dieser Adresse in das Register kopiert. Und dieser Befehl hat einen 2-Byte-Opcode. Nehmen wir dann an, dass die gesamte Anweisung 80 Bit groß ist. (8 Byte) Wie würde sie diese Anweisung dann ausführen? Da ich vermute, dass es nicht in das Befehlsregister passt (weil das Register 64 Bit hat). Nimmt es einfach den Opcode und ruft die Adresse (und später den Wert) ab und registriert sich später? Oder hat es mehrere Register? Oder hat es ein mega großes Befehlsregister, um alles unterzubringen?

Danke!

Ich habe früher bei Intel gearbeitet und Chipsatztests durchgeführt. Die Intel-Architektur verwendete einen internen 32-Byte-Puffer und stellte ausreichend Logik bereit, um bis zu drei einfache Anweisungen pro Takt aus diesem Puffer zu analysieren. (Es konnte jedoch nur eine komplexe Anweisung pro Takt verarbeiten.) Diese wurden in den ROB (Neuordnungspuffer) übersetzt, der eigentlich nur ein Satz von RISC-Anweisungen ist, die die x86-Anweisungen implementieren und gleichzeitig eine Ausführung außerhalb der Reihenfolge ermöglichen. Die "Retire-Unit" vervollständigt den Prozess, indem sie sicherstellt, dass sie RISC-Befehle im ROB "in der Reihenfolge" zurückzieht.
@jonk Also 32 Bytes für die Anweisung. Aber wie analysiert es die Anweisung? Nimmt es nur die Anweisung und verwendet eine Mikrocodetabelle, um herauszufinden, welche Mikroanweisungen ausgeführt werden müssen, oder ist es komplizierter? Habe ich auch Recht, dass diese "RISC-Anweisungen, die x86-Anweisungen implementieren" die Mikroanweisungen sind, von denen ich spreche? Danke!

Antworten (2)

Eine 64-Bit-Architektur zu sein bedeutet nicht, dass es ein einziges 64-Bit-Befehlsregister gibt, in das alles passen muss. X86_64-Befehle können bis zu 15 Byte lang sein. Jeder Opcode wird zur Ausführung decodiert. In Ihrem Beispiel gäbe es einen Opcode zum Verschieben von Daten, der ein weiteres Opcode-Byte benötigt, um zu wissen, was zu tun ist, und dann weiß er, dass eine 64-Bit-Direktadresse folgt, die gelesen werden muss, und welches Register das Ziel sein wird.

Tatsächlich gibt es gültige Kombinationen von Befehlspräfixen und -suffixen, die verwendet werden können, um einen sinnvollen x86_64-Befehl mit einer Länge von mehr als 15 Bytes zu erstellen. Diese sind jedoch per Definition illegal, da der Prozessor Befehle > 15 Bytes verbietet, denke ich, um Befehlsdecoder zu vereinfachen.
Tatsächlich könnte die theoretische Antwort unendlich sein. Bestehende Prozessoren haben jedoch eine Grenze, nach der sie eine Ausnahme auslösen.
Ich verstehe nicht wirklich. Warum braucht/hat es 2 Opcodes? Und wenn es weiß, dass die nächsten 64 Bits die Adresse sind, wie liest es sie? Holt es es aus dem RAM/Cache oder hat es es vorher in einem Register gespeichert?
Nun, Sie sagten, es hat zwei Bytes. Ich habe nicht nach der Opcode-Map gesucht, wie diese Art von Operation codiert werden kann. Wenn es zwei Bytes benötigt, kann es eindeutig nicht in ein Byte passen. Das erste Byte gibt an, dass es sich um eine Verschiebungsoperation handelt, aber das zweite gibt an, um welche Art von Verschiebungsoperation es sich speziell handelt. Intern, wer weiß, wie es gespeichert ist, aber der Programmzähler sagt einfach, wo die Anweisung abgerufen werden soll, und der Decoder sieht sich dann die Bytes an und weiß, dass er den durch die unmittelbare Adresse bei PC + 2 definierten Speicher lesen und in einem durch definierten Register speichern muss der Opcode. Das würde ein mit einer Opcode-Karte bewaffneter Mensch tun.
Ah, so hast du es gemeint. Ich dachte an etwas anderes. Ich meinte diese 2 Bytes ursprünglich als einen Opcode, aber Ihr Weg scheint besser zu sein. Habe ich Recht, dass der "Decoder" die Anweisung tatsächlich ausführt, also: Die Anweisung wird geladen, dann sieht sich der "Decoder" sie an und tut, was für diese Anweisung programmiert ist, z. B. den Wert von einer Adresse abrufen und dann Kopieren Sie es in ein Register. (Wie in meinem ersten Beitrag beschrieben)?

X86 unterstützt Anweisungen mit variabler Länge, daher ist das "Anweisungsregister" nicht sehr einfach oder auf 64 Bit beschränkt. Die CPU verfügt über einen ziemlich komplexen Parser, der die Länge der Anweisungen bestimmt und mehrere aufeinanderfolgende Anweisungen gleichzeitig extrahieren kann.

Wie funktioniert dieser Parser? Gibt es eine Seite wo ich das nachlesen kann?
@appmaker1358 Nicht wirklich; es ist proprietär von Intel (oder AMD). Sie können sich jedoch einige Möglichkeiten vorstellen, wie es möglicherweise funktionieren könnte. Es könnte Sie interessieren zu wissen, dass Daten jeweils 512 Bits aus dem Datencache kommen - ich bin mir nicht sicher, wie viele Daten gleichzeitig aus dem Anweisungscache kommen, aber ich würde 256 oder 512 Bits schätzen.