在MIPS中一次以降顺序2进行排序
# read 10 numbers into an array
# swap any pairs of of number which are out of order
# then print the 10 numbers
# i in register $t0,
# registers $t1 - $t3 used to hold temporary results
main:
li $t0, 0 # i = 0
loop0:
bge $t0, 10, end0 # while (i < 10) {
li $v0, 5 # scanf("%d", &numbers[i]);
syscall #
mul $t1, $t0, 4 # calculate &numbers[i]
la $t2, numbers #
add $t3, $t1, $t2 #
sw $v0, ($t3) # store entered number in array
addi $t0, $t0, 1 # i++;
j loop0 #
end0:
# PUT YOUR CODE HERE
li $t0, 1 # i = 1
loop1:
bge $t0, 10, end1 # if (i >= 10) goto end1
mul $t1, $t0, 4 # calculate &numbers[i]
la $t2, numbers #
add $t3, $t1, $t2 #
lw $a0, ($t3) # load numbers[i] into $a0 (x)
sub $t4, $t3, 4
lw $a1, ($t4) #load numbers[i - 1] into $a1 (y)
bge $a0, $a1, increment #if (x >= y) goto increment
add $t5, $a1, $zero #store y in a temp variable
add $a1, $a0, $zero # numbers[i] = y
add $a0, $t5, $zero # numbers[i - 1] = x
increment:
add $t0, $t0, 1 # i++
j loop1
end1:
li $t0, 0 #i = 0
loop2:
bge $t0, 10, end2 #if (i >= 10) goto end2
mul $t1, $t0, 4 # calculate &numbers[i]
la $t2, numbers #
add $t3, $t1, $t2 #
lw $a0, ($t3) # load numbers[i] into $a0
li $v0, 1 # printf("%d", numbers[i])
syscall
li $a0, '\n' # printf("%c", '\n');
li $v0, 11
syscall
add $t0, $t0, 1 #i++;
j loop2
end2:
li $v0, 0
jr $ra # return 0
.data
numbers:
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 # int numbers[10] = {0};
这是我到目前为止编写的代码,它仅打印出给定的数组,并且不会重新排序它们。我有一种感觉,我在loop2中的某个地方覆盖交换,但我不确定在哪里。如何解决此问题以使其以简单的方式工作?
功能: #将10个数字读取为一个数组 #交换所有不订单的数字对 #然后打印10个数字
示例
输入:12086,24363,47363,64268,34001,6800,6800,60742,48867,26002,54999
输出>输出: 12086、24363、47363、34001、6800、60742、48867、26002、54999、64268
等效c程序:
#include <stdio.h>
int main(void) {
int i;
int numbers[10] = { 0 };
i = 0;
while (i < 10) {
scanf("%d", &numbers[i]);
i++;
}
i = 1;
while (i < 10) {
int x = numbers[i];
int y = numbers[i - 1];
if (x < y) {
numbers[i] = y;
numbers[i - 1] = x;
}
i++;
}
i = 0;
while (i < 10) {
printf("%d\n", numbers[i]);
i++;
}
}
# read 10 numbers into an array
# swap any pairs of of number which are out of order
# then print the 10 numbers
# i in register $t0,
# registers $t1 - $t3 used to hold temporary results
main:
li $t0, 0 # i = 0
loop0:
bge $t0, 10, end0 # while (i < 10) {
li $v0, 5 # scanf("%d", &numbers[i]);
syscall #
mul $t1, $t0, 4 # calculate &numbers[i]
la $t2, numbers #
add $t3, $t1, $t2 #
sw $v0, ($t3) # store entered number in array
addi $t0, $t0, 1 # i++;
j loop0 #
end0:
# PUT YOUR CODE HERE
li $t0, 1 # i = 1
loop1:
bge $t0, 10, end1 # if (i >= 10) goto end1
mul $t1, $t0, 4 # calculate &numbers[i]
la $t2, numbers #
add $t3, $t1, $t2 #
lw $a0, ($t3) # load numbers[i] into $a0 (x)
sub $t4, $t3, 4
lw $a1, ($t4) #load numbers[i - 1] into $a1 (y)
bge $a0, $a1, increment #if (x >= y) goto increment
add $t5, $a1, $zero #store y in a temp variable
add $a1, $a0, $zero # numbers[i] = y
add $a0, $t5, $zero # numbers[i - 1] = x
increment:
add $t0, $t0, 1 # i++
j loop1
end1:
li $t0, 0 #i = 0
loop2:
bge $t0, 10, end2 #if (i >= 10) goto end2
mul $t1, $t0, 4 # calculate &numbers[i]
la $t2, numbers #
add $t3, $t1, $t2 #
lw $a0, ($t3) # load numbers[i] into $a0
li $v0, 1 # printf("%d", numbers[i])
syscall
li $a0, '\n' # printf("%c", '\n');
li $v0, 11
syscall
add $t0, $t0, 1 #i++;
j loop2
end2:
li $v0, 0
jr $ra # return 0
.data
numbers:
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 # int numbers[10] = {0};
This is the code I have written so far, and it only prints out the given array and does not reorder them. I have a feeling I am overwriting the swapping somewhere in loop2 but I am not sure where. How can I fix this to make it work in a simple way?
Functionality:
# reads 10 numbers into an array
# swap any pairs of of number which are out of order
# then print the 10 numbers
example
input: 12086, 24363, 47363, 64268, 34001, 6800, 60742, 48867, 26002, 54999
output:12086, 24363, 47363, 34001, 6800, 60742, 48867, 26002, 54999, 64268
An equivalent C program:
#include <stdio.h>
int main(void) {
int i;
int numbers[10] = { 0 };
i = 0;
while (i < 10) {
scanf("%d", &numbers[i]);
i++;
}
i = 1;
while (i < 10) {
int x = numbers[i];
int y = numbers[i - 1];
if (x < y) {
numbers[i] = y;
numbers[i - 1] = x;
}
i++;
}
i = 0;
while (i < 10) {
printf("%d\n", numbers[i]);
i++;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论