Bereich der MIPS j-Anweisung

Ich verstehe, dass für MIPS-32 die ersten 4 Bits der Adresse, zu der gesprungen werden soll, von den ersten 4 Bits der Adresse des j-Befehls genommen werden, was bedeutet, dass wir eine Grenze von 2 ^ 28 Bits um die Adresse des j haben Anweisung, zu der wir springen können. Online heißt es, dass diese Grenze 256 MB beträgt, aber 2 ^ 28 Bits sind 32 MB und nicht 256 MB. Kann jemand erklären, warum es 256 MB ist?

Antworten (2)

Die Adressierung in den meisten CPU-Kernen, die ich kenne, funktioniert pro Byte. Sie adressieren keine einzelnen Bits.

Das MIPS erfordert, dass seine Anweisungen 4-Byte (Wort) ausgerichtet sind – dh die beiden LSBs sind immer Null. Auf diese Weise sind sie nicht in den Anweisungen codiert.

Die Antwort von @sherrelbc erklärt es ziemlich ausführlich, obwohl ich die Semantik von "word-aligned" mehr mag als "word-addressed" .

Der Link, den @valcroft gegeben hat, hat auch die Antwort auf der Mitte der Seite:

Pseudo-direkte Adressierung

Direkte Adressierung bedeutet die Angabe einer vollständigen 32-Bit-Adresse in der Anweisung selbst. Da MIPS-Anweisungen jedoch 32 Bit sind, können wir das nicht tun. Theoretisch benötigen Sie nur 30 Bits, um die Adresse einer Anweisung im Speicher anzugeben. MIPS verwendet jedoch 6 Bits für den Opcode, sodass immer noch nicht genügend Bits für eine echte direkte Adressierung vorhanden sind. Stattdessen können wir eine pseudodirekte Adressierung durchführen. Dies geschieht in j-Befehlen.

| Opcode  |              Target              |
|---------|----------------------------------|
|  B31-26 |               B25-0              |
| oooo oo | tt tttt tttt tttt tttt tttt tttt |

Für das Ziel werden 26 Bit verwendet. So wird die Adresse für die pseudodirekte Adressierung berechnet.

PC <- PC31-28::IR25-0::00

Nehmen Sie die oberen 4 Bits des PC, verketten Sie diese mit den 26 Bits, aus denen das Ziel besteht, und verketten Sie diese mit 00. Dies erzeugt eine 32-Bit-Adresse. Dies ist die neue Adresse des PCs.

26 Bits um zwei nach links verschoben ergeben also eine relative Adressgrenze von 2 28 .

2 28 B j T e S Ist 256 M ich B , oder 256 1024 2 .

Die MIPS-Architektur adressiert Anweisungen wortweise.
@sherrellbc Ja, du hast recht, ich werde die Antwort korrigieren.

Tatsächlich sind die ersten 6 Bits der Anweisung der Opcode . Diese Bits werden von dem Steuermodul im Datenpfad verwendet, um zu bestimmen, welche Steuersignale geltend zu machen sind, um die Ausführung des Befehls zu erleichtern.

Geben Sie hier die Bildbeschreibung ein

Der Opcode ist in den Bits 31 bis 26 enthalten, die in das Steuermodul eingespeist werden. Wie Sie im obigen Bild sehen können, werden die unteren 26 Bits der Anweisung zweimal nach links verschoben und mit den oberen 4 Bits verkettet , die bereits im Programmzähler (PC) enthalten sind. Dies ist ein direktes Ergebnis davon, dass MIPS wortadressiert ist (32 Bits = 4 Bytes = 1 MIPS-Wort) und nicht byteadressiert ist , sodass die doppelte Linksverschiebung es uns ermöglicht, 2^28 oder 268.435.456 (256 MiB) Befehlswörter innerhalb der zu adressieren Bereich der 4 höchstwertigen Bits des PC. Wenn der Opcode so ist, dass ein Sprung ausgeführt werden soll, dann wählt der obere rechte Mux diesen neuen verketteten PC-Wert aus, und die nächste abzurufende Anweisung befindet sich an der neuen Adresse.

Tatsächlich wird der PC bereits um 4 oder eine Anweisung inkrementiert, bevor er verkettet wird.

Ich dachte, MIPS sei byteadressierbar? Obwohl Anweisungen wortausgerichtet sind.
Außerdem bin ich damit nicht einverstanden: "Die doppelte Linksverschiebung ermöglicht es uns, 2 ^ 28 oder 268.435.456 (256 MiB) Anweisungswörter zu adressieren, die vom aktuellen verschoben sind." Wenn unsere j-Anweisung bei 0xFFFFFFFF ist, muss alles, zu dem wir springen, eine Adresse haben, die mit "F" beginnt. Natürlich ist es unter der obigen Einschränkung nicht möglich, 2 ^ 28 Wörter nach 0xFFFFFFFF zu springen. Wir können jedoch zu jeder Adresse innerhalb des 256-MB-Bereichs springen, der alle Adressen enthält, die mit "F" beginnen.
@Vizuna, Datenspeicher ist byteadressierbar; Ich bezog mich auf die Befehlsspeicheradressierung. Und ja, Sie haben Recht mit dem, was Sie gesagt haben. In beiden Fällen haben Sie jedoch immer noch eine Reihe von 256-MiB-Anweisungen. Auch der Hinweis, dass wir nicht über 0xFFFFFFFF hinaus springen können, ist offensichtlich. Über diesen Punkt hinaus kann der PC den Befehlsspeicher nicht adressieren. Tatsächlich existieren solche Adressen in MIPS sowieso nicht.