0

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

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

到目前为止,这是我想出的:


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

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

谁能帮我弄清楚我做错了什么?

提前致谢

4

1 回答 1

1

似乎您需要将部分被乘数移到另一个寄存器之后add bx, bx。这是因为每次在不移动进位的情况下移动 bx 时,最高位就会被截断。因此,您的原始代码仅将 bx 添加到 ax 的进位总和存储在 dx 中,而不是乘法解决方案的上部。

在标签 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,因为它已经被用于将进位添加到解决方案中。

于 2013-11-02T22:03:15.880 回答