我对如何将C代码转换为MIPS感到困惑。我似乎让循环混乱,我想我可能使用了错误的命令。我这样做的C代码如下:
int main()
{
int x, y;
int sum = 0;
printf("Please enter values for X and Y:\n ");
scanf("%d %d",&x,&y);
if (x > y)
{
printf("\n** Error");
exit(0);
}
while (x <= y)
{
if (x%2 == 0)
sum += x;
x++;
}
printf("\nThe sum of the even integers between X and Y is: %d\n\n",sum);
return 0;
}
我对MIPS翻译的尝试如下:
.data
Prompt: .asciiz "Please enter values for X and Y:\n"
Result: .asciiz "The sum of the even integers between X and Y is: \n"
.text
li $v0,4 #load $v0 with the print_string code.
la $a0, Prompt #load $a0 with the message to me displayed
syscall
li $v0,5 #load $v0 with the read_int code for X
syscall
move $t0,$v0
li $v0,5 #load $v0 with the read_int code for Y
syscall
move $t1, $v0
while:
slt $t2, $t1,$t0 #$t1 = y $t0 = x
li $t3,2
div $t2,$t3
beq $t2,$0,else
add $s1,$s1,$t0 #s1 = s1 + x
addi $t0,$t0,1 #x++
j while
else:
li $v0,4
la $a0, Result
syscall
move $a0,$s1
li $v0,1
syscall
我认为我的错误出现在我的MIPS代码中。我的结果保持为零,我认为我的代码正在检查循环,然后只是跳到我的else语句。
经过进一步的工作,我得到它来计算所有整数的总和,我不确定它为什么会这样做。这是我最近的更新:
while:
sle $t2, $t0,$t1 #$t1 = y $t0 = x
li $t3,2 #t3 = 2
div $t2,$t3 #$t2/2
beq $t2,$0, else #if ($t2/2 == 0), jump to the else, otherwise do else
add $s1,$s1,$t0 #s1 = s1 + x
addi $t0,$t0,1 #x++
j while
所以现在,如果我输入1和5,它计算1和3给我6而不是偶数和应该只是2。
答案 0 :(得分:1)
回答我自己的问题,主要的困惑在于分支机构。我现在明白它们的工作方式就像对立面那样,例如,我必须在我的while循环中将“beq”设置为bnez,这样当$ t2为!时,它会进行计算!另一个小修正是在外面添加增量循环。所以,当$ t2!= 0时,我跳到我的“else”,然后递增以找到下一个数字。但是,如果余数为0,则进行sum = sum + x的数学运算。总之,主要的困惑来自对分支的反思。我现在明白,如果我想说:
而(a1 我必须把它写成 在此理解之前,我写的是ble $ a1,$ a2,已完成,这不是键入的方式。从逻辑上讲,如果a1&lt; a2 ......但实际上是说a1&lt; a2,跳转到“完成”并跳过计算。所以我不得不反思。while:
bgeu $a1,$a2, done
addi "whatever"
b while
done:
do done stuff