需要循环帮助以迭代方式添加到 Assembly 中的 sum 变量

Need assistance with loop to iteratively add to sum variable in Assembly

我正在尝试将以下 C++ 代码转换为汇编代码(MASM、Irvine32):

const int SIZE = 10;

int numbers[SIZE] = {10,60,20,33,72,89,45,65,72,18};
int limit = 50;
int index = 0;
int sum = 0;

while( index < SIZE )
{
    if( numbers[index] <= limit )
    {
        sum = sum + numbers[index];         // sum += array[index];
    }
    index++;
}

如果有人能弄清楚我哪里出错了 -- 我在 L1 遇到错误:它只是喷出“+10”。我相信这是因为我无法将 sum=sum+numbers[index] 翻译成 Assembly。如果有人可以帮助我做到这一点,那就太棒了。我尝试翻译它(从 "total: mov esi, offset numbers" 到 "inc index" 的行)显然是不正确的。

.data
SYZ = 10
numbers DWORD 10, 60, 20, 33, 72, 89, 45, 65, 72, 18
limit DWORD 50
index DWORD 0
sum DWORD 0

.code
main PROC
mov eax, index
mov ebx, SYZ
top: cmp eax, ebx
jae next
jb total

total: mov esi, OFFSET numbers
mov ecx, limit

cmp [esi], ecx

jbe L1

L1: add eax, ebx

inc index

jmp top

next: mov edx, sum

call WriteInt



exit
main ENDP
END main

您实现 if 的条件分支是错误的。它应该看起来像:

top:
...
    cmp [esi], ecx
    ja L1               ; conditional jump *over* an ADD instruction
    add eax, [esi]      ; [esi] is array[index] if you increment ESI properly...
L1: inc index
    jmp top

在您的 C++ 中,您可以看到如果 numbers[index] <= limit 则您想要更新总和,否则只需递增索引并返回到 "top";也就是重新检查停止条件。

您的原始 asm 代码正在执行条件检查,然后不管结果如何继续。

    cmp [esi], ecx
    jbe L1               ; jump or fall-through to L1, condition irrelevant
L1: add eax, ebx

原始 asm 的 C++ 等价物是:

if( numbers[index] <= limit )
{
}

    sum += ebx;
    index++;

我不确定这是否能解决您所有的问题,但它肯定会解决其中一个问题。

.data
SYZ = 10
numbers DWORD 10, 60, 20, 33, 72, 89, 45, 65, 72, 18
limit DWORD 50
index DWORD 0
sum DWORD 0

.code
main PROC
mov eax, index
mov ebx, SYZ
mov esi, OFFSET numbers
mov ecx, limit
mov edx, 0

top: cmp eax, ebx
jae next
cmp [esi], ecx
ja L1
add edx, [esi]
L1: inc index
mov eax, index
add esi, 4
jmp top

next: mov sum, edx
      mov eax, sum
      call WriteInt