在理解使用x86汇编语言的好处时,我试图编写一个 16x16位乘法例程,它接受两个无符号 16位值和使用 shift 和* addin * g将它们相乘,并将最终的32位结果存储在 DX:AX 中。
运行代码没有问题(换句话说,它编译得很好并且与我的链接程序一起运行),但是代码没有给出预期的乘法结果。
这是我到目前为止所提出的:
理论上,这应该是给我DX:AX中的无符号32位结果。
当我在程序中使用此代码时, 32位结果的低16位(或换句话说,AX部分)是正确的并显示正好。 32位结果的高16位(DX部分)不正确。
有谁可以帮我弄清楚我做错了什么?
提前致谢
答案 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,因为它已被用于将进位添加到解决方案中。