0

アセンブリでスネーク ゲームを作成しており、スネークの体の座標を (衝突目的で) 1 次元配列に格納しています。x 座標と y 座標を 1 バイトで格納しています。ヘビが動くたびに頭の座標を保存しています。これが私のコードです:

;(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 という名前の 1 次元配列を作成しました。

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 に答える