Ordenar una lista de los números introducidos por el usuario en MIPS
Pregunta
Estoy escribiendo programa de MIPS que examinará una lista de 10 números para ser introducida desde el terminal. Y estas cifras es la salida de la terminal en un orden ascendente. Y a continuación son mi programa MIPS ... Por favor alguien puede ayudarme a buscar en ella, porque i m correr y no está funcionando proply ....
.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
Solución
Si utiliza adi lugar de sumar, ¿funciona? También con el montaje, a veces ayuda a comentar mucho, ya que no ha leído en cualquier lugar cerca de un lenguaje natural.
.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
No tengo un procesador MIPS, pero esto trabajé en 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;
}
Otros consejos
Para empezar, está usando algunas instrucciones por el camino equivocado.
add $a1,$a1,4
debería ser
addiu $a1,$a1,4
Debido a que usted está añadiendo una inmediata, no dos registros.
Además de eso, usted debe echar un vistazo a la lógica de la comparación. Es muy confuso y propenso a errores.