汇编遍历数组求和调试求助:EBX未正确累加,疑OFFSET使用错误
问题分析与代码修正
核心问题点
- 操作数大小不匹配:
myArray是字节型数组(db定义),但add ebx, [esi]默认按32位双字读取内存,导致每次累加的是数组首字节+后续三个未初始化垃圾字节,而非单个元素。 - 未推进数组指针: ESI 始终停留在数组首元素地址,未通过
inc esi移动到下一个字节,重复累加错误数据。 - 冗余ECX操作: ECX未初始化就被修改,且对求和逻辑无意义,属于无效代码。
修正后的代码
.data myArray db 1, 2, 3 ; 字节型数组,元素为1、2、3 .code main PROC mov eax, 3 ; 数组元素个数(循环计数器) mov ebx, 0 ; 初始化总和为0 mov esi, OFFSET myArray ; 获取数组起始地址到ESI(OFFSET使用正确) top: add ebx, byte ptr [esi] ; 显式指定读取字节数据,累加至EBX inc esi ; 推进指针到下一个数组元素 dec eax ; 计数器减1 jnz top ; 计数器不为0则继续循环 done: mov eax, ebx ; 将总和存入EAX寄存器 INVOKE ExitProcess, 0 main ENDP END main
关键细节说明
OFFSET的正确用法:
OFFSET 是汇编器指令,用于获取变量的内存起始地址。你代码中mov esi, OFFSET myArray的用法完全正确,它将数组首地址加载到ESI,是遍历数组的标准操作。操作数大小显式声明:
使用byte ptr [esi]告诉汇编器读取ESI指向的单个字节,避免默认按双字读取的错误。如果是无符号字节,也可使用movzx edx, byte ptr [esi]零扩展后再累加,避免符号扩展问题(正数场景两种方式效果一致)。指针推进:
每次循环执行inc esi,让ESI指向下一个字节元素,确保每次累加的是数组的下一个有效值。冗余代码清理:
移除了无关的ECX操作,因已用EAX作为循环计数器,无需额外寄存器。
内容的提问来源于stack exchange,提问作者Robbie Woodhams
相关产品推荐
相关产品推荐

