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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:31:13