MASM 数组不循环

Posted

技术标签:

【中文标题】MASM 数组不循环【英文标题】:MASM Array not looping 【发布时间】:2017-11-13 17:04:29 【问题描述】:

更新(2017-11-13):

我添加了另一个变量“索引”并将其设置为零。然后,在每个 .IF 循环之后,我将 4 (DWORD) 添加到索引,然后将其传递给 esi 寄存器并指向正确的数组变量。我还将includedCounter 变量移到了.IF 循环之外。现在答案是正确的!!

我正在尝试遍历一个数组并仅对 >= 3 &&

为什么 ESI 不递增到下一个数组?

值应返回“64”作为总和,“13”作为包含计数器。对于 sum,当前值返回“60”,对于 includedCounter,返回“20”,这告诉我数组中的第一个整数一直被指向,而不是数组中的每个整数都被指向。

; Calculates the sum of all array elements
; >= "lower" value (3) and <= "higher" value (8).

INCLUDE Irvine32.inc

.data
sum DWORD ?              ; EAX - holds sum of included integers 

lower DWORD 3            ; holds lower value
upper DWORD 8            ; holds higher value

;Update (2017-11-13)
index DWORD 0            ; holds index for array
;==============
loopCounter DWORD ?      ; ESI - holds loop array pointer
includedCounter DWORD ?  ; EDX - holds 'included' counter

array DWORD 3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3,8,4    ; values checked
arraySize = ($ - array) / TYPE array                   ; [current location lounter ($) - array / DWORD] = 20

.code
main PROC
 mov eax, sum
 mov ebx, lower
 mov ecx, upper
 mov edx, includedCounter

.WHILE loopCounter < arraySize     ; While loopCounter is less than 20
      ;Update (2017-11-13)
      mov esi, index
      ;===============
      .IF (array[esi] >= ebx) && (array[esi] <= ecx)
      add eax, array[esi]
      inc includedCounter
     .ENDIF
  ;Update (2017-11-13)
  add index, 4
  inc loopCounter
  ;================
.ENDW

; Display values
mov sum, eax
mov eax, sum
call WriteInt
call CrLF

mov eax, includedCounter
call WriteInt
Call CrLF

; Exit program
call WaitMsg

    exit
main ENDP
END main

【问题讨论】:

您认为代码的哪一部分应该增加ESI 好吧,如果 ESI 被添加到数组中以指向数组中的一个值,那么我应该增加 ESI 以指向数组中的下一个值,对吗? 【参考方案1】:

您的 cmets(代码内外)建议您认为递增 loopCounter 也会以某种方式自动递增 ESI。实际上,它们是不同的实体(一个是寄存器,另一个是内存中的位置),因此不会发生这种“自动递增”。 (事实上​​,通常情况下,汇编代码中不会“自动”发生任何事情。)

【讨论】:

好的,我添加了一个索引变量并将其设置为零。然后,我在每个 .IF 循环之后将 4 添加到索引中,现在答案是正确的。 .IFs 不是循环。

以上是关于MASM 数组不循环的主要内容,如果未能解决你的问题,请参考以下文章

MASM Assembly 中的数组(非常困惑的初学者)

如何将寄存器放入 MASM 中的数组索引中?

如何在 MASM 中找到浮点数组的平均值?

组装(masm)数组操作

在 MASM 中访问数组

如何在 MASM 中访问二维数组