2012-03-11 13 views
4

私の問題は、dosveのようなシステムライブラリを使わずに割り込みを再プログラミングする必要があることです。getvectやsetvectのような関数を使うことはできません。私はCで作業プログラムを作っています(asmの挿入があります)が、DOSの機能を使っています。どうすればdos.hを使わずに、asmを代わりに使うのですか?c/asmでの割り込みの再プログラミングx86

私はメモリに一定の場所にプログラムを書くことについて考えた後、割り込みベクタテーブルにADRESを変更するが、私はこれを行うにはどのようには考えている - 特にそのプログラムがC.

にほとんどである私は、システムクロックを再プログラムする必要があります割込みおよびLPT割込みを含む。システムクロックのタイマーが高速化されているので、毎回元のシステムクロック割り込みを生成する必要があります。

+2

はうわー、これは20〜25年前のプログラミングDOSの思い出を思い出させるのに

xor ax, ax mov es, ax mov bx, interrupt_number mov ax, cs mov es[bx*4], ax mov es[bx*4+2], offset yourSubroutine 

それは、このようなものでなければなりません。どのプラットフォームでこれをやろうとしていますか? 16ビットMS-DOS(またはDosbox)? –

+0

私のために2歳の思い出を持ち帰ります:) OSDevは中毒性です。 –

+0

私はまずwin98でDOSを使いましたが、今はFreeDosを使用しています – micmax93

答えて

3

私が覚えている限り、割り込みテーブルは0000:0000hに開始されました。割り込みレコードごとに4バイトがあります。オフセットのセグメント2は2バイトです。私は非常に正確に覚えていない

+3

これは正しいようです。心に留めておくべきことは、元の値を最初に保存することです。そのため、呼び出すときや、アプリケーションを終了するときに元のハンドラを参照することができます。 –

+0

正解、ssg。あなたはいつも元の値を保存し、プログラムがint 20hやmov ax、0x4c int 21hに達するとすぐにそれらを元に戻すべきです。 –

+0

しかし、私の問題は私のプログラムのアドレを得る方法です、特にそれは普通のasm - myプログラムはCで70%です。 – micmax93

関連する問題