MIPS Unconditional Jump
15.09.2011 16:04:21
Hallo,

Mir wird irgendwie nicht so ganz klar und ich kann mich leider auch nicht mehr erinnern, wie der shifter rechts von der ALU arbeitet.
In der VL wurde dieses Register ja beim unconditional Jump benutzt. Hier sieht die Jump-Adresse dann so aus: PC_31..PC_28 IR_25..IR_0 00.
Wie ich das verstehe braucht man den shifter fuer die 00 am Ende des Wortes, oder?
Waere es dann aber nicht moeglich einfach die 00 statisch anzuhaengen? Oder erfuellt der Shifter eine andere Aufgabe? Wozu braucht man eigentlich noch die hoechsten 4 Bits vom PC? ich dachte Jump springt einfach an die absolute angegebene Adresse x. Irgendwie ist mir das noch ein wenig unklar.

Viele Gruesse
Raphael
Re: MIPS Unconditional Jump
15.09.2011 17:56:24
Hallo,

das sind gute Fragen. Musste mir das selbst noch mal angucken, aber denke jetzt, die richtigen Antworten zu haben:

Im Speicher der MIPS lässt sich jedes einzelne Byte (also Block von 8 Bits) über die angelegte Adresse a1 oder a2 adressieren. Befehle, wo das eine Rolle spielt, haben wir in der Vorlesung allerdings gar nicht betrachtet. Denn die Register der MIPS sind jeweils schon 32 Bits breit = 4 Bytes = 1 Word. Wenn wir mit LOAD etwas aus dem Speicher in eins der Register laden bzw. mit STORE den Inhalt eines Registers im Speicher ablegen, betrachteten wir das immer gleich für komplette Words; mit den Befehlen "load word" und "store word" (kap8.2, S. 3). Man kann sich Fälle vorstellen, wo man auch nur mit einzelnen Bytes im Speicher hantieren will, aber das spielte in der Vorlesung wie gesagt keine Rolle.

Ein Befehlswort der MIPS hat auch 32 Bits = 4 Byte. Die Befehlswörter liegen wie alle anderen Daten auch im Speicher. Der Wert im Program Counter (PC) gibt die Adresse im Speicher an, wo der nächste Befehl liegt. Nun macht es aber keinen Sinn, sich etwa die letzten 3 Bytes von einem Befehlswort und das erste Byte des folgenden Befehlswortes als Befehl zu laden. Daher kann die Adresse eines Befehls immer nur ein vielfaches von 4 sein, denn nur an diesen Stellen kann ein neues 4-Byte-breites Befehlswort anfangen. Deshalb werden die absoluten JUMP-Adressen um zwei Stellen nach links geshiftet, da sie somit durch 4 teilbar sind.

Man könnte sich jetzt fragen, warum es nicht dem Programmierer überlassen wird, darauf zu achten, dass die JUMP-Adressen durch 4 teilbar sind. Das ginge natürlich auch. Aber das hätte den Nachteil, dass damit noch weniger große Sprünge möglich wären. Es stehen ja nur die 26 Bits IR(25:0) des 32-Bit-breiten Befehlswortes zur Verfügung, um dem JUMP-Befehl die neue Sprungadresse mitzugeben. Der Speicher, in dem auch die Befehle stehen, hat allerdings einen Adressraum von 32-Bit. D.h. es ist sowieso unmöglich, im Jump-Befehl eine beliebige Adresse im Speicher anzugeben. (Dafür würde das ganze 32-Bit-Befehlswort benötigt und dann wüsste man ja nicht mehr, was es für ein Befehl sein soll...) Daher kommt es auch, dass die oberen 4 Bits vom PC für die neue Adresse wiederverwertet werden müssen. Man bleibt mit JUMP-Befehlen also immer im selben "Segment" des Speichers, dessen Adressen alle mit den gleichen 4 Bits anfangen. Will man in ein anderes Segment wechseln, muss man die neue Adresse erst in einem anderen Register berechnen und dann in den PC kopieren, was mehrere Zyklen dauert. Ohne den Linksshift der in IR(25:0) stehenden Adresse würden die so voneinander getrennten Segmente im Speicher noch 4 mal so klein und 4 mal so viele sein.

Ein Linksshift um 2 ist übrigens genau das, dass man "statisch 00 anhängt". Oder wo würdest Du den Unterschied sehen?

Ich hoffe, jetzt ist es klarer. Ich kann dazu auch die Vorlesungsaufzeichnungen von 2008 empfehlen, wo manche Sachen zur MIPS etwas ausführlicher dran waren als dieses Semester.

Viele Grüße,
Linus
Re: MIPS Unconditional Jump
15.09.2011 18:36:37
Linus F. schrieb:
-------------------------------------------------------
> Ein Linksshift um 2 ist übrigens genau das, dass
> man "statisch 00 anhängt". Oder wo würdest Du
> den Unterschied sehen?

Ja, hier bin ich faelschlicherweise davon ausgegangen, dass man den 2bit shifter mit einem anderen shifter implementiert und einfach eine 2 anlegt :D Deswegen dachte ich mir 00 Anlegen waere doch billiger, da man ein Bauteil sparen koenne ;) Aber nunja, dieses Bauteil wird ja wahrsch. genau so implementiert sein...
Frag mich nicht, wie ich auf diese abstruse Idee kam :D

Aber vielen Dank fuer die Antwort. Jetzt habe ich's verstanden!

Viele Gruesse
Raphael



1 mal bearbeitet. Zuletzt am 15.09.2011 18:40 von RaphaelS.