この質問は、他の部門関連の障害のバリエーションです。
あなたのデバッガがにジャンプするようだどうやらランダムコードは、算術演算例外ハンドラ(ゼロ除算なども同じもの)です。あなたのコードにDivision Overflow
が発生しています。あなたは16ビット/ 8ビットIDIVをやっています。ドキュメントから:
AXはr/m8で符号分割し、結果はAL:←Quotient、AH←Remainに格納されます。
ます(あなたのケースBLに)8ビットの除数と分割するための商の範囲は-128~ + 127であることがわかります。 044c0h IDIV 85は207(10進数)です。 207は符号付き8ビットレジスタに収まらないため、除算のオーバーフローと予期しない問題の原因が発生します。
これを解決するには、最大16ビットの除数に移動できます。だから、除算をBX(16ビットレジスタ)に置くことができます。それはmov bx, 85
です。残念ながら、それほど単純ではありません。 16ビットの除数を使用する場合、プロセッサは被除数がDXの上位16ビットで32ビットであり、下位16ビットがAXであるとみなします。
符号付き除算DX:AXはr/m16で、結果はAX←Quotient、DX←残りに格納されます。
この問題を解決するには、AXの16ビット値を符号拡張する必要があります。これは、命令をAXに配置した後に使用する必要があるため、単純です。命令セットリファレンスから
DX:AX←AXの符号拡張。効果的
AXの最上位ビット(MSB)が0 DXある場合、MSBは、次に1 DXが0FFFFH(いずれかに設定されたすべてのビット)になる場合は0となるであろう。数字の符号ビットはMSBです。そう
mov ax, 044c0h
cwd ; Sign extend AX into DX (DX:AX = 32-bit dividend)
mov bx, 85 ; Divisor is 85
idiv bx ; Signed divide of DX:AX by BX
あなたの部門の署名商が8ビット・レジスタ(_AL_)に収まらない可能性があるので:すべてこれにより
は心の中であなたの部門コードは、16ビットの除数を取るように調整することができ算術オーバーフローが発生しています。 r16/r8 [IDIV](http://www.felixcloutier.com/x86/IDIV.html)の商の範囲は-128から+127です。あなたの部門は207の商を得ます。 –@MichaelPetch:そうです。私はちょうど答えとして提出しようとしていたが、あなたは私を打つ! – wallyk
これはINT 00h割り込みハンドラになります。ちょっと私には驚くべきことですが、壊れたコードにジャンプして、無限ループを引き起こします。私はそれがアプリケーションを終了する、エラーメッセージを印刷する、またはもう少し明白な何かを期待していただろう。あなたはこれによって混乱するのは何日もの間に二人目です。 –