汇编中的递归问题:编码扫雷

时间:2015-11-08 22:10:09

标签: assembly recursion x86 minesweeper

所以现在我正在尝试为一个类编写扫雷。我坚持使用的部分是在用户点击空白磁贴后尝试更新所有网格。

不幸的是,每当我尝试运行我的代码时,它就会崩溃。有人可以帮忙吗?

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会将周围的值更新为数字

1 个答案:

答案 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 bxpop ax更改为双字变体。这将在这些递归调用中保持双向对齐堆栈。