2016-04-20 4 views
0

Dies ist eine sehr einfache Schleife obwohl in der siebten Wiederholung (wenn die allgemeine Anzahl größer als 7 ist, beginnt der Syscall sich zu benehmen und nicht die "enter_num" Tag drucken, seine Werte auf dem Datensegment nach diesem Punkt auch zerdrücken. ich verstehe nicht, den Grund ..Selektive Syscall und Werte Crushings in einer einfachen Schleife

 


.data 
.asciiz 

Amount:"Enter amount of numbers " 
enter_num:"Enter number " 
of:" of " 
space:" " 

.text 


la $a1 0x10010000 #Loads address to $a1 

#Ask for general number amount 
la $a0 Amount 
li $v0 4 
syscall 
li $v0 5 
syscall 

add $t1 $t1 $v0 #store the general amount of numbers in $t1 

#Define counter $t2 
li $t2 1 

#store first general number 
sb $t1 0($a1)#store byte in address 
addi $a1 $a1 1 #Promote $a2 block address by 1 step 

loop: 

#Ask for array numbers 

la $a0 enter_num 
li $v0 4 
syscall 
la $a0,($t2) 
li $v0 1 
syscall 
la $a0 of 
li $v0 4 
syscall 
la $a0,($t1) 
li $v0 1 
syscall 
la $a0 space 
li $v0 4 
syscall 
li $v0 5 
syscall 

sb $v0 0($a1)#store byte in address 



addi $a1 $a1 1#Promote $a1 address by 1 step 

beq $t2 $t1 finish #loop ends when we reach the general amount number 

addi $t2 $t2 1#promote $t2 counter 

j loop 

 

Antwort

0

$a1 Punkte 0x10010000, das ist die Basis des Datensegments (wo Ihre ASCII-Strings gespeichert werden). Indem Sie dort Daten schreiben, überschreiben Sie effektiv Ihre Strings.

Versuchen Sie folgendes: wählte eine Menge von 30 Zahlen, geben Sie 0 bis 24 # an die Nummer, dann 65 für Nummer # 25, 66 für die Nummer # 26, etc ... sollten Sie etwas wie diese:

Enter number 1 of 30 0 
... 
Enter number 24 of 30 0 
Enter number 25 of 30 65 
Anter number 26 of 30 66 
ABter number 27 of 30 67 
ABCer number 28 of 30 68 
ABCDr number 29 of 30 69 
ABCDE number 30 of 30 70 

65 ist der ASCII-Code für "A", 66 für "B", etc ... Sie können sehen, dass Ihre Daten überschrieben werden, wie Sie gehen.

Eine Lösung wäre, Ihre Zahlen direkt nach space zu speichern. Dies funktioniert mit spim:

.data 

Amount: .asciiz "Enter amount of numbers " 
enter_num: .asciiz "Enter number " 
of:  .asciiz " of " 
space:  .asciiz " " 

numbers: .space 128 # <- some room for numbers here 

.text 
.globl main 
main: 

    #la $a1 0x10010000 # <- replace this... 
    la $a1 numbers  # <- ...with this 

    # ...rest of the code here... 
+0

Danke, das ist es .. Obwohl ich mit der Linie nicht vertraut bin“.space 128" , was es genau zu tun? –

+0

Das ist nur Zuweisung von 128 aufeinander folgenden Bytes im Datensegment für Ihre Daten (Ich wählte 128 zufällig, kann alles sein, solange es groß genug ist, um den globalen Zähler + alle Zahlen unterzubringen). – xbug