Ich versuchs mal, bin allerdings schon ne Weile ausm Thema raus.
1) Worin manifestiert sich der eigentliche Unterschied zwischen den s und den t Registern?
Hm, also soweit ich weiß, ist es nur eine Konvention die besagt, dass man beim Aufruf von Unterprogrammen, die t-Register nicht sicher muss, s-Register dagegen schon, da irgendwelche wichtigen Zwischenergebnisse drinstehen (z.B. für Rekursion).
2) Ich habe lh mit einer Zahl 12345678 getestet (gespeihert in einem 32Bit Word). Ausgabe der Zahl in der Konsole nach dem Befehl war 24910. Liege ich richtig damit, dass lh die 4 Bytes in 2 Hälften aufspaltet und dann eine Hälfte davon nimmt, in einem neuen Word speichert und den rest mit 0en auffüllt? Was sind die praktischen Anwendungen für den Befehl?
Bei MIPS sind Worte erstmal immer 32bit lang. Mit lw und sw, wird das ganze Wort geladen/gespeichert.
Daneben gibt es halt noch lh/sh (load/store half), für die niederen 16bit und lb/sb (load/store byte), für die niederen 8bit eines Wortes.
Der Nutzen besteht meist darin mit dem char-Datentyp zu arbeiten. In C is dieser 8bit breit und Java 16bit.
3) Was kann ich mir unter dem Befehl lui vorstellen? Was ich bisher zu dem Befehl lese leuchtet mir nicht wirklich ein, aber eventuell muss sich das erst setzen.
lui = load upper immediate
Damit lädst du eine Konstante in die oberen 16bit eines Registers.
4) [...] Die Frage nach den jump-Befehlen juckt mich aber nach wie vor.
jal speichert beim Aufruf die Adresse das darauffolgenden Befehls automatisch im Register ra.
Also:
- 0000: jal 1234 # Springt zu Adresse 1234 und speichert 0001 automatisch in Register ra (return adress)
- 0001:
- ...
- 1234: ...
- 1235: jr $ra # springt in diesem Fall zu 0001 zurück
Generell gilt: Willst du Registerinhalte sichern, nutze immer den Stack!
s-Register in t-Registern zu sichern geht zwar, fliegt dir spätestens bei rekursiven Aufrufen um die Ohren, weil du da oftmals neben mehreren Parametern auch logischerweise die Rücksprungadresse sicher musst.
5) In meinem MIPS-Editor sehe ich für jede Befehlszeile zwei Hexadezimalzahlen. Die eine ist mit der Überschrift Address, die andere mit Code versehen. Was ist Code? Wie steht dieser im Zusammenhang mit dem Programmzeiger?
Code entspricht dem "Maschinencode" der jeweiligen Instruktion. Dabei unterscheidet MIPS drei Instruktionsformate (R-, I- und J-Typ), die alle 32bit lang sind (=8-stellige hexadezimal Zahl)
beispielsweise setzt sich die Instruktion add $t0, $s1, $s2 (R-Typ) folgendermaßen zusammen:
op code: 00000 definiert in diesem Fall einen Befehl für die ALU (es soll gerechnet werden)
register des ersten Operanden: 10001, also t0
register des zweiten Operanden: 10010, also s1
und register des dritten Operanden: 01000, s2
der shift amount ist in dem fall = 00000, da gerechnet werden soll
und zum schluß der funct-code = 10000, welcher der ALU nun genau sagt, ob addiert oder subtrahiert werden soll.
Nochmal der R-Typ zusammengefasst: op | 1. Operand | 2. | 3. | shift amount | funct
dabei sind der op- und der funct-Code 6bit lang und der Rest 5bit, was zusammen dann der 32bit bzw 8-stelligen HexZahl entspricht.
So werden alle Befehle in MIPS kodiert und eigentlich stehen diese nicht wirklich im Zusammenhang mit den Adressen.
Warum die Struktur da so ist, wie sie ist, kann ich dir nicht sagen;) Weiß auch grad nicht obs da ne Konvention für gab... Ich meine mich aber zu erinnern, dass wir den .data Teil immer vor den .text Teil geschrieben haben. Einfach mal ausprobieren... das zweite .text scheint eigentlich unnötig.
Hoffe ich konnte dir wenigstens n bissl helfen 
Gruß,
fey