MASM汇编循环跳转未累加数组符合条件最终值问题排查
问题原因分析与修复方案
先拆解你的代码执行流程,就能明白为什么sum最终是12(而非预期的18):
1. 标签大小写不匹配导致循环提前终止
MASM汇编器对标签大小写是严格敏感的——你的循环起始标签是小写的sumArray1,但循环末尾的跳转指令却写了大写的jmp SumArray1,这两个在MASM眼里是完全不同的标签!
看实际执行流程:
- 第一次循环:累加3,sum=3,edx=3
- 第二次循环:累加4,sum=7,edx=4
- 第三次循环:累加5,sum=12,edx=5
- 此时执行
jmp SumArray1,但这个标签根本不存在,程序会跳转到一个未定义的位置(直接终止循环流程),本该执行的第四次循环(累加6)被完全跳过,sum也就停在了12。
2. 逻辑验证:你的判断逻辑本身是对的
你的需求是累加数组中从j=3到k=6的元素(3、4、5、6),当前代码里cmp eax, k + jg array2的逻辑没问题——jg是“大于则跳转”,等于k的元素会被正常累加,只要修复标签问题就能得到预期结果。
修复后的代码
把跳转指令的标签改成和循环起始标签一致的小写即可:
.data j SDWORD ? k SDWORD ? array1 SDWORD 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 sum SDWORD ? .code _main PROC mov j, 3 ; 设置数组起始值J mov k, 6 ; 设置数组终止值K mov edx, 2 ; 设置J对应的起始索引 sumArray1: mov eax, [array1+edx*4] cmp eax, k jg array2 add sum, eax inc edx jmp sumArray1 ; 这里改成小写,和循环标签一致 array2: INVOKE ExitProcess, 0 _main ENDP END
修复后程序会正常执行第四次循环:取出array1[5]的值6,累加后sum变为18;edx自增为6,下一次循环取出7,7>6触发跳转退出,最终sum就是预期的18。
内容的提问来源于stack exchange,提问作者SlowMo
相关产品推荐
相关产品推荐

