【发布时间】:2015-11-08 22:10:09
【问题描述】:
所以现在我正在尝试为课程编写扫雷程序。我坚持的部分是在用户单击空白图块后尝试更新所有网格。
不幸的是,每当我尝试运行我的代码时,它都会崩溃。有人可以帮忙吗?
whitespaceClick PROC uses eax ebx ecx esi edi
call convertXYval
mov GridValues[eax], 250
call updateSurroundings
mov edi, 0
call clearAroundArray
call fillAroundArray
cmp edi, 0 ;if no spaces around it
je done
mov ecx, 8
mov esi, 0
store:
cmp aroundArray[esi], 3
jne skp
mov bh, aroundArrayX[esi]
mov bl, aroundArrayY[esi]
push bx
skp:
inc esi
loop store
mov eax, 0
mov ecx, edi
update:
pop ax
mov X, ah
mov Y, al
call whitespaceClick
loop update
Done:
ret
whitespaceClick ENDP
注意事项:
X 和 Y 是 BYTE 类型的变量,用于跟踪当前位置
convertXYval 是将 x,y 值转换为与数组中的位置对应的单个值的过程
fillAroundArray 将使用值 (0,1,2,3) 填充一个 8 元素数组,并返回 edi 中当前位置周围的空格数
whitespaceClick 将周围的值更新为数字(如果它们正在接触炸弹)
【问题讨论】:
-
学习使用调试器。非常可疑的是,您有 2 个具有不同迭代计数的循环,其中第一个推送值,第二个弹出。还要评论您的代码,特别是如果您希望其他人提供帮助。另请参阅minimal reproducible example。
-
我有两个循环的正当理由第一个循环的目的是找到相邻的包含空格的 xy 值并将它们存储第二个循环一次提取一个值,设置 x 和y 对他们然后调用 whitespaceClick proc recursaivly
-
可能是这样,但是两个循环处理相同数量的项目并不明显,如果堆栈变得不平衡,就会导致崩溃。第一个循环运行 8 次,但仅有条件地推送一个值,第二个循环运行
edi次,无论edi是什么。此外,为什么您不能在第一个循环中只在call whitespaceClick中不将内容存储在堆栈中,这也不是很明显。正如我所说,注释您的代码(明智地)并使用调试器。 -
@Jester edi 包含相邻空格的数量,我在笔记中提到了这一点。这两个循环将迭代相同的次数
-
如果您提供Minimal, Complete, and Verifiable example 会有所帮助。我认为不看周围的代码就不可能回答这个问题。产生问题的最小完整运行程序将是理想的。
标签: assembly recursion x86 minesweeper