NASM汇编数组元素求和:循环无法终止问题求助
问题排查与修复方案
嘿,我来帮你看看这个循环停不下来的问题~你的求和逻辑方向是对的,但有几个关键的汇编逻辑错误导致循环无法终止,甚至求和结果也不对,咱们一个个理清楚:
1. 循环终止逻辑完全颠倒
先看你这段核心循环代码:
top1: cmp bx, 3h jne end1 end1: add ax,[Arr+bx] add bx, 2 loop top1
当前逻辑是:如果bx不等于3h,就跳去end1执行加法;如果bx等于3h,就直接顺序执行end1的加法——这等于不管bx是什么值,都会执行加法操作,完全没起到终止循环的作用!而且你用loop指令的前提是要先初始化cx寄存器(loop是靠cx减1到0来终止循环的),你根本没设置cx,所以loop会使用内存里的随机值,循环自然停不下来。
2. 数组索引初始值错误
你的数组Arr是dw(双字节)类型,每个元素占2字节,内存布局是:Arr+0 → 16h,Arr+2 →50h,Arr+4→30h
你初始把bx设为1,第一次取的是Arr+1的00h(小端存储的高字节),这完全不是你要的数组元素,求和结果肯定不对。
修正后的代码
我给你调整了逻辑,提供两种可靠的实现方式:
方式一:用计数器cx控制循环次数(推荐)
org 0x0100 jmp start Arr: dw 16h,50h,30h start: mov cx, 3 ; 设置循环次数为3(数组共3个元素) mov bx, 0 ; 从数组第一个元素的偏移0开始 mov ax, 0 ; 累加器初始化为0 top1: add ax, [Arr+bx] ; 累加当前数组元素 add bx, 2 ; 偏移+2,指向下一个双字节元素 loop top1 ; cx减1,不为0就跳回top1继续循环 ; 这里可添加结果输出逻辑,比如调用DOS中断显示 INT 21h
方式二:用偏移值判断终止
如果你不想用cx,也可以通过判断bx是否超过数组最后一个元素的偏移来终止:
org 0x0100 jmp start Arr: dw 16h,50h,30h start: mov bx, 0 mov ax, 0 top1: cmp bx, 6 ; 3个元素×2字节=6,偏移到6时终止循环 je end_loop ; 等于6就跳出循环 add ax, [Arr+bx] add bx, 2 jmp top1 ; 跳回循环开头 end_loop: INT 21h
关键修正点总结
- 若使用
loop指令,必须先初始化cx明确循环次数 - 数组偏移从0开始,匹配
dw类型的2字节步长 - 修正颠倒的终止条件:当达到结束条件时跳出循环,而非继续执行
- 去掉多余的
end1标签,让逻辑更清晰
内容的提问来源于stack exchange,提问作者Mishal Rehaj
相关产品推荐
相关产品推荐

