【问题标题】:Conditional in Loop MASM x86 Assembly条件循环 MASM x86 程序集
【发布时间】:2014-10-25 23:53:11
【问题描述】:

我正在使用 Irvine 库。

我想遍历一个 DWORD 数组,同时检查每个值是否在 j 和 k 的范围内。我的代码目前不起作用。这是我所拥有的:

INCLUDE Irvine32.inc
COMMENT !
.386
.model flat, stdcall
.stack 4096

ExitProcess PROTO, code:DWORD
DumpRegs PROTO
!

.data
myArr DWORD 1h,2h,3h,4h
prompt BYTE "Enter the value for j and k: ", 0
counter BYTE ?

.code
MAIN PROC
  mov eax, 0              ;    sum

  ; Get user vals for j and k
  mov edx, OFFSET prompt
  CALL WriteString
  CALL ReadInt
  mov ebx, eax

  CALL ReadInt
  mov edx, eax



  CALL sumArr             ; Call #1  *****

  mov ebx, 5              ;   j = 5
  mov edx, 8              ;   k = 8

  CALL sumArr             ; Call #2  *****


Main endP



sumArr PROC USES esi ecx edx ebx
    mov counter, LENGTHOF myArr
    mov esi, OFFSET myArr   ;    location pointer
    mov ecx, LENGTHOF myArr ;    size


    getArr:
      cmp ebx, [esi]
      jae aboveEqual
      add esi, TYPE myArr


    aboveEqual:
      cmp edx, [esi]
      jbe inRange

    inRange:
      add eax, [esi]

      LOOP getArr
    CALL DumpRegs
    RET
sumArr ENDP

我希望能够对数组中的每个元素进行比较。我该怎么做?

【问题讨论】:

    标签: loops assembly masm irvine32


    【解决方案1】:

    您忘记在 SUMARR 中将 EAX 归零。
    cmp ebx,[esi]cmp edx,[esi] 都必须交换源和目标操作数。
    add esi, TYPE myArr 移动到 LOOP 指令之前。
    如果不进行条件跳转,则无条件跳转到add esi, TYPE myArr 指令。

    mov ecx, LENGTHOF myArr 中,立即数是 4 还是 16?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多