【问题标题】:Wrong result in multiplying in 8086 assembly在 8086 汇编中乘以错误的结果
【发布时间】:2014-03-09 01:54:15
【问题描述】:

程序必须计算以下内容:

VP数组中,每个索引的值为Multiplying V1[INDEX] WITH V2[INDEX]VPROD数组中,程序ADDS数组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 位时,它会给出正确的结果。

我考虑过 Carry 并修复了我的代码,但它仍然给我带来了不好的结果。

我的代码:

    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

【问题讨论】:

  • 你得到什么结果?你有一个可以单步调试代码的调试器吗?
  • @JasonGoemaat 假设我有这两个数组(再看一遍,我更新了值),结果应该是:102EF 我得到的是:03DE
  • 你用的是什么汇编程序?在我习惯的语法中,一行应该是 'mov cl,[N]' 而不是 'mov cl,n'

标签: arrays assembly x86 x86-16


【解决方案1】:

由于您从乘法中得到 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

结果将在DX:AX

此外,为了使LOOP 正常工作,您应该将迭代次数放入CX,而不是像您所做的那样输入0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多