为什么这不是return 10? (mips)
Why does this not return 10? (mips)
好的,所以这里的问题是"What does $v0 have at end of the loop execution?",我从一个朋友那里找到答案3628800,他写了一些python翻译Mips的代码,基本上代码就是10! (10 的阶乘,不是我喊 10 哈哈)
这里是 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,哈哈),答案是我只是不明白为什么 Mips 会做它所做的事情而不是仅仅打印出 10,(虽然 jal 指令可能就在其中并执行阶乘的东西),无论如何,这里的任何帮助将不胜感激! :) 谢谢S.O.
这里的解释很简单。
在循环中发生的是$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,但是问题就在这里,答案是循环结束,那个结束没有进来。
好的,所以这里的问题是"What does $v0 have at end of the loop execution?",我从一个朋友那里找到答案3628800,他写了一些python翻译Mips的代码,基本上代码就是10! (10 的阶乘,不是我喊 10 哈哈)
这里是 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,哈哈),答案是我只是不明白为什么 Mips 会做它所做的事情而不是仅仅打印出 10,(虽然 jal 指令可能就在其中并执行阶乘的东西),无论如何,这里的任何帮助将不胜感激! :) 谢谢S.O.
这里的解释很简单。
在循环中发生的是$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,但是问题就在这里,答案是循环结束,那个结束没有进来。