You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编遍历数组求和调试求助: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

关键细节说明

  1. OFFSET的正确用法:
    OFFSET 是汇编器指令,用于获取变量的内存起始地址。你代码中 mov esi, OFFSET myArray 的用法完全正确,它将数组首地址加载到ESI,是遍历数组的标准操作。

  2. 操作数大小显式声明:
    使用 byte ptr [esi] 告诉汇编器读取ESI指向的单个字节,避免默认按双字读取的错误。如果是无符号字节,也可使用 movzx edx, byte ptr [esi] 零扩展后再累加,避免符号扩展问题(正数场景两种方式效果一致)。

  3. 指针推进:
    每次循环执行 inc esi,让ESI指向下一个字节元素,确保每次累加的是数组的下一个有效值。

  4. 冗余代码清理:
    移除了无关的ECX操作,因已用EAX作为循环计数器,无需额外寄存器。

内容的提问来源于stack exchange,提问作者Robbie Woodhams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:31:08