我有以下代码,在对变量进行算术运算时,有效地应该从1-6增加。
C中的一个例子是
int res = 0;
for(i=1; i<6; i++) {
res += i*i+1;
}
现在我的mips代码:
.data
res: .word 0
.text
li $t0, 1 #int j = 1
loop:
beq $t0, 6, end #for(int j = 1; j < 6; j++)
add $t0, $t0, 1
mul $t1, $t0, $t0 #res += j * j + 1
addi $t1, $t1, 1
sw $t1, res
b loop
end:
li $v0, 1 #checking the end result
la $a0, res
syscall
li $v0, 10 #graceful exit
syscall
出于某种原因,我最终得到的结果是〜3亿,这显然是错误的。有谁看到问题是什么?我是mips装配的新手。
由于
答案 0 :(得分:1)
你在这里遇到了一些问题。
首先,您标记为#res += j * j + 1
的行只是倍增,不涉及添加。
您似乎正在尝试使用res
来存储正在运行的总计,但是您在每次迭代中都会覆盖它。实际上,不应该将res存储在内存中,寄存器更适合于此目的。
.text
main:
move $t2 $zero
li $t0 1
loop:
mul $t1 $t0 $t0
addi $t1 $t1 1
add $t2 $t2 $t1 # res += i * i + 1
addi $t0 $t0 1
blt $t0 6 loop
# print res
li $v0 1
move $a0 $t2
syscall
# exit
li $v0 10
syscall
打印60
。
答案 1 :(得分:0)
你想做这样的事情。 我假设你想要这样的东西:
int res = 0;
for(i=1; i<6; i++) {
res += i*i+1;
}
.data
res: .word 0
.text
li $t0, 1 #int i = 1
loop:
bgt $t0, 6, exit
add $t0, $t0, 1
mul $t1, $t0, $t0
addi $t1, $t1, 1
sw $t1, res // I'm sure you can just move here
b loop
exit: