Implementieren des direkten Adressierungsmodus für einen Ladebefehl auf einer MIPS-Architektur

Gegeben sei eine Mips-Maschine mit 26-Bit-Adressen und 32-Bit-Datenpfaden, wobei die Ladeanweisung wie folgt lautet

|OPT-Code|rs|rd|sofort|

|6 Bits |5 Bits|5 Bits|16 Bits|

Der OPT-Code ist der Befehlstyp (lw), rd ist, wohin der Wert geladen wird, rs ist das Basisregister und unmittelbar ist der Offset. Mips unterstützt nur den Verschiebungsmodus, was bedeutet:

 lw $t9, ($t7)60

ist das gleiche wie

 Reg[$t9]<-M[Reg[$t7]+60]

Dies ist eine typische Mips-Ladung, aber was wäre, wenn ich eine indirekte Adressladung in der Steuereinheit implementieren wollte, indem ich die Fehlkonstruktionen für den indirekten Adressmodus ähnlich einem einfachen Cisc-Computer schreibe. Wo sich die Adresse des Werts im Speicher befindet. ist dies in einer Anweisung möglich?

Bearbeiten:

Das ist, was ich in einer Anweisung suche:

Reg[$t9]<-M[Addrs]

oder noch besser

Reg[$t9]<-M[M[Addrs]]
Ich bin mir nicht sicher, ob ich dir ganz folgen kann. Können Sie eine Pseudo-Anweisung schreiben, um zu demonstrieren, was Sie meinen? Ist es Reg[$t9]<-M[addr]das, wonach Sie suchen?
ja das ist genau das was ich suche

Antworten (1)

Nicht als eine einzige Anweisung, nein. Grundsätzlich, weil MIPS als 32-Bit-Befehl keinen Platz hat, um sowohl einen Opcode, ein Zielregister als auch eine 32-Bit-Adresse zu speichern.

Auch wenn Ihr spezielles System nur 26 physische Adresszeilen hat, ist es intern immer noch ein 32-Bit-Adressierungsschema. Diese 26 Adresszeilen können die niedrigsten 26 Bit einer 32-Bit-Adresse darstellen, oder sie können durch eine MMU in irgendeiner Form in verschiedene Bereiche des 4-GiB-Adressraums abgebildet werden.

Um einen Wert von einer Adresse in ein Register zu laden, müssen Sie zuerst die Stelle in ein Register laden und dann den Wert relativ zu diesem Register aus dem Speicher laden.

Wenn der gewünschte Wert zufällig innerhalb der ersten 32768 Bytes des Adressraums liegt, können Sie relativ zum Nullregister darauf zugreifen (ein Offset ist vorzeichenbehaftet, sodass nur 15 Bit davon für den niedrigsten Teil des Speichers gültig sind). . Ein negativer Offset von Null würde Ihnen Zugriff auf die oberen 32767 Bytes des (32-Bit-) Speicherplatzes geben.

Der springende Punkt bei RISC im Gegensatz zu CISC ist, dass Sie ein paar sehr grundlegende Anweisungen haben, die Sie aneinander reihen, um zu tun, was Sie wollen, und nicht eine einzelne Anweisung, die das Ganze für Sie erledigt. In RISC gibt es sehr, sehr wenige Befehle, die mehr als einen Taktzyklus benötigen, um ausgeführt zu werden (nur die Verzweigungsbefehle sind wirklich länger), wohingegen in CISC-Befehlen viel mehr Zyklen zur Ausführung benötigt werden. In RISC verwenden Sie nur die Taktzyklen, die Sie für diese eine bestimmte Aufgabe benötigen, und Sie verschwenden keine Taktzyklen für Anweisungen mit erweiterter Länge, die das tun, was Sie wollen, und andere Dinge, die in anderen Situationen nützlich sein könnten.

Außerdem sorgt RISC für besseres Multitasking, da jede Anweisung im Allgemeinen nur einen Zyklus umfasst, sodass Interrupts schneller auftreten können. Wenn bei CISC eine Anweisung beispielsweise 20 Zyklen zur Ausführung benötigt, kann das System keinen Interrupt ausführen, bis es diese Anweisung beendet hat.

Bei der klassischen 5-stufigen Pipeline dauert das Laden zwei Zyklen (der MIPS R2000 hatte tatsächlich einen Ladeverzögerungsschlitz). Ein Prozessor kann einen Interrupt beginnen, bevor ein vorheriger Befehl abgeschlossen ist; dies ist einfacher, wenn frühzeitig bestimmt werden kann, ob der Befehl eine Ausnahme erzeugt (oder wahrscheinlich erzeugen wird) (z. B. hatte MIPS R4000 eine konservative FP-Ausnahmeerkennung vor der Writeback-Phase der Integer-Pipeline, wodurch präzise Ausnahmen vereinfacht wurden). Es kann aber auch spekuliert werden, dass eine Ausnahme nicht eintritt. Sogar RISCs können sich dafür entscheiden, bei einem Ladefehler nicht anzuhalten. (+1 für fast völlig richtig)