【问题标题】:Counting zeros in an array assembly 8086在数组组件中计数零 8086
【发布时间】:2015-03-03 07:51:51
【问题描述】:

我编写了这段代码来计算数组 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] 的奇怪值。我仍然认为我访问它是错误的,并且由于机会而得到了正确的结果。我希望有人对其进行审核。

【问题讨论】:

  • 为了清楚我的要求,程序第一次到达 mov ax,vec[di] 我希望它移动 1 行,但它移动了 0200。
  • 我注意到您将 di 寄存器初始化为 1 而不是 0。自从我编写 8086 汇编代码以来已经很长时间了,但在 8086 中的内存寻址不是单字节分辨率.我可能完全错了,但如果是这种情况,那么你应该在从 vec 读取每个 dw 后将 di 增加 2。

标签: arrays assembly x86-16


【解决方案1】:

存在三个问题,以及许多改进解决方案的方法,我将仅提及修复:

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

所以这一行

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

这应该可以正常工作。

【讨论】:

  • 我刚刚意识到我需要增加 2 而不是 1,这确实解决了问题,谢谢您的意见。
  • 我也写了 mov di,offset vec, 然后 mov ax,[di] 代替。似乎做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
相关资源
最近更新 更多