所以现在我正在尝试为一个类编写扫雷。我坚持使用的部分是在用户点击空白磁贴后尝试更新所有网格。
不幸的是,每当我尝试运行我的代码时,它就会崩溃。有人可以帮忙吗?
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会将周围的值更新为数字
答案 0 :(得分:0)
只有当 fillAroundArray 知道空格是用 3 编码时,两个循环才会迭代相同的次数。验证......
whitespaceClick PROC uses eax ebx ecx esi edi
使用使用... 标记您的程序是否会自动保留这些寄存器? 如果它没有,那么你需要在递归调用周围保存/恢复循环计数器的值。
mov Y, al
push ecx
call whitespaceClick
pop ecx
loop update
使用ECX进行小型循环计数器的16位代码将是愚蠢的。所以我得出结论这是32位代码,然后我建议将push bx
和pop ax
更改为双字变体。这将在这些递归调用中保持双向对齐堆栈。