2

tsrプログラミングを勉強している間、私は理解できない特定のコードの使用を見てきました。

cede部分の例は(c):(太字のセクションを説明してください)

#include "dos.h"
#include"stdio.h"
void interrupt our();
void interrupt (*prev)();
char far *scr=(char far*)0xB8000000L;
int ticks;
unsigned char color;
main()
{   
    prev=getvect(8);   // <<<<<
    setvect(8,our);    // <<<<<
    keep(0,10000);     // <<<<<
}
4

2 に答える 2

2

このプログラムは、割り込みハンドラをインストールします。割り込み番号8、システムタイマー割り込みを使用します。これは、DOSを実行しているマシンで「継続的に」何かを行うためにこの割り込みを使用する一般的な方法でした。

prev=getvect(8);

この行は、割り込みベクトル、つまり、システムが1秒間に18回呼び出す関数へのポインターを取得します。

setvect(8,our);

この行は、割り込みベクトルを設定します。つまり、古い関数の代わりにこの関数を1秒間に18回呼び出すようにシステムに指示します。クラッシュを回避するために、新しい関数は、その主な目的(文字の大文字と小文字を変更しているように見える)に加えて、古い関数を呼び出す必要があることに注意してください。

keep(0,10000);

この行は、プログラムを終了コード(成功0のための従来の値)で作成し、バイト(またはおそらく16バイト単位?ありそうもない;覚えていない)をRAMに残すようにDOSに指示します。これは、DOSが以前にプログラムによって占有されていたすべてのRAMを空きとしてマークするプログラム()の通常の完了とは異なります。10000exit(0)

TSRプログラムのクラッシュの一般的な原因はkeep、最後にがないことが原因です。DOSは、関数のコードによって占有されていたメモリを解放しour、次の1/18秒で、ランダムなコードが実行されます。

詳細については、 Int 21 / AH=31hを参照してください。

また、パラメータはkeep、メモリをあまり消費しないように、いくつかのアドレスを操作して計算する必要があることに注意してください。一方、必要な処理ourを実行する関数のコードを格納するのに十分なメモリを使用してください。値10000は単なる例です。

于 2012-10-10T19:29:45.717 に答える
2

TSRで同様の質問に投稿した回答を読むと、このコードを部分的に理解できます。

文字の大文字小文字を変更するTSRの書き方

ここで最も重要なことは

遠方ポインタ: 16ビットDOSはセグメントオフセットアドレス指定スキームを使用していたため、通常の近方ポインタは、割り当てられたセグメントの64Kを超えるメモリにアクセスできませんでした。あなたはそれを理解するために詳細を読む必要があります。

ビデオメモリアドレス:このB8000000は、farポインタが必要なアドレスです。このアドレスの特別な点は、この場所から始まるバイト(画面の解像度* 2に等しい)がビデオメモリに直接コピーされることです。

したがって、間接参照後にポインタアドレスに文字を割り当てると、画面に出力されます

何かのようなもの

char * far p = 0xB8000000;

*p = 'a'; // this would actually print a on screen at left top

画面の残りの部分に移動するには、前方にループします。

これについて多くの参考文献を持っていたyashwantkanetkarによるac本がありました。私は何年も前に学部でそれを使用したことを覚えています。

それらの残りは、dos.hでAPIのインデックスを作成しているだけです。わからない場合は、説明を読んでここに戻ってみませんか?

于 2012-10-10T18:59:03.083 に答える