複数の問題があります。
ここ
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
のオフセットがあります。の値を印刷してもよろしいですか? いつ、どこでの値を知りたいですか?iret
print dx
ip
ip
最後に、なぜこれらすべてに対して ISR を用意しているのですか?
ipp
まずはISRなしで作品を作ってみませんか?なぜデバッガを使わないのですか?