2009-04-27 9 views
1

Ich schreibe MIPS-Programm, das eine Liste von 10 Zahlen untersucht, die vom Terminal eingegeben werden. Und diese Nummern werden auf dem Terminal in aufsteigender Reihenfolge ausgegeben. Und unten sind meine MIPS-Programm ... Bitte kann mir jemand darum kümmern helfen, weil im Betrieb und ist nicht proply arbeiten ....Sortieren einer Liste von benutzerdefinierten Zahlen in MIPS

 .data 
array: .space 40 
prompt: .asciiz "Enter a number: " 
spacee: .asciiz " " 
output: .asciiz "The numbers are: " 
     .text 

main: 
li $t1,10 
la $a1,array 

loop: 
addi $t1,$t1,-1 
li $v0,4  
la $a0,prompt 
syscall 
li $v0,5 
syscall 
sw $v0,0($a1) 
addi $a1,$a1,4 
bnez $t1,loop 
li $t1,9 
li $t2,9 
la $a1,array 

loop1: 
beqz $t2,here 
addi $t2,$t2,-1 
lw $t5,0($a1) 
lw $t6,4($a1) 
add $a1,$a1,4 
ble $t5,$t6,loop1 
sw $t5,0($a1) 
sw $t6,-4($a1) 
bnez $t2,loop1 

here: 
la $a1,array 
addi $t1,$t1,-1 
add $t2,$t2,$t1 
bnez $t1,loop1 
li $v0,4 
la $a0,output 
syscall 
la $a1,array 
li $t1,10 

loop2: 
li $v0,1 
lw $a0,0($a1) 
syscall 
li $v0,4 
la $a0,spacee 
syscall 
add $a1,$a1,4 
addi $t1,$t1,-1 
bnez $t1,loop2 

li $v0,10    #exit 

syscall 
+0

Dies scheint eine Hausaufgaben Frage und sollte "Hausaufgaben" markiert werden, wenn damit. –

+0

Es wäre sehr hilfreich, wenn Sie Kommentare einfügen würden, die zeigen, was Sie denken, was der Code macht, und ein Beispiel für die Ausgabe, die Sie erhalten. –

+0

definitiv eine Hausaufgabe – MedicineMan

Antwort

2

Wenn Sie addi anstelle von add verwenden, funktioniert es? Auch bei der Assemblierung hilft es manchmal, viel zu kommentieren, da es nirgends nahe einer natürlichen Sprache liest.

.data 
array: .space 40 
prompt: .asciiz "Enter a number: " 
spacee: .asciiz " " 
output: .asciiz "The numbers are: " 
.text 

main: 
li $t1,10   #load 10 into $t1 
la $a1,array  #load a pointer to array into $a1 

loop: 
addi $t1,$t1,-1 #subtract 1 from $t1, save to $t1 
li $v0,4   #load 4 into $v0 (print string) 
la $a0,prompt  #load prompt text into $a 
syscall   #display prompt 
li $v0,5   #load 5 into $v0 (read integer) 
syscall   #prompt for input 
sw $v0,0($a1)  #store input int to array 
addi $a1,$a1,4 #add 4 to $a1, save to $a1 
bnez $t1,loop  #if $t1 isn't zero,goto loop 
li $t1,9   #if $t1 is zero, load 9 into $t1 
li $t2,9   #and load 9 into $t2 
la $a1,array  #load array pointer into $a1 

loop1: 
beqz $t2,here  #if $t2 is zero, goto here 
addi $t2,$t2,-1 #subtract 1 from $t2, save to $t2 
lw $t5,0($a1)  #load an input int into $t5 
lw $t6,4($a1)  #load the next one into $t6 
addi $a1,$a1,4 #add 4 to $a1, save to $a1 
ble $t5,$t6,loop1 #if $t5 <= $t6, goto loop1 
sw $t5,0($a1)  #else, store $t5 in $a1 
sw $t6,-4($a1)  #and store $t6 in $a1-4 (swapping them) 
bnez $t2,loop1 #if $t2 is not zero, to go loop1 

here: 
la $a1,array  #load array into $a1 
addi $t1,$t1,-1 #subtract 1 from $t1, save to $t1 
add $t2,$t2,$t1 #add $t2 to $t1, save to $t2 
bnez $t1,loop1 #if $t1 isn't zero, goto loop1 
li $v0,4   #load 4 into $v0 (print string) 
la $a0,output  #load 'the numbers are' into $a0 
syscall   #display message to screen 
la $a1,array  #load array pointer into $a1 
li $t1,10   #load 10 into $t1 

loop2: 
li $v0,1   #load 1 into $v0 (print int) 
lw $a0,0($a1)  #load $a1 into $a0 
syscall   #print first number to screen 
li $v0,4   #load 4 into $v1 (print string) 
la $a0,spacee  #load ' ' into $a0 
syscall   #print ' ' to screen 
addi $a1,$a1,4 #add 4 to $a1, save to $a1 
addi $t1,$t1,-1 #subtract 1 from $t1, save to $t1 
bnez $t1,loop2 #if $t1 isn't zero, goto loop2 

li $v0,10    #exit 

syscall 

I, keine MIPS-Prozessor haben, aber das funktionierte in C: #include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[]) 
{ 
int t1; 
int t2; 

int* a1; 
int t5; 
int t6; 

int arr[10] = {10,9,8,7,6,5,4,3,2,1}; 

t1 = 9; 
t2 = 9; 
a1 = arr; 

loop1: 
if(t2 == 0) 
    goto here; 

t2 = t2 - 1; 
t5 = *a1; 
t6 = *(a1 + 1); 
a1 = a1 + 1; 
if(t5 <= t6) 
    goto loop1; 

*a1 = t5; 
*(a1-1) = t6; 
if(t2 != 0) 
    goto loop1; 

here: 
a1 = arr; 
t1 = t1 - 1; 
t2 = t2 + t1; 
if(t1 != 0) 
    goto loop1; 
printf("the numbers are\n"); 
a1 = arr; 
t1 = 10; 

loop2: 
printf("%i ", *a1); 
a1 = a1 + 1; 
t1 = t1 - 1; 
if(t1 != 0) 
    goto loop2; 

return 0; 
} 
+0

Korrektur, das hat nicht funktioniert, ich log – MStodd

+0

jetzt funktioniert es ... – MStodd

0

mit zu beginnen, Sie einige Anweisungen verwenden die falsche Art und Weise .

add $a1,$a1,4 

sollte

addiu $a1,$a1,4 

werden, da Sie eine inmediate hinzufügen, nicht zwei Register.

Zusätzlich sollten Sie einen Blick auf Ihre Vergleichslogik werfen. Es ist ziemlich verwirrend und fehleranfällig.

Verwandte Themen