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 &gt; $t2

不正确。否定 > 的正确方法是使用 ≤。这意味着该行应更改为:

sle $t3, $t2, $t1 #checks if $t1 &gt; $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指令的主要内容,如果未能解决你的问题,请参考以下文章

高精度加法,减法,乘法,除法

仅使用位移加法和减法的对数时间整数除法

加法 减法 乘法 除法计算

请问怎样用加法-移位实现定点乘除法?

模2加法,模2减法,模2除法

JS 乘法运算出现了浮点,该怎么解决