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

发布于 2024-07-18 22:23:06 字数 912 浏览 7 评论 0原文

我正在编写 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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ゞ花落谁相伴 2024-07-25 22:23:06

如果用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;
}

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;
}
纵情客 2024-07-25 22:23:06

首先,您使用了一些指令的方式是错误的。

add $a1,$a1,4

应该是

addiu $a1,$a1,4

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

除此之外,您应该看看您的比较逻辑。 这是相当混乱且容易出错的。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文