【发布时间】:2017-04-27 01:05:49
【问题描述】:
我正在为一个类实现一个简单的单周期 MIPS 处理器,我们实现的唯一操作是 lw、sw、j、addi、or、and、@ 987654327@,
sub、beq、slt、jr、andi、jal、bne 和 sll。我必须编写一个 MIPS 文件来测试阶乘函数。显然,我不能使用尚未实现的指令,但由于阶乘意味着:result = n * factorial(n-1),我需要一种将两个值相乘的方法。有没有办法按照前面提到的说明做到这一点?
编辑:我搞定了!这是我的 MIPS 代码:
multiply:
add $v1, $0, $0 # initialize result to 0
loop:
beq $a2, $0, done # if second operand reaches 0, the multiplication is over
add $v1, $v1, $a1 # result = result + first operand
addi $a2, $a2, -1 # decrements second operand
j loop # loops
done:
jr $ra # returns to caller
【问题讨论】:
-
重复加法是一种方法,需要 O(N) 时间来计算
M * N。左移和加法需要 O(log2(N)),或者如果您不进行提前退出,则只需固定 32 次迭代,尽管它在循环中根据操作数的低位进行添加或不加分支你在右移。