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