为什么这不会返回10? (MIPS)

时间:2017-09-08 04:47:38

标签: assembly mips

好的,这里的问题是“循环执行结束时$ v0有什么作用?”,我从朋友那里找到了答案3628800,并且他写了一些翻译Mips的python代码,本质上就是代码意味着10! (因子10,不是我大喊10 lol)

如果你也喜欢python代码:

a = 10
v = 1
while (a != 0):
    v *= a
    a -= 1
print (v)

现在,我明白python代码的作用,我明白它转换为10的阶乘,但在mips程序集中,我以为我理解它的逻辑,实际上,我在这里制作了一个糟糕的ms绘制图在那里我认为它是9,10或11(我知道,不是很具体,但我仍然相当新:(请不要评价我)Heres the picture if you'd like that too :)

.text
.globl main

main:
li $a0, 10


li $v0, 1
Loop:
beq $a0, $zero, exit
mul $v0, $a0, $v0
add $a0, $a0, -1
jal Loop
exit:
li $v0, 10
syscall

现在,你可能想知道为什么我问一个问题,即使我似乎已经解决了这个问题,加上我自己的想法为什么我以前认为它是10,(好吧,在图片中)我画了我说9或11,但我也意味着10太lol),答案就是我只是不明白为什么Mips做它做的事情的逻辑而不是只打印10,(虽然jal指令可能就在那里,并且做了阶乘的东西),无论如何,这里的任何帮助都会受到很多赞赏! :)谢谢你S.O。

1 个答案:

答案 0 :(得分:1)

这里的解释很容易。

在循环过程中,发生的情况是$a0的值一次下降,执行过程如下:

1st - $a0 = 10 and $v0 = 1 -> In the `mult` operation (multiply) we have: $v0 = 10 * 1 ($a0 * $v0) -> 10
2nd - $a0 = 9 and $v0 = 10 -> In the `mult` operation (multiply) we have: $v0 = 9 * 10 ($a0 * $v0) -> 90
3rd - $a0 = 8 and $v0 = 90 -> In the `mult` operation (multiply) we have: $v0 = 8 * 90 ($a0 * $v0) -> 720
...
8th - $a0 = 3 and $v0 = 604800 -> In the `mult` operation (multiply) we have: $ v0 = 3 * 604800 ($a0 * $v0) -> 1814400
9th - $a0 = 2 and $v0 = 1814400 -> In the `mult` operation (multiply) we have:  $v0 = 2 * 1814400 ($a0 * $v0) -> 3628800
10th - $a0 = 1 and $v0 = 3628800 -> In the `mult` operation (multiply) we have: $v0 = 1 * 3628800 ($a0 * $v0) -> 3628800

然后$a0的值变为0,然后执行exit

细节在问题中,因为它想知道循环结束时$v0的最终值,即$v0 = 3628800

但是程序仍将继续,将$v0的值重写为10,但这很重要,答案是循环的结尾,该结尾不会出现。