【问题标题】:Binary multiplication: How do you "decompose" the multiplier?二进制乘法:如何“分解”乘数?
【发布时间】:2018-05-16 12:08:18
【问题描述】:

所以我试图在汇编语言程序中使用移位和加法算法实现乘法器。我在这个 ISA 中没有可用的左移指令,但我知道向自身添加一个数字会将数字左移一位。

假设我想乘以 5 * 15,即 101 乘以 1111。我知道我需要将 5 乘以 15 中的每个部分位,但我对如何访问/使用这些部分位感到困惑。从右到左,我将1 乘以101 得到101,添加一个占位符左移,然后继续每个连续的位,得到101010100101000。然后我将这些数字相加得到1001011,即75,即正确答案。

那么,我怎样才能在汇编中做到这一点?我很困惑。谢谢!

【问题讨论】:

  • 你在为什么架构编程?
  • [no] left shift […] in this ISA 将二进制编码的数字添加到自身相当于将其向更高有效位的方向移动。如果您“带进位相加(从将被乘数添加到部分乘积)”,您可以获得扩展尺寸的产品而无需额外费用,但具有“早出”的可行性。

标签: assembly binary multiplication


【解决方案1】:

可能是 How can I multiply and divide using only bit shifting and adding? 的副本,其中包含更多细节。

在 x86 上,在 EDX 中给定 15,你会这样做

lea eax, [rdx + rdx*4]

EAX = (EDX<<2) + EDX = EDX*5,因为101(1<<2) + (1<<0)

另请参阅computerscience.SE 上的How can I multiply a binary representation by ten using logic gates?,了解有关乘法的更多背景信息。

Is a shift instruction faster than an IMUL instruction? 有一些东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-26
    • 2016-05-03
    • 1970-01-01
    • 2018-10-10
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多