【问题标题】:Issue with recursion in Assembly: Coding Minesweeper汇编中的递归问题:编码扫雷
【发布时间】: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


【解决方案1】:

只有当 fillAroundArray 知道空白是用数字 3 编码时,两个循环才会迭代相同的次数。验证...

 whitespaceClick PROC uses eax ebx ecx esi edi

uses ... 标记您的过程是否自动意味着这些寄存器被保留?
如果没有,那么您需要在递归调用周围保存/恢复循环计数器的值。

 mov  Y, al
 push ecx
 call whitespaceClick
 pop  ecx
loop update

在 16 位代码中,使用 ECX 作为小型循环计数器会很愚蠢。所以我断定这是 32 位代码,然后我建议将 push bxpop ax 都更改为 dword 变体。这将在这些递归调用中保持一个双字对齐的堆栈。

【讨论】:

  • USESMASM/TASM 汇编中的 PROC 语句上告诉汇编器需要保留这些寄存器。它们在函数 prologue 和 epilogue 代码中自动保存和恢复到堆栈中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多