Assembly MASM32(组件)使用二维坐标访问一维阵列的元素

Assembly MASM32(组件)使用二维坐标访问一维阵列的元素,assembly,masm,Assembly,Masm,我正在组装一个蛇游戏,我将蛇的身体坐标(用于碰撞)存储在一个一维数组中。我将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) 我的问题是,有时,蛇死了,即

我正在组装一个蛇游戏,我将蛇的身体坐标(用于碰撞)存储在一个一维数组中。我将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)

我的问题是,有时,蛇死了,即使它没有碰撞的身体。我认为问题在于将行乘以AL(有时大于AL),然后加上COL会给出错误的答案。我不能将ROW和COL更改为dw,所以我唯一的选择就是让计算工作起来。请提供帮助。

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

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
ADC
(带进位添加)在逻辑上或多或少等同于以下C语句:

    ah += (((uint16_t)al + col) > 0xFF) ? 1 : 0;

我得到一个错误,在这些行中显示“在上下文中键入非法”:mul byte[ROW]movzx bx,byte[COL];BXMy代码中的零扩展列采用NASM语法。对于MASM/TASM,您可以编写
byte ptr
而不是
byte
。它现在可以工作了。非常感谢。你能解释一下“多字节[行]”、“添加al、[col]”和“adc ah,0”的作用吗?
mul-byte[行]
mul-row
没有什么区别。我刚才明确指出,操作数是一个字节;但是汇编程序会自己解决这个问题的
add al,[col]
与TASM/MASM语法中的
add al,col
的含义相同,但NASM要求在变量名周围加括号。注释中解释了
adc
的用途;它从上一次加法中提取结果的第九位,并将其添加到
AH
(AX的高位字节)。