Tuesday, May 3, 2011

How can I sort a list of user-entered numbers in MIPS?

I'm writing MIPS program that will examine a list of 10 numbers to be input from the terminal. And these numbers will output on the terminal in an ascending order. And below are my MIPS program...please can someone help me look into it, because i m running and isn't working 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
From stackoverflow
  • To begin with, you are using some instructions the wrong way.

    add $a1,$a1,4
    

    should be

    addiu $a1,$a1,4
    

    Because you are adding an inmediate,not two registers.

    In addition to that, you should take a look to your comparing logic. It's quite confusing and error prone.

  • If you use addi instead of add, does it work? Also with assembly, it sometimes helps to comment a lot since it doesn't read anywhere close to a natural language.

    .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 don't have a MIPS processor, but this worked 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;
    }
    
    MStodd : correction, that didn't work, i lied
    MStodd : now it works...

0 comments:

Post a Comment