汇编中的快速乘法算法
Fast multiplication algorithm in assembly
我的任务是编写一个编译器,将小型编程语言编译成伪造的汇编语言(寄存器和内存单元的长度未定义)。
我要做的就是转换这样的指令:
a = b * c
一组 INC、SHL i、ADD i 指令(其中 i 是指向内存的指针,只有一个寄存器可用)将执行乘法。
问题是,算法必须在 O(log n) 时间内完成。
任何人都可以逐步解释解决这个问题的算法吗?
朋友提到过Booth-Mcsorley算法,但我几乎看不懂
编辑:
伪汇编指令包括:READ、WRITE、LOAD i、STORE i、ADD i、SUB i、SHR i、SHL i、INC、RESET、JUMP k、JZERO k、JODD k(如果寄存器为奇数则跳转到 k)
既然这是一个伪造的汇编程序,我想知道为什么速度很重要?更有可能是阻止您实现一个简单的迭代加法算法,该算法的长度将与右侧操作数的大小成正比(如果您想要一个简单的优化,则为两个操作数中较小的一个,但是 O(n)尽管如此)。
在缺少乘法指令的指令集中实现乘法的方法是使用移位和加法(本质上是长乘法 in 二进制).根据向您提供的说明,这似乎是最有可能需要的解决方案。
这个问题:How can I multiply and divide using only bit shifting and adding? may therefore be relevant. A shift+add implementation that is O(log2 n) in C is presented as an answer to What is the time complexity of this multiplication algorithm?,但可以根据您的指令集进行调整。
我的任务是编写一个编译器,将小型编程语言编译成伪造的汇编语言(寄存器和内存单元的长度未定义)。
我要做的就是转换这样的指令:
a = b * c
一组 INC、SHL i、ADD i 指令(其中 i 是指向内存的指针,只有一个寄存器可用)将执行乘法。 问题是,算法必须在 O(log n) 时间内完成。
任何人都可以逐步解释解决这个问题的算法吗? 朋友提到过Booth-Mcsorley算法,但我几乎看不懂
编辑: 伪汇编指令包括:READ、WRITE、LOAD i、STORE i、ADD i、SUB i、SHR i、SHL i、INC、RESET、JUMP k、JZERO k、JODD k(如果寄存器为奇数则跳转到 k)
既然这是一个伪造的汇编程序,我想知道为什么速度很重要?更有可能是阻止您实现一个简单的迭代加法算法,该算法的长度将与右侧操作数的大小成正比(如果您想要一个简单的优化,则为两个操作数中较小的一个,但是 O(n)尽管如此)。
在缺少乘法指令的指令集中实现乘法的方法是使用移位和加法(本质上是长乘法 in 二进制).根据向您提供的说明,这似乎是最有可能需要的解决方案。
这个问题:How can I multiply and divide using only bit shifting and adding? may therefore be relevant. A shift+add implementation that is O(log2 n) in C is presented as an answer to What is the time complexity of this multiplication algorithm?,但可以根据您的指令集进行调整。