Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 8086汇编中乘法的错误结果_Arrays_Assembly_X86_X86 16 - Fatal编程技术网

Arrays 8086汇编中乘法的错误结果

Arrays 8086汇编中乘法的错误结果,arrays,assembly,x86,x86-16,Arrays,Assembly,X86,X86 16,程序必须计算以下各项: 在VP数组中,每个索引的值都是V1[index]乘以V2[index] 在VPRODarray中,程序添加数组VP 例如: 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] } 问题是,当结果大于16位(一个字)时,不会给出正确的结果。但当结果小于16位时,它会给出正确的结果

程序必须计算以下各项:

VP
数组中,每个索引的值都是V1[index]乘以V2[index] 在
VPROD
array中,程序
添加数组
VP

例如:

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] }
问题是,当结果大于16位(一个字)时,不会给出正确的结果。但当结果小于16位时,它会给出正确的结果

我考虑过携带
并修复了我的代码,但它仍然给了我糟糕的结果

我的代码:

    dseg segment

    v1 DW 255,5,255,9,21
    v2 DW 4,4,255,13,5
    vprod DW 10 DUP (0)
    vp DW 10 DUP (?)
    N DB 5
    dseg ends

    sseg segment stack
            dw 100h dup(?)
    sseg ends

    cseg segment
    assume  ds:dseg,cs:cseg,ss:sseg
    start:      mov ax,dseg
                MOV DS,AX
            MOV SI,0
            MOV CX,0
            MOV CL,N
            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
            MOV CX,0
            MOV CL,N
            MOV SI,0
            MOV DI,0
LOVPROD:    MOV AX,vp[SI]
            ADD vprod[DI],AX
            ADC VPROD[DI+2],0
            ADD SI,2
            LOOP LOVPROD

    SOF:
                mov ah,4ch
            int 21h
    cseg ends
    end start

由于乘法的结果是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
我相信您可以自己使用
ADD
ADC
进行求和

更新: 因为你的帖子说你想对
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
结果将显示在
DX
AX


另外,为了使
循环正常工作,您应该将迭代次数放入
CX
,而不是在执行时放入
0

您得到了什么结果?你有一个调试器可以单步调试你的代码吗?@JasonGoemaat让我们假设我有两个数组(再看看,我更新了值),结果应该是:102EF我得到的是:03DEWhat assembler你在用什么?在我习惯的语法中,一行应该是“mov cl,[N]”,而不是“mov cl,N”