Was macht die 8086-CPU mit den Daten, die von einer Adresse im RAM zurückgegeben werden?

Ich verstehe, wie eine CPU ziemlich gut funktioniert, aber es gibt eine Sache, die ich nie wirklich verstanden habe.

Angenommen, wir haben eine Intel 8086-CPU (16 Bit breite Register), die gerade dabei ist, ihre nächste Anweisung aus dem RAM zu holen (ebenfalls mit einer Datenbreite von 16 Bit). Wenn die CPU die Anweisung abruft, sagen wir bei 0x44AB, was genau gibt RAM zurück? Ist es ein 8-Bit-Opcode und ein 8-Bit-Operand? Gibt es einen 16-Bit-Opcode zurück und wird der Operand dann in 0x44AC gespeichert?

Im ersten Fall können Operanden keinen Wert größer als 0xFF (255) haben, aber warum sollten Sie dann 16-Bit-Register haben? Im zweiten Fall muss der Programmzähler zwischen jeder Anweisung um zwei erhöht werden und Sie verbrauchen doppelt so viel Speicher.

Wie funktioniert das? Die Frage mag etwas vage erscheinen, aber ich frage mich nur, was die CPU mit den Daten macht, die von einer Adresse im RAM zurückgegeben werden.

BEARBEITEN: Die Frage wurde spezifischer gemacht, damit es einfacher ist, eine gute Antwort zu geben.

Der RAM gibt die 16 einzelnen Einsen und Nullen an der angegebenen Adresse zurück. Je nach CPU kann das 1/2 eines Opcodes, 1 Opcode oder zwei Opcodes sein.
CPUs arbeiten je nach Architektur unterschiedlich. Meinst du "die beliebtesten Intel-CPUs" oder etwas anderes?
Dies hängt alles von der ISA (Instruction Set Architecture) dieser CPU ab. Sie sind alle unterschiedlich. Auch innerhalb einer ISA finden Sie in der Regel mehrere unterschiedliche Unterrichtsformate.
all I'm asking is really what the CPU does with the data returned from an address in RAM.stimmt nicht übereinHow are programs stored in RAM?
Sie können den Wikipedia-Artikel zu 8086 lesen: en.wikipedia.org/wiki/Intel_8086 . Ich hoffe, Sie haben verstanden, dass die Anweisung aus der Anweisungswarteschlange und nicht aus dem RAM abgerufen wird. Wenn Sie an diesem Bereich interessiert sind, können Sie kostenlos von der Saylor Academy lernen: learn.saylor.org Sie haben einen kostenlosen Online-Kurs über Computerarchitektur
@Frævik, wenn Sie die gewünschte Antwort erhalten haben, vergessen Sie bitte nicht, sie zu akzeptieren. Dies verhindert, dass das System es von Zeit zu Zeit stößt.

Antworten (2)

Auch bei der 8086-CPU besteht der Programmcode nicht nur aus Datenbytes im Speicher, und die Bitzahl der Register hat fast nichts mit der Opcode-Länge zu tun, da Sie Bytes oder 16-Bit-Wörter verschieben und auch weit zu 32 springen können -Bit-Adresse (definiert durch Segment und Offset).

Da der 8086 eine CPU mit einem 16-Bit-Bus ist und die Opcodes 1 bis 6 Bytes lang sein können, können die Opcodes in irgendeiner Weise auf den Speicher ausgerichtet sein oder auch nicht. Eine typische Optimierung (manuell oder durch Compiler) besteht jedoch darin, 16-Bit-Variablen und Ziele für Codesprünge an geraden Adressen im Speicher zu platzieren.

Das liegt daran, dass der Bus 16 Bit breit ist, also muss er 16-Bit-Speicher an jeder geraden Speicheradresse haben, und alle ungeraden Speicheradressen sind einfach der obere 8-Bit-Teil des 16-Bit-Busses.

Wenn es also einen Befehl gibt, der die CPU anweist, Code bei 0x44AB auszuführen, was eine ungerade Adresse ist, liest die CPU-Busschnittstelleneinheit (BIU) zuerst ein 8-Bit-Byte von dieser Adresse in die Prefetch-Warteschlange und fährt fort Abrufen von 16-Bit-Wörtern auf einmal ab Adresse 0x44AC in die Prefetch-Warteschlange.

Die CPU-Ausführungseinheit (EU) nimmt einfach Bytes aus der Prefetch-Warteschlange oder wartet darauf, dass Bytes erscheinen, wenn sie leer ist, und decodiert dann die Opcodes und nimmt eine beliebige Menge an Bytes, die aus der Warteschlange erforderlich ist, um die Opcodes vollständig zu decodieren.

Wenn Sie auf ungerade Adressen lesend oder schreibend auf ein 16-Bit-Wort zugreifen möchten, muss die BIU zwei 8-Bit-Zugriffe durchführen. Es muss auf ein Byte im oberen Teil von 16 Bits einer Speicherstelle und auf das andere Byte im unteren Teil von 16 Bits der nächsten Speicherstelle zugreifen.

Beim Ausführen des Programms liest die CPU zuerst den Opcode ein und decodiert ihn dann, um zu entscheiden, wie viele weitere Bytes sie gegebenenfalls in aufeinanderfolgenden Zyklen abrufen muss, um die Anweisung zu erfüllen.

Das, was „entscheidet“, ist der CPU- Mikrocode , ein internes Programm / eine endliche Zustandsmaschine, die den Zyklus-für-Zyklus-Betrieb der CPU steuert. Der Mikrocode decodiert auch die Anweisung, um die von der Anweisung aufgerufenen Datenbewegungen auszuführen.

Die x86-Architektur hat Anweisungen mit variabler Länge und Operanden mit variabler Größe. Der x86-Mikrocode findet all dies heraus, wenn er den Opcode decodiert. Andere Maschinen, insbesondere RISC, können Operationscodes mit fester Länge verwenden, werden aber dennoch Operanden unterschiedlicher Größe handhaben. Dies vereinfacht die Befehlsdecodierung und erhöht die Geschwindigkeit, geht aber auf Kosten der Befehlsdichte.

RISC oder CISC (z. B. x86), der Compiler / Assembler / Linker stellt ein ausführbares Programm zusammen, so dass die Bytefolgen mit genauem Wissen darüber angeordnet sind, wie die CPU Opcodes und Operanden holt.

Die CPU, die das kompilierte Programm ausführt, geht somit davon aus, dass das, was sie liest, in der richtigen Reihenfolge und im richtigen Format ist; und solange das Programm korrekt gebaut wurde, wird dies der Fall sein. Die „richtige Reihenfolge“ wird durch den Befehlssatz definiert , wobei das Format und die Länge jeder Anweisung durch den anfänglichen Opcode bestimmt werden.

Andernfalls gibt es für eine laufende CPU keine Möglichkeit, explizit aus den Daten selbst zu erkennen, ob das eingelesene Opcode, Opcode-Erweiterung, Operand oder zufälliger Müll ist. Das weiß nur der CPU-Mikrocode.

Dies mag detaillierter sein, als jeder möchte, aber der 8086 ist komplizierter als das. Die Entscheidung zwischen 1 Byte und 2 Bytes wird vom Group Decode ROM getroffen, das sich außerhalb des Mikrocodes befindet. Einfache 1-Byte-Anweisungen oder Präfixe verwenden den Mikrocode überhaupt nicht. Der Mikrocode erhält dann nach Bedarf zusätzliche Bytes aus dem Prefetch-Puffer. Einzelheiten finden Sie im Patent: patents.google.com/patent/US4449184A