解决此汇编程序中的逻辑错误

时间:2013-12-09 22:03:18

标签: assembly x86 dos

汇编语言程序,用于计算两个系列的乘积之和:

Total = Submission (where i=from 0 to n) S1(i)*S2(i)

其中:

S1: DW 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
S2: DW 20, 19, 18, 17, 16, 15, 14, 13, 12, 11

我的努力:

[org 0x0100]

jmp start


s1: dw 1,2,3,4,5,6,7,8,9,10
s2: dw 20,19,18,17,16,15,14,13,12,11
total: dw 0

subroutine: 
       mov si,0
       mov cx,10

label: mov ax,[bx+si]
       mov dx,[bx+si]
       mul ax
       add [total],ax
       add bx,2
       dec cx
       shl cx,1
       jnz label

       mov cx,[total]
       ret

start: mov bx,s1
       mov dx,s2
       mov cx,10
       call subroutine

       mov ax,0x4c00
       int 0x21

2 个答案:

答案 0 :(得分:0)

   dec cx
   shl cx,1
   jnz label

CX从10开始,变为9,18,跳跃 下一循环:18,17,34,跳跃 下一循环:34,33,66,跳转 下一循环:66,65,130,跳

现在看问题了吗?

提示:LOOP命令递减CX并跳转,如果不是零......

答案 1 :(得分:0)

我在这里看到了很多问题:

  1. 在调用函数之前设置cx两次,在函数中设置一次。这不会导致实际问题,但它是无用的。
  2. 您使用ax加载dx [bx+si]。据推测,这些应该来自个人列表s1s2,因此您需要另一种方式(注册)来跟踪其他列表。
  3. 您的shl cx,1不是必需的 - 它基本上会加倍cx,这意味着前面的dec cx对于接近于零不会有太大帮助: - )