3

我想在 8086 汇编或类似程序中将无符号整数除以 3,以任何我不想使用 DIV 操作码的方式更快地做到这一点。

4

2 回答 2

4

阅读 Hacker's Delight 一书相应的第 10 章“整数除以常数”。奖励内容适用于该章节(但不是章节本身)。

或者使用libdivide,这是一个库,它会在第一步中应用已知算法来找到合适的常数,这样给定分母的除法就会更快。

正如 libdivide 页面所指出的,编译器知道如何通过编译时常量将除法转换为乘法和移位,因此最简单的方法可能就是使用编译器。我会为你做,但我没有 16 位编译器。如果使用 32 位编译器完成,结果如下:

    movw    $-21845, %ax
    mulw    8(%ebp)
    andl    $65534, %edx
    movl    %edx, %eax
    shrl    %eax

对于 C 函数:

int f(unsigned short d)
{
  return d / 3;
}
于 2013-02-23T11:18:00.973 回答
3

基本答案是“乘以所需常数的倒数”,使用移位和加法来执行乘法,然后使用一些可能的后移位来正确定位二进制点。

诀窍是弄清楚倒数的精度必须是多少,以处理您期望的最大输入红利的大小。您显然可以决定最大的输入操作数是整个寄存器,但如果您知道更多,您可以使用具有较少位的倒数,从而获得更快的移位加法乘法。

Cuoq 的回答提供了很好的参考资料。

于 2013-02-23T11:29:55.037 回答