Seite 1 von 1

Hausuebung 1 Aufgabe 2

Verfasst: 1. Nov 2007 21:15
von Nacht-Schatten
Gude,

Hausuebung 1 Aufgabe 2 Zeile 10
->lb $t3 , 0( $t1)

Was bewirkt dieser Befehl?
Laut Beschreibung wird der Speicherinhalt geladen.
Dieser ist aber unbekannt.

Hat jemand eine gloreiche Idee?

Re: Hausuebung 1 Aufgabe 2

Verfasst: 1. Nov 2007 22:03
von Thorti
Hallo,
Nacht-Schatten hat geschrieben:->lb $t3 , 0( $t1)

Was bewirkt dieser Befehl?
Laut Beschreibung wird der Speicherinhalt geladen.
Genau. Es wird der Inhalt der an der Adresse 0+$t1 steht in das Register $t3 geladen.
Dieser ist aber unbekannt.
Wieso? :shock:
Hat jemand eine gloreiche Idee?
Schau dir nochmal das ganze Programm an.

Gruss Thorti

Verfasst: 2. Nov 2007 19:08
von Trusterrer
Ich hätte mal ne allgemeine Frage zu dieser Aufgabe. Funktioniert dieses Programm überhaupt bzw macht es überhaupt Sinn?
Schau ich mir alleine die Zeilen 5-7 an weis ich nicht was ich davon halten soll.

Code: Alles auswählen

5   la $t0, str
#die Addr. des Strings wird in $t0 geladen, ist klar

Code: Alles auswählen

6   or $t1, $t0, $zero
#wieso sollte man nun die Addr. bitweise mit 0 verodern zumal die Addr. nur aus Schmodder besteht mit dem nur der Assembler was anfangen kann

Code: Alles auswählen

7   xor $v0, $t0, $t1 
#jetzt kommts noch doller und der Quatsch den wir eben gerade berechnet haben wird noch mit xor verwurschtelt. Wie auch immer bei mir ist nach der Ausführung $v0 immer und zu jeder Zeit "0"

Ich glaube ich habe hier ein allgemeines Verständnissproblem. Kann mich mal jemand aufklären?

Verfasst: 2. Nov 2007 22:09
von m0ep
joa diese Stelle ist echt ein bissel Sinnlos .... da ja immer wenn man die selben Werte 'xort' 0 bei rauskommt ... naja wir sollen das Prog ja nur verstehen und nicht nachschauen ob es Sinn macht =)

Verfasst: 2. Nov 2007 22:36
von MisterD123
ich glaube die frage "was steht allgemein in v0" ist mehr auf syscall ids und funktionsrückgaben bezogen..

Verfasst: 2. Nov 2007 23:06
von citta
Kann das ein Tutor bestätigen? Ich glaub ja nicht, dass so ne einfache Recherche 4 Punkte bringt. Ich hab das mit "Welche Werte nimmt $v0 an, abhängig von str?" interpretiert.

Verfasst: 2. Nov 2007 23:27
von m0ep
Ich hab sicherheitshalber beides hingeschrieben ^^

Verfasst: 2. Nov 2007 23:56
von Trusterrer
wenn in $v0 immer "0" drin steht bringt einem string ausgabe mit syscall etc auch nix, denn eine 0 Adresse ist und bleibt leer

Verfasst: 3. Nov 2007 09:43
von Sascha
Trusterrer hat geschrieben:Ich hätte mal ne allgemeine Frage zu dieser Aufgabe. Funktioniert dieses Programm überhaupt bzw macht es überhaupt Sinn?
Ja, es funktioniert, und ja, es ist sinnvoll.

Code: Alles auswählen

6   or $t1, $t0, $zero
#wieso sollte man nun die Addr. bitweise mit 0 verodern zumal die Addr. nur aus Schmodder besteht mit dem nur der Assembler was anfangen kann
Was kommt denn dabei raus, wenn man das so macht? Man möchte den Inhalt von $t0 nach $t1 bringen. Eine direkte Zuweisung gibt es aber nicht als Hardware-Opcode, also muss man sich anders behelfen. Zwar ist "move" ein Pseudobefehl, der das macht, aber auch er wird als eine Verknüpfung mit $zero umgesetzt. (Beim Mars scheinbar als "addu $t1, $zero, $t0".)

Code: Alles auswählen

7   xor $v0, $t0, $t1 
#jetzt kommts noch doller und der Quatsch den wir eben gerade berechnet haben wird noch mit xor verwurschtelt.
Das ist zugegebenermaßen etwas unorthodox, aber auch hier zählt, was am Ende rauskommt. Auf Assemblerebene muss man etwas tricksen und Befehle zweckentfremden, um kleinen und schnellen Code zu bekommen. Hier ging es darum, ein "li" zu vermeiden, das nämlich in zwei Opcodes umgesetzt wird. Klar geht das auch anders, aber ist es so "schlechter"?
Wie auch immer bei mir ist nach der Ausführung $v0 immer und zu jeder Zeit "0"
Wenn man das Programm tatsächlich bis zum Schluss durchgerechnet hat, sollte klar geworden sein, was der Sinn davon ist. Dann weiß man auch, was für andere Eingabedaten herauskäme. (Das ist mit der Frage d gemeint.)

Verfasst: 3. Nov 2007 10:59
von banshee
Ich hatte da schon was raus. Kann es sein, dass $v0 eine Flag-Funktion hatte? :)

und im 1. Teil ist $v0 natürlich immer 0

/edit: ja sorry, mir is dann auch eingefallen, dass Abgabe erst am Montag ist :)

Verfasst: 3. Nov 2007 11:01
von Sascha
Bitte keine vollständigen Lösungsversuche zu Hausübungen posten.

Verfasst: 3. Nov 2007 12:30
von jno
Noch mal zur ursprünglichen Frage, was der Load-byte-Befehl bewirkt, ich glaube, mir ist es noch nicht ganz klar. Mal angenommen, der Wert des Registers sei bekannt, zB $t0 = 111_2. Was würde dann lb $t3, 0($t1) bewirken? Oder hat das gar nichts mit dem Wert, der da drin steht zu tun? :-/ Also, die 2b) könnt ich wahrscheinlich hinschreiben, kann ja nur ein Wert drin stehen, wenns keine Endlosschleife werden soll, aber ich möcht halt gerne verstehen, warum...

Verfasst: 3. Nov 2007 12:34
von Sascha
jno hat geschrieben:Mal angenommen, der Wert des Registers sei bekannt, zB $t0 = 111_2. Was würde dann lb $t3, 0($t1) bewirken?
Wenn in $t1 der Wert 111_2 stünde, dann würde durch lb $t3, 0($t1) ein Byte von der Speicheradresse 0 + 111_2 = 7 geladen und in $t3 abgespeichert werden. Mit $t0 hat das nichts zu tun.

Verfasst: 3. Nov 2007 12:50
von jno
oh, ja natürlich, sollte auch beides mal $t0 sein, hab mich vertippt. Danke.