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”