まず、いくつかの背景。DOS は、システム コールに割り込み 21h を使用します。AH は、INT 21h が提供するさまざまな機能を逆多重化するために使用されます。プログラムが実行されると、DOS はプロセスに関する情報を含む PSP (プログラム セグメント プレフィックス) として知られる 256 バイトをその前に置きます。
DOS の元の終了関数はINT 21/AH=00
. 現在、どうやら DOS 開発者は、プログラムから戻ることがプログラムを終了する方法であるべきだと判断したようです (これは CP/M から来たのですか?)。RET
(near) スタックから単語をポップし、それにジャンプします。したがって、プログラムが作成されると、そのスタックは word で始まります0000
。PSPの始まりです。そのため、PSP の開始時に、プログラムを終了するコードがあります。そのコードを小さく保つために、INT 20h
は へのエイリアスとして機能しMOV AH,00h ; INT 21h
ます。
[編集: これは下のスクリーンショットで見ることができます。]
DOS 2.0 は、リターン コードを含め、Unix から多くのものを取り入れました。そこで、INT 21h/AH=4ch
リターンコードをOSに返す新しいINT 21h関数が登場しました。この関数は、複数のセグメントを持つことができる EXE ファイル (AFAIR も DOS 2.0 の新機能) で動作するようにも設計されています。以前の終了関数 (INT 20h および INT 21h/00) は、CS が COM プログラムでのプログラム起動時と同じである、つまり、プログラムの 256 バイト前の PSP を指していると想定しています。
[編集:
歴史的なメモ: CP/M では、プログラムを終了する方法が 3 つあります。
- BDOS 機能 0 の呼び出し (INT 21 AH=00h、DOS 機能 0 に相当)
- 0000h の WBOOTF ロケーションにジャンプ (PSP オフセット 000h に相当)
- 戻る
WBOOTF の場所は 3 バイトで構成されていました。1 バイトはジャンプ用、2 バイトはジャンプ先 (BDOS の WBOOT 機能) です。
CP/M の初期のバージョンでは、BDOS 関数 0 を呼び出すか、WBOOT にジャンプすると、CP/M の一部がディスクから再ロードされ (ウォーム ブート)、続いて一部の OS 初期化が実行されました。一方、RETurning は CCP (コンソール コマンド プロセッサ、COMMAND.COM に相当) に直接戻り、次のコマンド ラインを要求します。AFAIU、CP/M 3 は通常 ROM にロードされ、WBOOT の場所に戻るため、ROM から OS の一部が再ロードされます。