[MIPS] Kann wer helfen?

11/08/2014 14:31 ohnoesimnoob#1
Hallo ihr liebsten ePvP-Menschen,
ich wollte fragen ob einer von euch mir hier helfen kann?
Gegeben ist folgende Aufgabe und ich habe einfach keine Ahnung wie ich das umsetzen sollte...
"Schreiben Sie ein Assemblerprogramm, das zuerst einen Integer n einliest, dann n Integerzahlen
a1, . . . , an einliest, auf den Stack schreibt und in umgekehrter Reihenfolge wieder ausgibt. Dokumentieren
Sie Ihr Programm kurz und prägnant.
Achtung: Der Stackpointer $sp soll immer auf die letzte belegte Speicherzelle des Stacks zeigen!"
Wäre zutiefst dankbar, sollte hier jemand helfen können! :)

Also mir ist klar das ich im txt segment schonmal die eingabeaufforderungen habe und die über die passenden syscalls laden muss.. dann einen array erstelle mit der länge der ersten eingegeben zahl und ihn dann selber mit zahlen füllen muss... nach jeder ausgabe muss irgendwie der stack um eins verringert werden damit der pointer auf die letzte speicherzelle des arrays zeigt, wobei über den print syscall vorher der letzte wert ausgegeben wird wobei ich eine schleife brauche bis beq 0 ( glaube ich?) also bis das array eben 0 werte enthält..
aber holy fuck.. wie setz ich das in mips um?
11/08/2014 18:06 .Infinite#2
Ich habs mal probiert. Ist leider schon 2 Semester her, dass ich das machen musste.
Dieser Code kompiliert zwar, macht aber noch nicht ganz das was du haben willst. Hatte keine Lust da jetzt noch Fehler zu suchen... Fertiger Code wär ja aber auch langweilig ;)
Code:
.text
.global main
main:
	li $v0, 5			# syscall 5 - Eingabe einer Ganzzahl, Rückgabewert in $v0
	syscall
	
	move $t0, $v0			# Rueckgabewert nach $t0 verschieben (Zaehler fuer inputLoop)
	move $t1, $v0			# Rueckgabewert nach $t1 verschieben (Zaehler fuer outputLoop)
	
	inputLoop:
		beq $t0, $0, outputLoop
		
		li $v0, 5		# syscall 5 - Eingabe einer Ganzzahl, Rückgabewert in $v0
		syscall
		
		addi $sp, $sp, -4	# Stack-Platz reservieren
		move $sp, $v0		# Eingelesenen Integer auf Stack schieben
		
		subi $t0, $t0, 1	# Zaehler dekrementieren
		j inputLoop
	
	outputLoop:
		beq $t1, $0, end
		
		li $v0, 1		# syscall 1 - Ausgabe einer Ganzzahl
		move $a0, $sp		# Zahl in $a0 (Parameter für syscall)
		syscall
		
		addi $sp, $sp, 4	# Stack-Platz wieder freigeben
		subi $t1, $t1, 1	# Zaehler dekrementieren
		j outputLoop
	
	end:
		li $2, 10		# Programmende
		syscall
11/08/2014 19:32 ohnoesimnoob#3
hab den code passend abändern können! :) danke! :)

// oder auch nicht. ach fuck it.
11/08/2014 21:10 .Infinite#4
Okay, weil du es nicht hinkriegst hab ich es dann mal für dich korrigiert:

Mein Fehler war, dass man Sachen natürlich mit sw(store word) auf den Stack schreibt, weil im $sp Register ja eine Speichergeschrieben steht. Ausgelesen werden müssen die Werte folglich auch mit lw(load word). Außerdem war an einer Stelle $v0 und $t0 vertauscht glaube ich...

Code:
.text
.global main
main:
	li $v0, 5			# syscall 5 - Eingabe einer Ganzzahl, Rückgabewert in $v0
	syscall
	
	move $t0, $v0			# Rueckgabewert nach $t0 verschieben (Zaehler fuer inputLoop)
	move $t1, $v0			# Rueckgabewert nach $t1 verschieben (Zaehler fuer outputLoop)
	
	inputLoop:
		beq $t0, $0, outputLoop
		
		li $v0, 5		# syscall 5 - Eingabe einer Ganzzahl, Rückgabewert in $v0
		syscall
		
		subi $sp, $sp, 4	# Stack-Platz reservieren
		sw $v0, 0($sp)		# Eingelesenen Integer auf Stack schieben
		
		subi $t0, $t0, 1	# Zaehler dekrementieren
		j inputLoop
	
	outputLoop:
		beq $t1, $0, end
		
		li $v0, 1		# syscall 1 - Ausgabe einer Ganzzahl
		lw $a0, 0($sp)		# Zahl in $a0 (Parameter für syscall)
		syscall
		
		addi $sp, $sp, 4	# Stack-Platz wieder freigeben
		subi $t1, $t1, 1	# Zaehler dekrementieren
		j outputLoop
	
	end:
		li $2, 10		# Programmende
		syscall
11/08/2014 21:50 ohnoesimnoob#5
Vielen lieben Dank! :)