8086汇编:将两个16位数相乘,得到32位结果,而不使用mul指令

时间:2013-11-02 21:24:00

标签: assembly masm x86-16

在理解使用x86汇编语言的好处时,我试图编写一个 16x16位乘法例程,它接受两个无符号 16位值和使用 shift 和* addin * g将它们相乘,并将最终的32位结果存储在 DX:AX 中。

运行代码没有问题(换句话说,它编译得很好并且与我的链接程序一起运行),但是代码没有给出预期的乘法结果。

这是我到目前为止所提出的:


理论上,这应该是给我DX:AX中的无符号32位结果。

当我在程序中使用此代码时, 32位结果的低16位(或换句话说,AX部分)是正确的并显示正好。 32位结果的高16位(DX部分)不正确

有谁可以帮我弄清楚我做错了什么?

提前致谢

1 个答案:

答案 0 :(得分:1)

好像你需要在add bx, bx之后将被乘数的一部分移到另一个寄存器中。这是因为每次移动bx而不移动进位时,顶部位会被截断。因此,您的原始代码只是存储在dx中将bx添加到ax而不是乘法解的上半部分的进位总和。

在标签AddToResult:

之后尝试此操作
@AddToResult:
    add   bx,bx     ; add instead of shift?
    adc   di,di     ; shift part of multiplicand.
    or    cx,cx     ; fast zero check
    jnz   @lp

我还为被乘数的高16位选择了di,因为它已被用于将进位添加到解决方案中。