在阵列组件8086中计数零

时间:2015-01-05 18:04:31

标签: arrays assembly x86-16

我编写了这段代码来计算数组vec中的零数:

.model small
.stack 100h           
.data
    vec dw 1,2,0,3,0,4,5,6,0,0,5
    m1 dw 0
.code
    mov ax,@data
    mov ds,ax
    mov di,1 ;di is our running index
number_of_zeros:
    mov ax,vec[di]
    cmp ax,0
    je increment_m1 ;case its zero
    inc di;case its not zero
    cmp di,11
    jl number_of_zeros
    cmp di,11
    je end
increment_m1:
    inc m1
    inc di
    cmp di,11
    jl number_of_zeros
    cmp di,11
    je end
end:
    mov ax,m1

它没有显示正确的输出。我希望看到AX = 4,但是,当程序运行完毕后,我可以看到AX = 3。

我认为问题在于如何访问数组中的各个元素。由于某种原因,我无法弄清楚,在第一次迭代时它说vec [1] = 0200

编辑:好的我更正了代码,它确实给出了期望的结果但是......它仍然显示了vec [di]的奇怪值。我仍然认为我错误地访问它,因为偶然,我得到了正确的结果。我希望有人对其进行审核。

1 个答案:

答案 0 :(得分:4)

有三个问题,以及许多改进解决方案的方法,我只想提一下修复:

  1. 数组的第一个元素位于偏移0,而不是1
  2. 每个元素的大小为2,而不是1
  3. 需要更新结束条件的比较(原因1和2)
  4. 所以这一行

    mov di,1 ;di is our running index
    

    应该是

    mov di,0 ;di is our running index
    

    和这一行

    inc di;case its not zero
    

    应该是

    add di,2 ;case its not zero
    

    和这一行

    cmp di,11
    

    应该是

    cmp di,20 ; last element is at offset sizeof(dw) * (num_elements-1) = 2 * (11-1) = 20
    

    这应该让它发挥作用。