一尘不染

无除法运算符的处理器上的汇编Mod算法

algorithm

我需要实现一个简单的宏,该宏在没有除法运算符的处理器(想想ARM)上找到两个数字的模。我可以通过重复减法来使用除法,但是我不知道这是最有效还是最简单的方法。

有什么建议?代码将更加有用。这个特定的类让我们使用SPARC的子集,因此大多数操作如下所示:add r1, r2, rdest

此特定分配要求检查a mod b == 0或除法的余数为零。因此,对于有效实施的任何提示或建议都将受到欢迎。


阅读 265

收藏
2020-07-28

共1个答案

一尘不染

不知道您将要进行的确切操作是什么,但是我想您会用伪代码进行长除法,如下所示:

dividend = abs(dividend)
divisor = abs(divisor)
if divisor == 0,
    barf
remainder = dividend
next_multiple = divisor

do
    multiple = next_multiple
    next_multiple = left_shift(multiple, 1)
while next_multiple <= remainder && next_multiple > multiple

while multiple >= divisor,
    if multiple <= remainder,
        remainder = remainder - multiple
    multiple = right_shift(multiple, 1)

要实际计算商(或至少是其绝对值),最后一部分将是这样的:

quotient = 0
while multiple >= divisor,
    quotient = left_shift(quotient, 1);
    if multiple <= remainder,
        remainder = remainder - multiple
        quotient = quotient + 1
    multiple = right_shift(multiple, 1)

这些都没有经过测试,并且可能充满错误。

2020-07-28