【问题标题】:Alternative to mul/mult for multiplication in assembly (MIPS)?mul/mult 的替代方案用于汇编中的乘法 (MIPS)?
【发布时间】:2017-04-27 01:05:49
【问题描述】:

我正在为一个类实现一个简单的单周期 MIPS 处理器,我们实现的唯一操作是 lwswjaddiorand、@ 987654327@, subbeqsltjrandijalbnesll。我必须编写一个 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 次迭代,尽管它在循环中根据操作数的低位进行添加或不加分支你在右移。

标签: assembly mips


【解决方案1】:

乘法只是重复加法,就像加法是重复递增,幂是重复乘法一样。

因此,您可以编写一个将两个值相乘的函数,如下所示(显然是伪代码,但使用的函数足以满足您的规范要求):

def mult (a, b):
    result = 0
    while a > 0:
        result = result + b
        a = a - 1
    return result

这仅适用于无符号值,但由于您正在处理阶乘,您可能根本不需要关注负数。

无论如何,调整有符号值应该相对简单,因此,为了完整起见,您可以使用:

def mult (a, b):
    # Handle either being zero.

    if a == 0 or b == 0:
        return 0

    # Handle either or both being negative (may
    # need sign change to result).

    sign = 1

    if a < 0:
        a = -a
        sign = -sign

    if b < 0:
        b = -b
        sign = -sign

    # Both now positive, make sure first is not larger (less loops).

    if b < a:
        temp = a
        a = b
        b = temp

    # Multiply small-a by large-b.

    result = 0
    while a > 0:
        result = result + b
        a = a - 1

    # Adjust sign if needed.

    if sign == -1:
        result = -result

    # Et, voila.

    return result

【讨论】:

  • 谢谢!我得到了它!我刚刚写了一个 multiply 函数循环添加第一个参数并递减第二个参数直到它达到 0 并且做到了!
  • @SimonBesozzi - 使用 shiftadd 进行乘法运算会更快,它只需要 32 个循环。您可以为此进行网络搜索以找到各种示例。
  • @rcgldr,这将不太容易理解,特别是因为在允许的操作列表中没有右移指令:-) 我怀疑,对于教育,重复添加可能更好, 为需要最高性能的代码留下一些麻烦。
  • @paxdiablo - 可以使用 32 位掩码条目表来代替右移。
猜你喜欢
  • 2015-03-05
  • 2015-01-05
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
相关资源
最近更新 更多