MIPS计算器用减法和加法实现除法,避免DIV和REM指令
Posted
技术标签:
【中文标题】MIPS计算器用减法和加法实现除法,避免DIV和REM指令【英文标题】:MIPS Calculator implementing division with subtraction and addition, avoiding DIV and REM instructions 【发布时间】:2014-03-03 19:38:26 【问题描述】:我正在研究经典的 MIPS 计算器示例,但我正在尝试将下面的除法(除法)例程更改为仅使用加法和减法而不是 MIPS div 操作(类似于我对乘法所做的操作)。这可能很容易做到,但我是 MIPS 的新手,到目前为止我所做的每一次尝试都没有奏效。帮忙?
我正在使用 qtspim 作为我的模拟器
到目前为止我有什么要划分的:
start_divis:
add $t1, $zero, $s0 #make copy of first integer value in $s0
add $t2, $zero, $s1 #make copy of second integer value in $s1
add $t0, $zero, $zero #make $t0 the temporary variable to act as a counter
div_loop:
slt $t3, $t2, $t1 #checks if $t1 > $t2
sub $t1, $t1, $t2 #subtract $t2 from $t1
addi $t0, 1 #add one to counter
bne $t3, $zero, div_loop #if first number < second number, loop
end_divis:
move $s5, $t0 #store answer
move $s6, $t1 #store remainder
la $a0, divi_s #get division symbol
move $s7, $a0 #move it to $s7
j div_ans #jump to div_ans
【问题讨论】:
【参考方案1】:如果您可以摆脱整数除法(即1/2 = 0
),请考虑以下伪代码:
function multiply(a, b):
sum := 0
for i = 0 to b:
sum := sum + a
return sum
function divide(a,b):
count := 0
while a ≥ b:
a := a - b
count := count + 1
return count
你写的有一些错误:
首先是一行
slt $t3, $t2, $t1 #checks if $t1 > $t2
不正确。否定 > 的正确方法是使用 ≤。这意味着该行应更改为:
sle $t3, $t2, $t1 #checks if $t1 > $t2
接下来,您的循环条件位于顶部,而使用它的实际分支位于底部。您应该知道,while 循环总是检查顶部的条件。
考虑:
div_loop:
sle $t3, $t2, $t1 #checks if $t1 > $t2
beq $t3, $zero, end_divis #if first number < second number, break
sub $t1, $t1, $t2 #subtract $t2 from $t1
addi $t0, 1 #add one to counter
j div_loop #loop
【讨论】:
感谢您的回复,我知道要使用的一般算法,但我遇到的麻烦是将它们翻译成 MIPS,因为这是我第一次使用该语言 您能否详细说明您在实施方面遇到的问题?如果您遇到循环问题,最好咨询适当的教程资源。 当然,请参阅编辑,了解到目前为止我对除法的了解(我设法让乘法工作)使用类似于您上面的方法。它目前不适用于余数,不知道为什么。 当你上面的伪代码完成时,a应该是余数正确吗? 是的,我没有想到这一点,但我想a
将是其余的。以上是关于MIPS计算器用减法和加法实现除法,避免DIV和REM指令的主要内容,如果未能解决你的问题,请参考以下文章