在8086汇编中乘以错误的结果

时间:2014-03-09 01:54:16

标签: arrays assembly x86 x86-16

该计划必须计算以下内容:

<{1>}数组中的

,每个索引的值都为VPMultiplying V1[INDEX] WITH V2[INDEX]数组中,程序VPROD所有数组值ADDS

示例:

VP

问题是当结果大于16位(一个单词)时,不会给出正确的结果。但是当结果小于16位时,它会给出正确的结果。

我想到了 Carry 并修复了我的代码,但它仍然给我带来了糟糕的结果。

我的代码:

VP = { V1[0]*V2[0] , V1[1]*V2[1] , V1[2]*V2[2] , V1[3]*V2[3] ,V1[4]*V2[4] }
VPROD = { VP[0] + VP[1] + VP[2] + VP[3] + VP[4] }

1 个答案:

答案 0 :(得分:0)

由于您从乘法中获得32位结果,因此您应该为vp数组的每个元素使用4个字节。您将需要使用单独的索引,当然将高位字存储在偏移+2而不是+1。对于求和部分,您应该加上低位和高位词。 乘法的固定代码可能如下所示:

            MOV DI, 0
LOVP:       MOV AX,v1[si]    
            MUL v2[si]
            MOV vp[di],AX
            MOV vp[di+2],DX
            ADD SI,2
            ADD DI,4
            LOOP LOVP

我相信您可以使用ADDADC自行进行总结。

<强>更新: 由于您的帖子说您要对vp数组求和,我不明白为什么您希望结果出现在另一个数组(vprod)中。总和是标量值,执行以下操作:

            MOV SI, 0
            MOV AX, 0
            MOV DX, 0
LOVPROD:    ADD AX,vp[SI]
            ADC DX,vp[SI+2]
            ADD SI,4
            LOOP LOVPROD

结果将在DXAX

另外,要使LOOP正常工作,您应该将迭代次数放入CX,而不是0

相关问题