複数の問題があります。
ここ
ipp:
pop dx
print dx
ret
でスタックから戻りアドレスを削除しますpop dx。ret返信アドレスを盗んだ後、どこに戻ってくると思いますか? アドレスをスタックに戻さないのはなぜですか?
また、同じことで、ISR によって中断されるプログラムpop dxのレジスタ値が破損します。ISRにdxセーブ&リストアしてみませんか?dx
さらに別のもの...私はあなたのアセンブラを知りませんが、この行
lea dx, #1
奇妙に見えます。マクロのこの行を呼び出すprint dxと、IMO は次のように変換されます。
lea dx, dx
これは無効な x86 命令です。あなたのコードはまったくコンパイルされますか??? もしそうなら、あなたのアセンブラは何をしますlea dx, dxか? それを作成しますmov dx, dxか、nopそれとも削除/無視しますか?
さらに、int 21h の関数 9 は、"$" で終わるアドレスを持つ ASCII 文字列を表示ds:dxし、コード内でそのような文字列を作成しません。
あなたのコードは決してセットアップせず、中断されたプログラムにたまたまある値dsを使用するだけです。これは悪いことです。ds使用する場合は、保存して復元する必要がありdsます。また、ISR のデータが ISR のコード セグメントに含まれる場合dsは、 の値をロードする必要がありますcs。
そして、beforedxのオフセットがあります。の値を印刷してもよろしいですか? いつ、どこでの値を知りたいですか?iretprint dxipip
最後に、なぜこれらすべてに対して ISR を用意しているのですか?
ippまずはISRなしで作品を作ってみませんか?なぜデバッガを使わないのですか?