需要循环帮助以迭代方式添加到程序集中的总和变量

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

本文关键字:集中 程序集 程序 变量 添加 循环 帮助 方式 迭代      更新时间:2023-10-16

我正在尝试将以下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+数字[index] 转换为汇编。如果有人能帮助我做到这一点,那就太棒了。我试图翻译它(从"总计:mov esi,偏移数字"开始的行到"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那么你想要更新总和,否则只需增加索引并回到"顶部";也就是重新检查停止条件。

您的原始 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