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

汇编程序执行无限循环无报错,求读取数组最大值的解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:01:08