2

1896 の配列で crusor の場所を見つけようとしました (2D で 79*24 のコンソール全体になります)。このために、場所を取得して 79 で割りました。

MOV AX, [Y-16H]
 DEC AX
 MOV BX, 79
 DIV BX   
 MOV Z, DL
 ADD Z, DH
 MOV DL, Z
 MOV Z, AL
 ADD Z, AH
 MOV DH, Z

オーバーフロー エラーが発生します。私が間違っていることを教えてください。多分解決策を提案しますか?

4

2 に答える 2

9

DIV BXDX(上位ワード) とAX(下位ワード) によって形成される 32 ビットの数値を で割りBXます。したがって、オーバーフローを避けるために、除算の前にクリアする必要がありますDX(例: )。XOR DX,DX

ところで、本当に 80 で割りたくないのですか? 私はそのような問題の専門家ではありませんが、79 列のコンソールについては聞いたことがありません。

于 2013-07-31T12:54:26.990 に答える
2

Michael が述べたように、除算の前に DX レジスタをクリアする必要があります。

とはいえ、速度に関心がある場合 (アセンブリ コーディングの通常の理由)、乗算と右シフトを使用して 79 による除算を同等の演算に変換する方がはるかに(x * 53093) >> 22高速です。

1/79thは にほぼ等しいため、これは機能し53093 / (2**22)ます。

于 2013-08-02T23:39:23.803 に答える