汇编字节数组求和、拷贝与打印代码调试:求和结果错误排查
问题分析与修正
你的代码核心问题是求和逻辑完全错误:
- 你错误地对
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
相关产品推荐
相关产品推荐

