Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Technische Informatik (http://www.informatikerboard.de/board/board.php?boardid=7)
--- Assembler, Analyse und Ausführung (http://www.informatikerboard.de/board/thread.php?threadid=2454)


Geschrieben von deppensido am 18.09.2015 um 15:58:

  Assembler, Analyse und Ausführung

hallo,

bei folgendem Aufgabentyp bräuchte ich dringend Hilfe, da nächsten Dienstag Klausur ist und so eine Aufgabe 20 - 25 Punkte bringt, was bei 90 erreichbaren Punkten nicht wenig ist. Es geht in der Regel darum einen Assemblercode zu verstehen, was ich mit der Funktionsskizze versucht habe (siehe Anhang) ich mir jedoch total unsicher bin, ob das so stimmt. Vermutlich eher nicht. Danach soll man in der Regel einen Assemblercode ausführen und die Werte des Stackpointer etc. in einer Tabelle eintragen (siehe Anhang). Hier habe ich überhaupt keine Ahnung, wie ich da vorgehen muss.

Meine Idee bisher: Assemblercode kommentieren, was mir allerdings nicht weitergeholfen hat.

Wie würdet ihr so eine Aufgabe angehen, von der Logik her etc.? Gibt es vielleicht einen Trick oder ähnliches? Ich hoffe mir kann jemand anhand dieser Aufgabe weiterhelfen, bin langsam echt verzweifelt. Es handelt sich übrigens um MIPS-Assemblersprache.



Geschrieben von eulerscheZahl am 18.09.2015 um 17:21:

 

Nachdem ich von MIPS noch nichts gehört habe, würde ich damit anfangen, es in eine für mich lesbare Sprache zu übersetzen (ohne Gewähr):
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
#include <iostream>

using namespace std;

int v0;
int s0;

int lcs(int* a0, int* a1) {
	cout << "a0 = " << *a0 << "   a1 = " << *a1 << "   v0 = " << v0 << endl;
	if (*a0 == 0 || *a1 == 0) //lcs 2. Absatz
		return 0;
	if (*a0 != *a1) { //lcs 3. Absatz 1. Zeile
		//case 2
		a0++; //Zeiger erhöhen
		lcs(a0, a1);
		s0 = v0;
		a0--;
		a1++;
		lcs(a0, a1);
		a1--;
		if (v0 == s0) return 0;
		v0 = s0;
	}
	else { //lcs 3. Absatz ab Zeile 2
		a0++;
		a1++;
		lcs(a0, a1);
		v0++;
		a0--;
		a1--;
		cout << "increment v0:  a0 = " << *a0 << "   a1 = " << *a1 << "   v0 = " << v0 << endl;
	}
}

int main() {
	int a0[] = {2, 1, 4, 0};
	int a1[] = {1, 4, 0};
	v0 = 0;
	lcs(a0, a1);
}

Und dann hilft es mir meist, das Programm auszuführen (bzw. in der Prüfung von Hand durchzugehen).
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
a0 = 2   a1 = 1   v0 = 0
a0 = 1   a1 = 1   v0 = 0
a0 = 4   a1 = 4   v0 = 0
a0 = 0   a1 = 0   v0 = 0
increment v0:  a0 = 4   a1 = 4   v0 = 1
increment v0:  a0 = 1   a1 = 1   v0 = 2
a0 = 2   a1 = 4   v0 = 2
a0 = 1   a1 = 4   v0 = 2
a0 = 4   a1 = 4   v0 = 2
a0 = 0   a1 = 0   v0 = 2
increment v0:  a0 = 4   a1 = 4   v0 = 3
a0 = 1   a1 = 0   v0 = 3
a0 = 2   a1 = 0   v0 = 3



Geschrieben von deppensido am 18.09.2015 um 21:04:

 

Vielen Dank für deine Hilfe. Ich bin jetzt alles nochmal Schritt für
Schritt durchgegangen und komm auf die gleichen Werte. smile


Forensoftware: Burning Board, entwickelt von WoltLab GmbH