Сортировать список введенных пользователем номеров в MIPS - PullRequest
1 голос
/ 28 апреля 2009

Я пишу программу 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 ]

2 голосов
/ 28 апреля 2009

Если вы используете 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;
}
0 голосов
/ 28 апреля 2009

Для начала вы используете неправильные инструкции.

add $a1,$a1,4

должно быть

addiu $a1,$a1,4

Поскольку вы добавляете промежуточный, а не два регистра.

В дополнение к этому вы должны взглянуть на свою логику сравнения. Это довольно запутанно и подвержено ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...