【发布时间】: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 + 48和offset 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将板归零了。)