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

MASM中使用递归填充封闭区域的异常问题排查

递归区域填充代码问题分析与修复

你的递归填充代码存在两个核心问题,导致仅绘制直线且无法正常退出:

1. 坐标操作逻辑混乱

处理四个方向时,坐标恢复步骤出现错误:

  • 以右方向为例,你执行inc cx进入右侧点递归,返回后却用两次dec cx回到原坐标左侧,直接导致左方向的判断和递归完全偏离正确位置。这种错误的坐标偏移,最终让程序只能沿单一方向绘制直线。

2. 缺少已填充判断,引发无限递归

每次进入fill时直接绘制当前点,但未先检查该点是否已经是边界(有颜色)或已被填充。这会导致同一个点被反复递归处理,最终栈内存耗尽,程序无法正常退出。


修正后的代码

fill PROC
    ; 先检查当前点是否已有像素(边界或已填充)
    call vmemr
    cmp al, 1
    je exit_fill       ; 已有像素,直接返回无需处理

    ; 在当前点绘制填充像素(颜色值AL=0)
    mov al, 0
    push cx
    push dx
    call vmem
    pop dx
    pop cx

    ; 递归处理右侧点
    inc cx
    call fill
    dec cx

    ; 递归处理左侧点
    dec cx
    call fill
    inc cx

    ; 递归处理上方点
    inc dx
    call fill
    dec dx

    ; 递归处理下方点
    dec dx
    call fill
    inc dx

exit_fill:
    ret
fill ENDP

关键修改说明

  • 前置边界与填充判断:进入函数后先调用vmemr,如果当前点已有像素(边界或已填充),直接返回,避免无效递归和重复绘制。
  • 修正坐标恢复逻辑:每个方向处理完成后,仅执行一次反向操作恢复原坐标,确保四个方向的递归都基于当前起始点,不会出现坐标偏移。
  • 简化流程结构:去掉冗余的分支标签,改为直接移动坐标递归、恢复坐标的线性逻辑,避免原代码中复杂分支导致的坐标混乱。

内容的提问来源于stack exchange,提问作者user27789527

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:50:55