0

我正在组装一个蛇游戏,并将蛇体的坐标(用于碰撞目的)存储在一维数组中。我将 x 和 y 坐标存储在一个字节中。每次移动时,我都会存储蛇头的坐标。这是我的代码:

;(ROW * WIDTH) + COL
MOV AL, 80 ; 80 IS THE WIDTH
MUL ROW
ADD AL, COL
MOV SI, AX
CMP TRAIL[SI], 0
JE @GAME_OVER

我制作了一个名为 TRAIL 的一维数组来保存数据。

TRAIL DB 2000 dup (1)

我的问题是,有时,即使没有与身体碰撞,蛇也会死亡。我认为问题在于将 ROW 乘以 AL(有时大于 AL)然后添加 COL 会给出错误的答案。我无法将 ROW 和 COL 更改为 dw,所以我唯一的选择是让该计算工作。请帮忙。

4

1 回答 1

0

您可以对单词进行操作,而不是进行字节加法:

mov ax,80
mul byte [ROW]
movzx bx,byte [COL]  ; zero-extend COL into BX
add ax,bx            ; ax = ROW*80 + COL

或者,如果您不想使用movzx

mov ax,80
mul byte [ROW]
add al,[COL]
adc ah,0       ; add 1 to AH if the previous addition resulted in a carry

( ADCAdd with Carry) 在逻辑上或多或少等同于以下 C 语句:

    ah += (((uint16_t)al + col) > 0xFF) ? 1 : 0;
于 2013-09-09T12:20:36.350 回答