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
相关产品推荐
相关产品推荐

