在MIPS中对用户输入的数字列表进行排序

时间:2009-04-27 21:47:32

标签: sorting mips

我正在编写MIPS程序,该程序将检查要从终端输入的10个数字的列表。并且这些数字将以升序输出在终端上。以下是我的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

2 个答案:

答案 0 :(得分:2)

如果您使用addi而不是add,它是否有效?对于汇编而言,它有时也有助于评论,因为它不会在任何接近自然语言的地方阅读。

.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

我没有MIPS处理器,但这在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;
}

答案 1 :(得分:0)

首先,您正在以错误的方式使用某些说明。

add $a1,$a1,4

应该是

addiu $a1,$a1,4

因为您要添加一个中间寄存器,而不是两个寄存器。

除此之外,您还应该看看您的比较逻辑。这很容易让人感到困惑和容易出错。