Announcement

Collapse
No announcement yet.

SPIM Programmierung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SPIM Programmierung

    Hallo,

    ich hoffe es kann mir hier jemand weiterhelfen. Ich versuche ein MIPS/SPIM programm zu schreiben, das vom Benutzer eine Zahl einliest und diese dann als Binärzahl ausgibt. Das war meine Idee:

    Code:
    				.data
    eingabe:    	.asciiz "Geben Sie eine Zahl sdfasdf234234ein: "
    ausgabe: 		.asciiz "Ergebnis: " 
    nl:				.asciiz "\n" 
    space:          .space 8 							 	# Speicherreservierung für 8 Byte 
    
    				.text			
    main:  
            		la         $a0, eingabe     			# "Geben Sie eine Zahl ein: " ausgeben 
            		li         $v0, 4
            		syscall
            		
            		li         $v0, 5           		    # Zahl einlesen
            		syscall
            		
            		la         $a0, ausgabe        		    # "Ergebnis: " ausgeben 
    				li         $v0, 4
            		syscall
    
    				move       $s0, $v0                     # Eingabe sichern, $s0:=$v0, das heißt meine Eingabe steckt jetzt in $s0 
    				
    				li         $s1, 2                       # $s1:=2, Divident deklarieren
    				
    				li         $t3, 7                       # $t3:=7 
    				
    				move       $a0, $s0               		# in $a0 steckt mein Argument für den Prozeduraufruf, meine Eingabe       
    				
    				jal dual                                # Prozeduraufruf 
    				
    				
    				la         $a0, space                   # space wird geladen als String  
    				li         $v0, 4                       # Integer in $a0 wird ausgeben 
    		        syscall 		      		            # Ergebnis ausgeben 
            		        		 
            		la         $a0, nl				        # Newline ausgeben
    		        li         $v0, 4
    		        syscall 
    		                		
            		li         $v0, 10				        # terminieren
            		syscall 
    
    				
    dual:			addi 	   $sp, $sp -8                  # $sp dekrementieren, auf dem Stack Platz für 2 Register machen
    				sw 		   $ra, 8($sp)			        # $ra liegt auf dem erstem freien Platz, Rücksprungadresse wird auf den Stack gelegt 
    				sw 		   $a0, 4($sp)                  # $a0 liegt auf dem zweitem freien Platz, übergebenes Argument wird auf den Stack gelegt
    				
    				bge        $a0, $zero, positiv 		    # if eingabe >= 0
    											        
    positiv:        div        $a0,$s1					    # eingabe : 2 
    	            mflo       $t1   		                # in $t1 steckt das Ergebnis der Division 
    	            mfhi       $t2   					    # in $t2 steckt der Rest der Division
    	            sb         $t2, space($t3)              # den Rest der Divison am Ende von Space speichern 
    	            sub        $t3, $t3, 1				    # $t3-- dekrementieren 
    	            beqz       $t1, null                    # wenn Ergebnis der Division 0 ist dann zu null springen 
    	            move       $a0, $t1                     # Ergebnis der Division in $a0 stecken für erneuten Prozeduraufruf 
    	            jal dual                                # rekursiver Aufruf von dual   
    	            
    	            lw 		   $ra, 8($sp)
    				lw 		   $a0, 4($sp)
    				jr 		   $ra 
    	            
    null: jr $ra
    also ich speichere meine "0 und 1er" der Division in space würde diese dann als String ausgeben. Eigentlich fand ich die Idee ganz gut, aber irgendwas funktioniert nicht. Ich finde meinen Fehler nicht. Ich vermute bei der Rekusion, der rekursive Aufruf der Division mit dem Ergebnis der Divison.
    Wenn hier jemand eine Idee hat? Wär super, vielen Dank!
Working...
X