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

汇编字节数组求和、拷贝与打印代码调试:求和结果错误排查

问题分析与修正

你的代码核心问题是求和逻辑完全错误:

  • 你错误地对edx寄存器执行add edx, eax操作,但edx的作用是传递字符串地址给writestring,和求和毫无关系;
  • 你从未对total变量进行任何更新操作,最终输出的结果是寄存器残留值(最后一次循环的元素是9),而非真实总和。

修正后的代码

.data
a1 byte 0,1,2,3,4,5,6,7,8,9
a2 byte 10 dup(?)
space byte "  ",0
var1 byte "the sum is: ",0dh,0ah
total word 0

.code
main PROC
mov ecx,10       ; 设置循环次数为10
mov edi, 0       ; 数组索引初始化为0
mov ebx, 0       ; ebx作为累加寄存器,初始化为0

xx:
movzx eax,byte ptr a1[edi]  ; 取出当前字节元素,零扩展到eax
call writedec               ; 打印当前元素
mov edx,offset space        ; 加载空格字符串地址
call writestring            ; 打印空格

add ebx, eax                ; 将当前元素值累加到ebx
mov bl,a1[edi]              ; 取出当前元素到bl
mov a2[edi],bl              ; 拷贝到a2数组对应位置
inc edi                     ; 索引自增
loop xx                     ; 循环直到ecx为0

; 打印总和
mov edx,offset var1         ; 加载提示字符串地址
call writestring            ; 打印提示
mov eax, ebx                ; 将累加结果放到eax(writedec需要eax作为参数)
call Writedec               ; 打印总和

exit
main ENDP
END main

关键修改点

  • 新增mov ebx, 0初始化累加寄存器,用ebx存储总和;
  • 替换错误的add edx, eax为add ebx, eax,实现正确累加;
  • 循环结束后,将累加结果从ebx转移到eax(writedec要求输出值存放在eax中),再打印总和;
  • 移除原代码中多余的mov edx, offset space,避免干扰提示字符串输出。

你的数组拷贝逻辑是正确的,mov bl,a1[edi]和mov a2[edi],bl可以正常完成元素拷贝。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:45:42