2009-04-27 8 views
1

J'écris un programme MIPS qui examinera une liste de 10 nombres à entrer à partir du terminal. Et ces numéros sortiront sur le terminal dans un ordre croissant. Et ci-dessous sont mon programme MIPS ... s'il vous plaît quelqu'un peut me aider à en elle, car im en marche et ne fonctionne pas proply ....Trier une liste de nombres saisis par l'utilisateur dans 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

Cela semble être une question de devoirs et doit être étiqueté "devoirs" si alors. –

+0

Il serait très utile que vous incluiez des commentaires montrant ce que vous pensez que le code est en train de faire, et un exemple de la sortie que vous obtenez. –

+0

définitivement une question à la maison – MedicineMan

Répondre

2

Si vous utilisez addi au lieu d'ajouter, cela fonctionne-t-il? Aussi avec l'assemblage, il est parfois utile de commenter beaucoup puisqu'il ne lit pas n'importe où près d'un langage naturel.

.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 

Je n'ai pas un processeur MIPS, mais cela a fonctionné dans 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

, qui n'a pas fonctionné, je menti – MStodd

+0

maintenant ça marche ... – MStodd

0

Pour commencer, vous utilisez des instructions de la mauvaise façon .

add $a1,$a1,4 

devrait être

addiu $a1,$a1,4 

Parce que vous ajoutez un inmediate, pas deux registres.

En plus de cela, vous devriez jeter un oeil à votre logique de comparaison. C'est assez déroutant et sujet aux erreurs.

Questions connexes