汇编程序执行无限循环无报错,求读取数组最大值的解决方案
8086汇编找数组最大值无限循环问题排查与修复
问题根源分析
你的代码出现无限循环及功能异常的原因如下:
- 循环后逻辑溢出触发无限循环:当
CX递减到0时,LOOP LOOPX停止跳转,会继续执行后续输出代码,但输出代码后紧跟UPDATE标签,执行MOV BL,[SI]和JMP RESUME后,回到RESUME执行INC SI,再执行LOOP LOOPX——此时CX为0,LOOP指令先将CX减1变为0FFFFH,之后CX会持续递减但永远无法回到0,陷入无限循环。 - UPDATE标签位置错误:
UPDATE被放在循环结束的输出代码之后,破坏了正常流程,导致循环结束后意外进入更新分支。 - 输出功能未完成:设置
AH=2(DOS字符输出功能)后,缺少INT 21H调用DOS中断,无法完成输出。 - 循环计数冗余:初始已将第一个元素存入
BL作为初始最大值,后续只需比较剩余5个元素,CX设为6会导致重复比较第一个元素。
修复后的代码
.MODEL SMALL .STACK 100H .DATA ARRAY DB 1,9,8,3,4,7 .CODE MAIN PROC MOV AX,@DATA MOV DS,AX MOV SI,OFFSET ARRAY MOV CX,5 ; 剩余5个元素需要比较 MOV BL, [SI] ; 初始化最大值为第一个元素 INC SI ; 直接跳到第二个元素开始比较 LOOPX: CMP [SI], BL JGE UPDATE ; 当前元素更大则更新最大值 JMP RESUME ; 否则跳过更新 UPDATE: MOV BL,[SI] ; 更新最大值 RESUME: INC SI LOOP LOOPX ; 递减CX,CX不为0则继续循环 ; 输出最大值(转换为ASCII) ADD BL,30H ; 数字转ASCII用30H,原代码51H是错误转换 MOV DL,BL MOV AH,2 INT 21H ; 调用DOS中断完成输出 ; 程序退出,避免执行多余代码 MOV AH,4CH INT 21H MAIN ENDP END MAIN
关键修改说明
- 调整
CX初始值为5,同时在初始化后直接INC SI,从第二个元素开始比较,避免重复比较第一个元素。 - 将
UPDATE标签移至循环内部,确保只有在需要更新最大值时才进入该分支,不会在循环结束后意外触发。 - 修正ASCII转换逻辑:数字转ASCII应加
30H(原代码的51H是字符'3'的ASCII值,属于错误转换)。 - 添加
INT 21H调用DOS中断完成字符输出,同时添加程序退出的中断调用,避免执行多余代码。 - 调整跳转逻辑,让代码流程更清晰易懂。
内容的提问来源于stack exchange,提问作者Japs
相关产品推荐
相关产品推荐

