【问题标题】:Can anyone tell me where these values are coming from in this assmbly code?谁能告诉我这些值在这个汇编代码中来自哪里?
【发布时间】:2021-05-26 12:04:08
【问题描述】:

我从 youtube 获得此代码。这是在国际象棋游戏中移动棋子的代码。我还附上了我从youtube获得的源代码https://github.com/r1fl/8086-Assembly-Chess
这是代码。

moves@validateMove:
        pawn@moves:
            xor cx, cx

            cmp [byte si], 0
            jg black@pawn

            white@pawn:
                pawn1@white:
                    mov bx, si
                    **sub bx, 8**

                    cmp [byte bx], 0
                    jne pawn2@white

                    push bx
                    inc cx

                pawn2@white:
                    mov bx, offset board@engine
                    **add bx, 48d**

                    cmp si, bx
                    jb pawn3@white

                    mov bx, offset board@engine
                    **add bx, 55d**

                    cmp si, bx
                    ja pawn3@white

                    mov bx, si
                    **sub bx, 16d**
                    push bx
                    inc cx

板子初始化代码 (https://github.com/r1fl/8086-Assembly-Chess/blob/8e317f2aa05f1ee843f3bf3b0e7fc196f0ae8e7a/engine.inc#L11) 表明它对板子使用字节数组,并为数组索引使用类似的地址数学风格。

【问题讨论】:

  • 请不要发布代码图片(或一般文本)。而是将文本 as text 复制粘贴到问题中。如果要标记某些特定代码,请在该行添加注释。
  • 另外请花一些时间阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist
  • 我并不完全清楚 si 在这里包含什么。但是offset board@engine + 48offset board@engine + 55大概代表了棋盘上方块A2和H2的地址。
  • 好的,所以我猜si 是棋子的当前位置。所以si-8是正上方方格的地址,si-16是上方两步方格的地址,si-7是上方右方方格的地址,si-9是上方方格的地址上面和左边的正方形。假设您熟悉如何允许 pawn 移动,那么应该很清楚为什么代码会专门检查这些位置。
  • @Michael:是的,棋盘初始化代码 (github.com/r1fl/8086-Assembly-Chess/blob/…) 显示了它用于 64 字节数组中的棋子/棋子的值。 (以及它使用的低效代码,比如add,而不是像[board@engine + bx] 这样的寻址模式,更不用说rep stosb 将板归零了。)

标签: assembly chess emu8086


【解决方案1】:
  • n 向前 p 右 = n*8 - p
  • n 向前 p 向左 = n*8 + p
  • n 向后 p 向右 = n*8 + p
  • n 向后 p 向左 = n*8 - p

这是板子的实际逻辑

【讨论】:

    最近更新 更多