我正在编写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
答案 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
因为您要添加一个中间寄存器,而不是两个寄存器。
除此之外,您还应该看看您的比较逻辑。这很容易让人感到困惑和容易出错。