MASM汇编语言WORD数组5元素求和实验逻辑问题求助
你的汇编求和代码逻辑问题分析与修正
嘿,我来帮你捋捋这段汇编代码里的核心问题,然后给出能正确计算数组和的实现:
原代码中的关键疏漏
- 数组注释与实际不符:你声明的是
DWORD类型数组,但注释写的是WORD数组,而且注释里的数字和实际数组元素(5,6,7,8,9)不一致,虽然这只是注释问题,但容易造成混淆。 - 寄存器初始化完全错误:
MOV eax, intarray:这是把数组第一个元素的值(5)加载到EAX,而非数组的内存地址——你要遍历数组,得先拿到数组的偏移地址才行。MOV ecx, intsum:这是把求和变量的初始值0加载到ECX,但loop指令需要ECX作为循环计数器,你应该把循环次数设为数组元素个数(5),不然ECX初始为0,loop会直接退出循环,根本不会执行求和操作。
- 循环体逻辑偏离目标:
add eax, ecx只是把EAX和ECX的值相加,完全没有访问数组的后续元素,这根本达不到遍历数组求和的目的。 - 未完成的调用:最后的
CALL...没有写完,不过这是次要问题,先把核心求和逻辑修正。
修正后的完整代码
下面是能正确计算intarray中5个元素和的代码,关键步骤我都加了注释:
INCLUDE Irvine32.inc .data intarray DWORD 5,6,7,8,9 ; DWORD类型数组,元素为5,6,7,8,9(正确求和结果是5+6+7+8+9=35) intsum DWORD 0 ; 存储求和结果 .code main PROC ; 初始化寄存器:准备遍历数组求和 mov eax, 0 ; EAX清零,用来累加和(初始和为0) mov esi, OFFSET intarray ; ESI存储数组的首地址 mov ecx, LENGTHOF intarray ; ECX设置为数组元素个数(这里是5),作为loop的计数器 L1: add eax, [esi] ; 把当前数组元素的值加到EAX(累加和) add esi, TYPE intarray ; ESI移动到下一个数组元素(DWORD类型,每次加4字节) loop L1 ; ECX减1,若不为0则跳回L1继续循环 mov intsum, eax ; 把最终的累加和存入intsum变量 call DumpRegs ; 查看寄存器状态,此时EAX应该是35 exit main ENDP END main
代码逻辑说明
- 初始化阶段:用
EAX做累加容器先清零,ESI保存数组首地址方便遍历,ECX用LENGTHOF intarray自动获取元素个数,避免硬编码数字,代码更灵活。 - 循环遍历:每次循环把
ESI指向的当前数组元素加到EAX,然后ESI移动一个DWORD的长度(4字节),loop指令自动递减ECX,直到ECX为0时退出循环。 - 保存结果:循环结束后,
EAX里就是数组所有元素的和,把它存入intsum变量即可。
这样运行后,intsum的值就是35,DumpRegs里的EAX也会显示35,完全符合预期。
内容的提问来源于stack exchange,提问作者Smith John
相关产品推荐
相关产品推荐

