第6章
コンピュータの基礎入門
導入
場合によっては、データを回復しようとしているときや、データおよびディスクのトラブルシューティング タスク (またはその他のシステム関連タスク) を実行しているときに、DEBUG DOC コマンドを使用すると非常に便利です。
また、特殊なケースでは、プログラミングではなく DEBUG を使用してこの特定のタスクを実行する方が簡単な場合もあります。例を見てみましょう。 DBR バックアップを作成するには、次のデバッグ コーディングで十分です。次の行を入力するだけです。
BKDBR.BIN のデバッグ
100 2 0 1
RSH
200
で
で
ここで、上記の数行を入力するだけで、プログラムを記述する必要がなくなることがわかります。 DBRバックアップをディスクにロードする別のコード例を見てみましょう。
常に覚えておいてください!十分な知識がないままこれを実行しないでください。自分が何をしようとしているのか確信を持ちましょう。以下の手順を不注意に使用すると、重大なデータ損失につながる可能性があります。また、手順を誤って使用すると、ディスク上のすべての情報にアクセスできなくなる可能性があります。
BKDBR.BIN のデバッグ
100 2 0 1で
で
この例のコードを見ると、最も必要なときにそれがどれだけ役立つかが簡単に推測できます。さらに、あらゆる状況でプログラミングすることは不可能です。ただし、単純な問題の場合、ビルド手順を使用するには、debug.exe/debug.com をブート ディスクにコピーして、コードの記述を開始するだけです。
この章および本書で説明する機能と例は、Intel x86 プロセッサ ファミリ アーキテクチャとのみ互換性があります。
まず、次のセクションでさまざまな段階での機能と例を説明するときに使用する用語を理解できるように、コンピューター アーキテクチャの基礎について少し知っておく必要があります。コンピュータアーキテクチャの基礎を学びましょう。
基本概念
CPU
この部分は中央処理装置または CPU とも呼ばれ、制御ユニットと算術論理ユニットで構成されています。その機能には、メモリセルの内容の読み取りと書き込み、メモリセルと特殊レジスタ間のデータ転送、プログラム命令のデコードと実行などがあります。プロセッサには、非常に頻繁に使用される多数のメモリ セルがあり、CPU の一部となっています。
これらのセルはレジスタと呼ばれます。プロセッサには、このようなレジスタが 1 ダースから 2 ダースある場合があります。 CPU の算術論理ユニットは、数値計算と記号計算に関連する操作を実装します。
通常、これらのデバイスは、2 つの整数の加算と減算、整数の乗算と除算、レジスタ ビットの操作、2 つのレジスタの内容の比較など、非常に基本的な操作のみを実行する機能を備えています。パーソナル コンピュータは、プロセッサが一度に処理できるビット数であるワード サイズによって分類できます。
中央メモリ
プログラムの実行や操作情報の保存などの一般的な処理に使用される半導体を使用して作成されたセルのグループです。これらの各セルには数値を含めることができ、方向性があるという特性があります。各セルに固有の番号またはアドレスを使用することで、セル同士を区別することができます。これらのストレージ デバイスの一般的な名前は、ランダム アクセス メモリ、または RAM です。
このタイプのメモリの主な欠点は、電源が遮断されると集積回路に保存された情報が失われることです。これにより、システムの電源をオフにしても情報が失われないメモリが作成されました。このメモリは読み取り専用メモリまたは ROM と呼ばれます。
コンピュータが情報を処理するには、その情報をレジスタと呼ばれる特殊なセルに保存する必要があります。レジスタは 8 個または 16 個のフリップフロップのグループです。
フリップフロップは、通常0.5ボルトの低電圧と、一般的に5ボルトの電圧の2つのレベルを記憶できるデバイスです。フリップフロップの低レベルのエネルギーはオフまたは0として解釈され、高レベルはオンまたは
- これらの状態は通常ビットと呼ばれ、コンピューター内の最小の情報単位です。
16 ビットのグループはワードと呼ばれ、ワードはバイトと呼ばれる 8 ビットのグループに分割され、4 ビットのグループはニブルと呼ばれます。
CPUレジスタ
CPU には 4 つの内部レジスタがあり、それぞれ 16 ビットです。最初の 4 つ、AX、BX、CX、DX は汎用レジスタで、8 ビット レジスタとしても使用できます。そのように使用する場合は、たとえば AH と AL のように参照する必要があります。これらは AX レジスタの上位バイトと下位バイトです。この命名法は、BX、CX、DX レジスタにも適用されます。
特定の名前で知られるレジスタ:
登録する |
特定の名前 |
斧 |
アキュムレータ |
ベックス |
ベースレジスタ |
CX |
計数レジスター |
DX |
データレジスタ |
DS |
データセグメントレジスタ |
は |
追加セグメントレジスタ |
SS |
バッテリーセグメントレジスタ |
CS |
コードセグメントレジスタ |
BP |
ベースポインタレジスタ |
そして |
ソースインデックスレジスタ |
から |
宛先インデックスレジスタ |
スペース |
バッテリーポインタレジスタ |
IP |
次命令ポインタレジスタ |
ふ |
フラグレジスタ |
ただし、次の章では C による割り込みプログラミングでこれらのレジスタを詳細に使用しますが、ここでアセンブリ言語の基礎を学習しておくと、ディスク操作などのプログラミング全体に役立ちます。
デバッグ プログラムを使用して、CPU の内部レジスタの値を視覚化することができます。デバッグの操作を開始するには、コンピューターに次のプロンプトを入力します。
C:/>デバッグ <Enter>
次の行にダッシュが表示されます。これはデバッグのインジケーターです。この時点で、次のコマンドを使用してデバッグの指示を導入できます。
- r <Enter>
CPU の内部レジスタの内容がすべて表示されます。それらを表示する別の方法は、値を表示したいレジスタの名前をパラメータとして指定して「r」コマンドを使用することです。例:
-rbx <Enter>
この命令は BX レジスタの内容のみを表示し、デバッグ インジケータは「-」から「:」に変わります。
このようなプロンプトが表示された場合、新しい値を入力して <Enter> を押すことで、表示されたレジスタの値を変更することができます。また、他の値を入力せずに Enter を押すことで、古い値を残すこともできます。
フラグ レジスタの値を変更し、後で説明するように、プログラム内の制御構造として使用することができます。レジスタの各ビットには特別な名前と意味があり、次のリストは各ビットの値、オンまたはオフ、およびプロセッサの動作との関係を示しています。
オーバーフロー
NV = オーバーフローはありません
OV = オーバーフローあり
方向
UP = 前進
DN = 後方
割り込み
DI = 非アクティブ
EI = アクティブ
サイン
PL = ポジティブ
NG = 否定的
ゼロ
NZ = ゼロではない
ZR = ゼロです
補助運搬
NA = 補助キャリーはありません
AC = 補助キャリーあり
パリティ
PO = 不均等出産
PE = 偶数パリティ
運ぶ
NC = キャリーなし
CY = 繰り上がりあり
アセンブラ構造
アセンブリ言語のコード行には 2 つの部分があり、最初の部分は実行される命令の名前で、2 番目の部分はコマンドのパラメータです。例:
ああ、bhを追加
ここで、「ADD」は実行されるコマンドです。この場合は追加であり、「ah」と「bh」はパラメータです。
言語の命令名は、2、3、または 4 文字で構成されます。これらの命令は、プロセッサが実行する機能を表すため、ニーモニック名または操作コードとも呼ばれます。操作にパラメータを必要としないコマンドもあれば、パラメータを 1 つだけ必要とするコマンドもあります。
指示は次のように使用される場合があります。
ADD al,[170]
2 番目のパラメータの括弧は、170 の値ではなく、メモリ セル番号 170 の内容を処理することを示しています。これは直接方向と呼ばれます。
これで、デバッグの助けを借りて最初のプログラムをコーディングする準備が整いました。これまで見てきたことを説明するプログラムを作成し、プログラムに直接導入する 2 つの値を追加します。
最初のステップはデバッグを開始することです。このステップは、オペレーティング システム プロンプトで debug <Enter> と入力するだけです。
デバッグでプログラムをアセンブルするには、「a」(アセンブル) コマンドを使用します。このコマンドを使用する場合、アセンブルを開始するアドレスをパラメータとして指定できます。パラメータを省略すると、CS:IP で指定された場所 (通常は 0100h) でアセンブルが開始されます。これは、.COM 拡張子を持つプログラムを開始する必要がある場所です。この特定の種類のプログラムを作成できるのはデバッグだけなので、ここを使用します。
現時点では「a」コマンドにパラメータを指定する必要はありませんが、CS:IP レジスタが使用されるときに問題を回避するためにパラメータを指定することをお勧めします。そのため、次のように入力します。
-a0100 <Enter>
これが完了すると、画面に次のようなものが表示されます: 0C1B:0100 カーソルはこれらの数字の右側に配置されます。16 進数の最初の 4 桁は異なっていてもかまいませんが、最後の 4 桁は 0100 である必要があります。これは、開始として指定したアドレスであるためです。これで、手順を導入できます:
0C1B:0100 mov ax,0002; 0002の値をaxレジスタに格納します
0C1B:0103 mov bx,0004; 0004の値をbxレジスタに格納します
0C1B:0106 ax,bxを追加します。bxの内容がaxの内容に追加されます。
0C1B:0108 int 20; プログラムの終了を引き起こします。
0C1B:010A
「;」の後のコメントを書く必要はありません。最後のコマンド (int 20) を入力したら、それ以上何も書かずに <Enter> を押すと、デバッガー プロンプトが再び表示されます。
最後に記述された行は、厳密にはアセンブラ命令ではなく、オペレーティング システム割り込みの呼び出しです。これらの割り込みにより、多くの行が節約され、オペレーティング システム機能にアクセスするのに非常に役立ちます。
作成したプログラムを実行するには、「g」コマンドを使用します。使用すると、次のようなメッセージが表示されます。
「プログラムは正常に終了しました」。当然、このようなメッセージではプログラムが追加を実行したかどうかはわかりませんが、それを確認する簡単な方法があります。デバッグの「r」コマンドを使用して、プロセッサのすべてのレジスタの内容を確認するには、次のように入力します。
-r <Enter>
各レジスタとその実際の値は次のように画面に表示されます。
AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1B ES=0C1B SS=0C1B CS=0C1B IP=010A NV UP EI PL NZ NA PO NC
0C1B:010A DBの
レジスタに異なる値が含まれている可能性はありますが、AX と BX は先ほど変更した値であるため、同じである必要があります。
プログラムの実行中に値を確認する別の方法は、実行を終了したいアドレスを使用し、レジスタの値を「g」のパラメータとして表示することです。この場合、g108 になります。この命令はプログラムを実行し、108 アドレスで停止し、レジスタの内容を表示します。
レジスタ内で何が起こっているかを追跡するには、「t」コマンド (トレース) を使用します。このコマンドの機能は、アセンブルされたものを行ごとに実行し、そのたびにレジスタの内容を表示することです。
デバッグを終了するには、「q」(終了) コマンドを使用します。
アセンブラの利点
アセンブラを使用する最初の理由は、PC の動作をより深く理解する機会が得られ、より一貫した方法でソフトウェアを開発できるようになることです。
2 つ目の理由は、アセンブラを使用することでコンピューターを完全に制御できることです。もう 1 つの理由は、アセンブリ ベースのプログラムは他の言語で作成されたプログラムよりも高速で、場合によってはサイズが小さく、容量が大きいことです。
約束は守らせてください!!
この章の前半では、DBR のバックアップを作成し、必要に応じて DBR のバックアップを元の場所にロードするための命令を例として使用しました。まず、バックアップを作成するための命令を調べます。
C:\>DEBUG A:\BKDBR.BIN <Enter>
ファイルが見つかりません
- L 100 2 0 1 <入力>
- R CX <Enter>
CX 0000
: 200 <入力>
- W <入力>
00200バイトを書き込み中
- Q <入力>
この例では、最初の行から勉強してみましょう。コマンド DEBUG A:\BKDBR.BIN は、A: フロッピー ドライブに BKDBR.BIN という名前のファイルが存在しない場合は作成してデバッグ コマンドを初期化します。そのため、開始時に「ファイルが見つかりません」というメッセージが表示されます。
2 番目の命令 L 100 2 0 1 では、L (ロード) コマンドは、指示されたドライブの DBR をロードします。その方法を学びましょう。この命令では、数字 100 は DBR が格納されるバッファーのアドレスであり、次の数字 2 はドライブ C(C :) に使用されます。ドライブ番号は次のように指定されます。
ドライブ文字 |
使用数 |
答え: |
0 |
バ: |
1 |
C: |
2 |
デ: |
3 |
。 |
。 |
。 |
。 |
等々 |
。 |
次の数字 0 は、読み取るセクター数の開始セクター番号です。ここでは、最初のセクター、つまり DBR セクターを読み取るために 0 を使用しています。次の数字 1 は、読み取るセクターの数を通知するために使用されます。
ここでは 1 つのセクターのみを読み取りたいため、1 を指定しました。ただし、他のさまざまな操作では、必要に応じて開始セクターと終了セクターの番号と位置を使用できます。したがって、ドライブ C: の 1 番目のセクターからメモリ位置 100 までの 1 つのセクターがロードされます。
R CX 命令は、BKDBR.BIN ファイルに書き込むデータの長さを変更または定義するために使用されます。この命令は、CX レジスタの現在の値を表示し、変更できるようにします。DEBUG コマンドは 16 進数システムを使用し、16 進数の DBR のサイズは 200(h) バイト、つまり 10 進数システムでは 512 バイトであるため、ここで 200 と入力しました。
W コマンドは、DEBUG に、位置 100 から 200(h) バイトを BKDBR.BIN ファイルに書き込むように指示します。最後に、命令 Q を使用して DEBUG を終了し、DOS プロンプトに戻ります。
警告!!! 警告!!! 警告!!!
ディスクの DBR を復元する手順で、何をどのように行うかをよく理解しておくことを強くお勧めします。誤って不正なディスクまたは他のディスクの DBR を保存した場合、ほとんどの場合、ディスクの完全なデータにアクセスできなくなる可能性があります。
コーディングの最初の命令を入力すると、次のようになります。
DEBUG A:\BKDBR.BIN <Enter>
ファイルは、DEBUG プログラムを起動する指定の場所にある必要があります。DEBUG プロンプトの前に「ファイルが見つかりません」というエラー メッセージが表示された場合は、Q (終了) コマンドを使用してプロセスを直ちに停止してください。これは、BKDBR.BIN ファイルが DEBUG プログラムによって見つからないか開けなかったことを意味し、このプロセスを続行すると、DBR にジャンク情報が書き込まれ、パーティション全体にアクセスできなくなります。 |
ここで、作成した BKDBR.BIN というバックアップ ファイルから DBR を復元するための手順のコーディングで何を行ったかを見てみましょう。バックアップを復元するための DEBUG コマンドは次のとおりです。
C:\> DEBUG A:\BKDBR.BIN <Enter>
- W 100 2 0 1 <入力>
- Q <入力>
|
この命令は、フロッピー ドライブ (a:) のメモリ位置 100 にある BKDBR.BIN ファイルから 1 セクターの情報を、2 番目のドライブ (ドライブ C:) の最初のセクター (セクター 0) に書き込みます。
プログラムの保存と読み込み
必要になるたびにプログラム全体を入力するのは現実的ではないと思われますが、これを避けるためにプログラムをディスクに保存することが可能です。これには、すでにアセンブルされているため、実行するために再度デバッグを実行する必要がないという大きな利点があります。
すでにメモリに保存されているプログラムを保存する手順は次のとおりです。
- 最終アドレスから初期アドレスを減算してプログラムの長さを取得します。当然、16 進数で計算されます。
- プログラムに名前と拡張子を付けます。
- プログラムの長さを CX レジスタに格納します。
- デバッグにプログラムをディスクに書き込むように命令します。
次のプログラムを例にすると、これらの手順を実行する方法がより明確になります。最終的にプログラムが組み立てられると、次のようになります。
0C1B:0100 移動斧、0002
0C1B:0103 移動 bx,0004
0C1B:0106 斧、bxを追加
0C1B:0108 あなたは20歳です
0C1B:010A
-h 10a 100
020a 000a
-n テスト.com
-rcx
CX0000
:000a
-で
000Aバイトの書き込み
プログラムの長さを取得するには、「h」コマンドを使用します。このコマンドは、2 つの数値の加算と減算を 16 進数で表示します。プログラムの長さを取得するには、プログラムの最終アドレス (10A) とプログラムの初期アドレス (100) の値をパラメータとして指定します。コマンドが示す最初の結果はパラメータの加算であり、2 番目の結果は減算です。
「n」コマンドを使用すると、プログラムに名前を付けることができます。「rcx」コマンドを使用すると、CX レジスタの内容を、「h」でファイルのサイズから取得した値 (この場合は、最終アドレスから初期アドレスを減算した結果である 000a) に変更できます。
最後に、「w」コマンドはプログラムをディスクに書き込み、書き込んだバイト数を示します。また、すでに読み込まれたファイルを保存するには、次の 2 つの手順が必要です。
- ロードするファイルの名前を指定します。
- 「l」(ロード)コマンドを使用してロードします。
次の手順で正しい結果を得るには、上記のプログラムがすでに作成されている必要があります。
Debug 内では次のように記述します。
-n テスト.com
-l
-100 109インチ
0C3D:0100 B80200 移動AX,0002
0C3D:0103 BB0400 移動 BX,0004
0C3D:0106 01D8 AX、BXを追加
0C3D:0108 CD20 INT20
最後の「u」コマンドは、プログラムがメモリにロードされたことを確認するために使用されます。このコマンドは、コードを逆アセンブルし、逆アセンブルされたコードを表示します。パラメータは、DEBUG に、どこからどこまでを逆アセンブルするかを示します。DEBUG は、特に指定がない限り、常にアドレス 100H のメモリにプログラムをロードします。
セグメント
x86 プロセッサのアーキテクチャでは、情報を管理するためにメモリ セグメントの使用が強制され、これらのセグメントのサイズは 64kb です。
これらのセグメントが存在する理由は、プロセッサが処理できる数値の最大サイズは 16 ビットのワードまたはレジスタによって指定されるため、これらのレジスタの 1 つだけを使用して 65536 を超えるメモリ領域にアクセスすることはできないためです。ただし、メモリを 65536 の領域ごとにグループまたはセグメントに分割し、専用レジスタのアドレスを使用して各セグメントを見つけ、2 つのレジスタを使用して特定のスロットの各アドレスを作成すると、4294967296 バイトのメモリにアクセスできるようになります。
アセンブラがデータを管理できるようにするには、各情報または命令がそれぞれのセグメントに対応する領域にある必要があります。アセンブラは、DS、ES、SS、CS レジスタによって指定されたセグメントのローカリゼーションと、レジスタ内の指定された情報のアドレスを考慮して、この情報にアクセスします。このため、アセンブルする各行でデバッグを使用してプログラムを作成すると、次のようなものが表示されます。
1CB0:0102 移動 AX、BX
最初の数字 1CB0 は使用されているメモリ セグメントに対応し、2 番目の数字はこのセグメント内のアドレスを参照し、そのアドレスから格納される命令が続きます。
アセンブラは、各アセンブルされた命令に必要なバイト数を基準としてセグメントのサイズを調整します。セグメント全体を使用するとメモリが無駄になるからです。たとえば、プログラムがデータの保存に 10kb しか必要としない場合、データ セグメントは 10kb のみになり、処理可能な 64kb にはなりません。
データの移動
あなたの知識と便宜のために、データ操作のためのアセンブリ言語命令をいくつかここにリストします。割り込みやその他の BIOS 操作を利用してプログラミングを行うときには、その基礎が必要になります。
アセンブリ言語の詳細な紹介と徹底的な学習は、この本の限界を超えています。アセンブリの基礎知識は、さらに重要なプログラミングの章に進むために必要ですが、すべての命令を理解するのが難しいと感じた場合は心配する必要はありませんが、命令の基本的な考え方を習得することをお勧めします。
どのプログラムでも、メモリ内および CPU レジスタ内のデータを移動する必要がありますが、これを行うにはいくつかの方法があります。メモリ内のデータをレジスタにコピーしたり、レジスタからレジスタにコピーしたり、レジスタからスタックにコピーしたり、スタックからレジスタにコピーしたり、データを外部デバイスに送信したり、その逆を行ったりすることができます。
このデータの移動には規則と制限が適用されます。その一部を以下に示します。
- あるメモリ位置から別のメモリ位置へデータを直接移動することはできません。まずソース位置のデータをレジスタに移動し、次にレジスタから宛先位置へ移動する必要があります。
- 定数をセグメント レジスタに直接移動することはできません。まず、定数を CPU 内のレジスタに移動する必要があります。
- MOVS 命令を使用してデータ ブロックを移動できます。MOVS 命令は、バイトまたはワードのチェーンをコピーします。MOCSB は n バイトをある場所から別の場所にコピーし、MOVSW は n ワードをある場所から別の場所にコピーします。最後の 2 つの命令は、DS:SI によって定義されたアドレスから値を移動対象のデータ グループとして取得し、ES:DI によってデータの新しいローカリゼーションとして取得します。
データを移動するために、バッテリーと呼ばれる構造もあります。バッテリーでは、データは push 命令で導入され、pop 命令で抽出されます。スタックでは、最初に導入されるデータは最後に取得できるデータです。これは、プログラムで次の命令を使用する場合に当てはまります。
プッシュアックス
プッシュBX
プッシュCX
スタックから値を取得した時点で各レジスタに正しい値を返すには、次の順序で実行する必要があります。
ポップCX
ポップBX
ポップアックス
外部デバイスとの通信では、out コマンドを使用してポートに情報を送信し、in コマンドを使用してポートから受信した情報を読み取ります。
OUT コマンドの構文は次のとおりです。
DX、AX 出力
ここで、DX には通信に使用されるポートの値が含まれ、AX には送信される情報が含まれます。
IN コマンドの構文は次のとおりです。
AX、DXで
ここで、AX は着信情報が保存されるレジスタであり、DX には情報が到着するポートのアドレスが含まれます。
MOV命令
メモリセル、レジスタ、アキュムレータ間のデータ転送に使用されます。構文は次のとおりです。
MOV 宛先、ソース
この命令で許可されるデータのさまざまな移動は、次の表に示されています。
S.いいえ。 |
行き先 |
ソース |
1. |
メモリ |
アキュムレータ |
2. |
アキュムレータ |
メモリ |
3. |
セグメントレジスタ |
メモリ/レジスタ |
4 |
メモリ/レジスタ |
セグメントレジスタ |
5. |
登録する |
登録する |
6. |
登録する |
メモリ |
7. |
メモリ |
登録する |
8. |
登録する |
即時データ |
9. |
メモリ |
即時データ |
例を見てみましょう:
ムーヴAX,0006
移動 BX、AX
MOV AX、4C00
INT 21
このプログラムは、0006H の値を AX レジスタに移動し、次に AX (0006h) の内容を BX レジスタに移動し、最後に 4C00h の値を AX レジスタに移動して、21h 割り込みの 4C オプションで実行を終了します。割り込み 13H と割り込み 21H については、後で簡単に説明します。
中断
割り込みは、CPU の実行を一時停止し、その状態を保存し、特定の場所に転送するハードウェア機能です。転送場所は、割り込みに応答してアクションを実行するプログラムのアドレスを指定します。割り込みの結果として実行されるプログラムは、割り込み処理プログラムと呼ばれます。
たとえば、 DOS が BIOS に何らかの情報を送信したい場合、または BIOS がコンピュータ システムに何らかの情報を送信したい場合、DOS または BIOS は割り込みを生成します。割り込みが生成されると、コンピュータは実行中の処理を一時停止し、まず割り込みを生成した操作を処理します。
割り込みを生成できる各デバイスには、どのデバイスがこれらの割り込みを生成しているかを識別するための一意の割り込み番号が与えられます。この本では、割り込み 13H、割り込み 13H の拡張、および割り込み 21H のすべての機能とサブ機能について説明します。
基本的に、中断には次の 3 つの種類があります。
- 内部ハードウェアの中断
- 外部ハードウェアの中断
- ソフトウェアの中断
内部ハードウェアの中断
内部割り込みは、プログラムの実行中に発生する特定のイベントによって生成されます。このタイプの割り込みは、ハードウェアによって全体的に管理され、変更することはできません。
このタイプの割り込みのわかりやすい例は、コンピュータの内部クロックのカウンターを実現する割り込みです。ハードウェアは、時間を最新に保つために、1 秒間にこの割り込みを複数回呼び出します。
ソフトウェアによって時間の更新を制御することはできないため、この中断を直接管理することはできませんが、コンピューターへの影響を有利に利用することは可能です。
たとえば、継続的に更新される仮想クロックを作成するには、カウンターの実際の値を読み取り、それをユーザーが理解できる形式に変換するプログラムを作成するだけです。
外部ハードウェアの中断
外部割り込みは、キーボード、プリンター、通信カードなどの周辺機器によって生成されます。また、コプロセッサによっても生成されます。外部割り込みを非アクティブ化することはできません。
これらの割り込みはCPUに直接送られるのではなく、このタイプの割り込みを排他的に処理する機能を持つ集積回路に送られます。
ソフトウェアの中断
ソフトウェア割り込みは、アセンブラが INT 命令を使用して必要な割り込み番号を呼び出すことによって直接アクティブ化できます。
割り込みを使用するとプログラムの作成が容易になり、割り込みを使用することでプログラムが短くなります。割り込みは理解しやすく、サイズが小さいためパフォーマンスも向上します。このタイプの割り込みは、オペレーティング システム DOS 割り込みと BIOS 割り込みの 2 つのカテゴリに分けられます。
2 つの違いは、オペレーティング システム割り込みの方が使いやすいものの、目的を達成するために BIOS を使用するため速度が遅くなることです。一方、BIOS 割り込みははるかに高速ですが、ハードウェアの一部であるため非常に特殊であり、回路の製造元ブランドによっても異なる可能性があるという欠点があります。
使用する中断の種類の選択は、プログラムに与えたい特性によってのみ決まります。
C 言語の割り込み処理を介して C 言語の助けを借りてデータ回復プログラミングに割り込みを使用するので、割り込み 13H、割り込み 13H 拡張、および割り込み 21Hルーチンについてのみ特別に説明します。C言語では、それらのタスクのほとんどを実行するためのより簡単な関数が用意されているため、他のすべての割り込みとその機能について説明することはそれほど重要ではありません。ただし、データ回復プログラミングには、割り込み 13H とその拡張の知識が必須です。 |
割り込み20Hと割り込み21Hについて簡単に説明します。括弧で囲まれた値(0x20など)は、どのように使用するかを示しています。
INT 20H ( 0x20) --> プロセスを終了する
呼び出し: CS = プログラムセグメントプレフィックスのセグメントアドレス
戻り値: なし
コメント:
現在のプロセスを終了します。これは、プログラムが最終終了を実行するために使用できるいくつかの方法の 1 つです。また、INT 21H の関数 (00H または 31H または 4CH) または単に INT 27H を使用して最終終了を実行することもできます。この場合、戻りコードを親プロセスに渡すことができるため、INT 21H の関数 31H および 4CH が一般的に推奨されます。
ファイル制御ブロック (FCB) を使用してファイルを書き込んだ場合は、最初にファイルを閉じることをお勧めします。そうしないと、最終終了のアクションでプロセスによって使用されたすべてのメモリが解放され、ファイル バッファーがフラッシュされ、プロセスが所有するファイルまたはデバイスの開いているハンドルがすべて閉じられるため、データが失われる可能性があります。
したがって、ファイルのハンドルを開いている場合は、データが失われる可能性があります。
INT21H (0x21)
関数 00H (0x00) --> プロセスを終了する
呼び出し: AH = 00H
CS = プログラムセグメントプレフィックスのセグメントアドレス
戻り値: なし
コメント:
この割り込みは現在のプロセスを終了します。これは、プログラムが最終終了を実行するために使用できるいくつかの方法の 1 つです。詳細については、INT 20H を参照してください。
INT21H (0x21)
機能 01H (0x01) --> エコー付き文字入力
コール: AH = 01H
戻り値: AL = 8ビット入力データ
コメント:
この割り込みは、キーボードなどの標準入力デバイスから文字を読み取り、それを標準出力デバイスにエコーします。文字の準備ができていない場合は、文字が使用可能になるまで待機します。
INT21H (0x21)
機能 02H (0x02) --> 文字出力
コール: AH = 02H
DL = 出力用8ビットデータ
戻り値: なし
コメント:
標準出力デバイスに文字を出力します。出力はリダイレクトできます。出力がリダイレクトされると、ディスクがいっぱいになったことを検出する方法はありません。
出力がリダイレクトされていない場合、または論理デバイス CON からハンドルを取得した場合は、標準出力 (0001H) の定義済みハンドルを使用して書き込み (INT 21H、Function 40H) を実行することによって、文字列をディスプレイに送信することもできます。
INT21H (0x21)
機能 03H (0x03) --> 補助入力
通話内容: AH = 03H
戻り値: AL = 8ビット入力データ
コメント:
標準補助デバイスから文字を読み取ります。デフォルトは最初のシリアル ポート (COM1) です。
補助デバイスがプログラムで処理できる速度よりも速くデータを送信すると、文字が失われる可能性があります。ユーザー プログラムがこの関数呼び出しを通じて補助デバイスの状態を読み取ったり、失われた文字などの I/O エラーを検出したりすることはできません。
INT21H (0x21)
機能 04H (0x04) --> 補助出力
通話: AH = 04H
DL = 出力用8ビットデータ
戻り値: なし
コメント:
INT 21H のこの関数は、標準補助デバイスに文字を出力します。デフォルトは最初のシリアル ポート (COM1) です。標準補助デバイスの定義済みハンドル (00034) を使用して書き込み (INT 21H 関数 40H) を実行するか、論理デバイス AUX を開いて取得したハンドルを使用して、文字列を補助デバイスに送信することもできます。
INT21H (0x21)
機能 05H (0x05) --> プリンタ出力
コール: AH = 05H
DL = 出力用8ビットデータ
戻り値: なし
コメント:
この関数は、標準リスト デバイスに文字を送信します。デフォルトのデバイスは、最初のパラレル ポート (LPT1) 上のプリンタです。標準プリンタ デバイス (0004H) の定義済みハンドルを使用して書き込み (INT 21H Function 40H) を実行するか、論理デバイス PRN または LPT1 を開いて取得したハンドルを使用して、文字列をプリンタに送信することもできます。
INT21H (0x21)
機能 06H (0x06) --> 直接コンソールI/O
コール: AH = 06H
DL = 要求された機能、
出力要求の場合、00H-FEH
入力要求の場合、0FFH
戻り値: なし、DL = 00H-0FEH で呼び出された場合
DL = FFHで呼び出され、文字が準備されている場合
ゼロフラグ = クリア
AL = 8ビット入力データ
DL = FFHで呼び出され、文字が準備されていない場合
ゼロフラグ = 設定
コメント:
標準入力デバイスから文字を読み取り、または標準出力デバイスに文字を書き込みます。I/O はリダイレクトされる可能性がありますが、I/O がリダイレクトされた場合、EOF またはディスクがいっぱいであることを検出する方法はありません。INT 21H のこの関数は、オペレーティング システムからの干渉を受けずに、すべての可能な文字と制御コードを読み書きする必要があるプログラムによって使用されます。
INT21H (0x21)
関数 07H (0x07) --> エコーなしのフィルタリングされていない文字入力
コール: AH = 07H
戻り値: AL = 8ビット入力データ
コメント:
この関数は、標準出力デバイスにエコーせずに、標準入力デバイスから文字を読み取ります。
INT21H (0x21)
機能 08H (0x08) --> エコーなしの文字入力
コール: AH = 08H
戻り値: AL = 8ビット入力データ
コメント:
この関数は、標準出力デバイスにエコーせずに、標準入力デバイスから文字を読み取ります。
INT21H (0x21)
関数 09H (0x09) --> 文字列を表示
コール: AH = 09H
DS:DX = セグメント: 文字列のオフセット
戻り値: なし
コメント:
文字列を標準出力デバイスに送信します。出力はリダイレクトされる場合があります。出力がリダイレクトされた場合、ディスクがいっぱいになったことを検出する方法はありません。標準出力の定義済みハンドル (0001H) を使用して書き込み (INT 21H Function 40H) を実行するか、リダイレクトされていない場合は論理デバイス CON を開いて取得したハンドルを使用して、文字列をディスプレイに送信することもできます。
INT21H (0x21)
関数 0AH (0x0A または 10) --> バッファリングされたキーボード入力
コール: AH = 0AH
DS:DX = セグメント: バッファのオフセット
戻り値: バッファにデータを配置し、何も返さない
コメント:
標準入力デバイスから ASCII キャリッジ リターン (0DH) までのバイト文字列を読み取り、ユーザーが指定したバッファに格納します。文字は標準出力デバイスにエコーされます。関数が使用するバッファの形式は次のとおりです。
バイト |
コンテンツ |
0 |
プログラムによって設定される、読み取る最大文字数 |
1 |
MS-DOS によって設定された、実際に読み取られる文字数 (改行を除く) |
2歳以上 |
キーボードまたは標準入力から読み取られた文字列。キャリッジリターン (0DH) で終了します。 |
INT21H (0x21)
関数 0BH (0x0B または 11) --> 入力ステータスを確認する
コール:AH = 0BH
戻り値: AL = 00H (文字がない場合)
FFH (少なくとも 1 つの文字が利用可能な場合)
コメント:
キーボードなどの標準入力デバイスから文字が使用可能かどうかを確認します。この関数は、IOCTL INT 21H 関数 44H サブ関数 06H と同等です。
INT21H (0x21)
関数0CH (0x0Cまたは12) --> 入力バッファをフラッシュしてから入力
コール: AH = 0CH
AL = リセット後に呼び出される入力の数
バッファ(01H、06H、07H、08H、または0AHである必要があります)
AL = 0AHの場合
DS: DX = セグメント: 入力バッファのオフセット
戻り値: AL = 01H、06H、07H、または08Hで呼び出された場合、
AL = 8ビット入力データ
AL=0AHで呼び出された場合、
なし(データはバッファに配置される)
コメント:
標準入力バッファをクリアし、文字入力関数の 1 つを呼び出します。入力はリダイレクトできます。AL 内の 01H、06H、07H、08H、または 0AH 以外の関数番号は、入力バッファをフラッシュし、呼び出しプログラムに制御を返します。
INT21H (0x21)
機能 0DH (0x0D または 13) -> ディスクリセット
コール: AH = 0DH
戻り値:なし
コメント:
この関数は、すべてのファイル バッファをフラッシュします。この関数は、まだ開いているファイルのディスク ディレクトリを更新しません。
INT21H (0x21)
機能 0EH (0x0E または 14) -> ディスクを選択
コール: AH = 0EH
DL = ドライブコード (0 = A、1 = B など)
戻り値: AL = システム内の論理ドライブの数
コメント:
指定されたドライブを現在のディスク ドライブまたはデフォルトのディスク ドライブとして選択し、システム内の論理ドライブの合計数を返します。
アプリケーションは、ドライブ文字を A ~ Z (0 = A、1 = B など) に制限する必要があります。論理ドライブとは、フロッピー ディスクやハード ディスク ドライブなどのブロック デバイスの合計数を意味します。通常、1 つの物理ハード ディスク ドライブは、2 つ以上の論理ドライブに分割されます。
INT21H (0x21)
関数 0FH (0x0F または 15) -> ファイルを開く
コール: AH = 0FH
S: DX = セグメント: ファイル制御ブロックのオフセット
戻り値: 関数が成功し、ファイルが見つかった場合
AL = 00H
MS-DOS によって入力された FCB は次のようになります。
ドライブフィールド(オフセット00H)=ドライブAの場合は1、ドライブBの場合は2、など。現在のブロックフィールド(オフセット0CH)=00H
レコードサイズフィールド(オフセット0EH)= 0080H
サイズフィールド(オフセット10H)=ディレクトリからのファイルサイズ
データフィールド(オフセット14H)=ディレクトリからの日付スタンプ
時間フィールド(オフセット16H)=ディレクトリからのタイムスタンプ
関数が失敗し、ファイルが見つからない場合
AL = 0FFH
コメント:
ファイルを開き、後続の読み取り/書き込み操作に使用できるようにします。プログラムが 128 バイト以外のレコード サイズを使用する場合は、ファイルが正常に開かれた後、他のディスク操作の前に、FCB オフセット 0EH のレコード サイズ フィールドを設定する必要があります。
INT21H (0x21)
関数 10H (0x10 または 16) -> ファイルを閉じる
コール:AH = 10H
DS: DX = セグメント: ファイル制御ブロックのオフセット
戻り値: 関数が成功した場合(ディレクトリの更新が成功した場合)
AL = 00H
関数が失敗した場合(ディレクトリ内にファイルが見つからない)
AL = FFH
コメント:
ファイルを閉じるために使用されます。ファイルを閉じ、ファイルに関連付けられているすべての MS-DOS 内部ディスク バッファをディスクにフラッシュし、ファイルが変更または拡張されている場合はディスク ディレクトリを更新します。
INT21H (0x21)
関数 11H (0x11 または 17) -> 最初のファイルを検索
コール:AH = 11H
DS: DX = セグメント: ファイル制御ブロックのオフセット
戻り値: 関数が成功し、一致するファイルが見つかった場合
AL = 00H
また、機能するために入力された FCB のタイプに応じて、現在のディスク転送領域 (DTA) アドレスのバッファーは、開かれていない通常の FCB または拡張 FCB として入力されます。
関数が失敗した場合(一致するファイル名が見つからない場合)
AL = FFH
コメント:
指定されたドライブの現在のディレクトリで一致するファイル名を検索します。ワイルドカード (? および *) を使用できます。この関数は、最初に一致するファイル名を返します。
INT21H (0x21)
機能 12H (0x12 または 18) -> 次のファイルを検索
コール:AH = 12H
DS: DX = セグメント: ファイル制御ブロックのオフセット
戻り値: 関数が成功し、一致するファイル名が見つかった場合
AL = 00H
そして、現在のディスク転送領域(DTA)アドレスのバッファは、INT21H機能11Hに最初に入力されたFCBのタイプに応じて、開かれていない通常のFCBまたは拡張FCBとして設定されます。
関数が失敗し、一致するファイル名が見つからない場合
AL = FFH
コメント:
これは前の関数の対です。INT 21H Function 11H が成功した場合、次に一致するファイル名があればそれを返します。この関数は、入力として使用される FCB が以前の INT 21H Function 11H の呼び出しと、その後の INT 21H Function 12H の呼び出しによって適切に初期化されており、検索対象のファイル名または拡張子に少なくとも 1 つのワイルドカード文字が含まれていることを前提としています。
INT21H (0x21)
機能 13H (0x13 または 19) -> ファイルを削除
コール:AH = 13H
DS: DX = セグメント: ファイル制御ブロックのオフセット
戻り値: 関数が成功し、ファイルが削除された場合
AL = 00H
関数が失敗し、一致するファイルが見つからなかったか、少なくとも1つの一致するファイルが読み取り専用だった場合、
AL = FFH
コメント:
デフォルトまたは指定されたディスク ドライブ上の現在のディレクトリから一致するすべてのファイルを削除します。ワイルドカード (? および *) を使用することもできます。
INT21H (0x21)
機能 14H (0x14 または 20) -> シーケンシャル読み取り
コール:AH = 14H
DS: DX = セグメント: 以前に開いたセグメントのオフセット
ファイル制御ブロック
戻り値: 読み取りが成功した場合、AL = 00H
ファイルの終わりの場合は01H
セグメントラップの場合は02H
03H レコードの最後に部分的なレコードが読み込まれた場合
ファイル
コメント:
この関数は、ファイルから次の連続データ ブロックを読み取り、ファイル ポインタを適切に増分します。読み取るデータのバイト数は、ファイル制御ブロック (FCB) のレコード サイズ フィールド (オフセット 0EH) によって指定されます。
レコードは、INT 21H Function 1AH への最新の呼び出しで指定された現在のディスク転送領域 (DTA) アドレスでメモリに読み込まれます。レコードのサイズとバッファの位置がセグメント オーバーフローまたはラップアラウンドが発生するような場合、関数は失敗し、戻りコード 02H が返されます。
INT21H (0x21)
機能 15H (0x15 または 21) --> シーケンシャル書き込み
コール:AH = 15H
DS: DX = セグメント: 以前に開かれたファイル制御ブロックのオフセット
戻り値: 書き込みが成功した場合、AL = 00H
01H、ディスクがファイルの場合
02H、セグメントラップの場合
コメント:
この関数は、次の連続データ ブロックをファイルに書き込み、ファイル ポインタを適切に増分します。書き込まれるデータのバイト数は、ファイル制御ブロック (FCB) のレコード サイズ フィールド (オフセット 0EH) によって指定されます。
INT21H (0x21)
機能 16H (0x16 または 22) --> ファイルの作成
コール:AH = 16H
DS: DX = セグメント: 開かれていないファイル制御ブロックのオフセット
戻り値: 関数が成功し、ファイルが作成または切り捨てられた場合
AL = 00H
FCB は MS-DOS によって次のように入力されます。
ドライブ フィールド (オフセット 00H) = ドライブ A の場合は 1、ドライブ B の場合は 2 など。
現在のブロックフィールド (オフセット0CH) = 00H
レコードサイズフィールド(オフセット0EH)= 0080H
サイズフィールド(オフセット10H)=ディレクトリからのファイルサイズ
日付フィールド(オフセット14H)=ディレクトリからの日付スタンプ
時間フィールド(オフセット16H = ディレクトリからのタイムスタンプ)
関数が失敗した場合(ディレクトリがいっぱい)
AL = FFH
コメント:
この関数は、現在のディレクトリに新しいディレクトリ エントリを作成するか、同じ名前を持つ既存のファイルを長さ 0 に切り捨てます。また、後続の読み取り/書き込み操作のためにファイルを開きます。指定された名前を持つ既存のファイルは長さ 0 に切り捨てられ、そのファイル内のすべてのデータが回復不能に失われるため、この関数は注意して使用する必要があります。
INT21H (0x21)
機能 17H (0x17 または 23) --> ファイルの名前を変更する
コール:AH = 17H
DS: DX = セグメント: 特殊ファイル制御ブロックのオフセット
戻り値: 関数が成功し、1つ以上のファイルの名前が変更された場合
AL = 00H
関数が失敗し、一致するファイルがない場合、または新しいファイル名が既存のファイルと一致した場合
AL = FFH
コメント:
この関数は、指定されたドライブのディスク上の現在のディレクトリにある一致するすべてのファイルの名前を変更します。
これにはワイルド カードも使用できます。特殊ファイル制御ブロックには、通常の位置 (バイト 0 から 0BH) にドライブ コード、ファイル名、拡張子があり、最初のファイル名の 6 バイト後 (オフセット 11H) から 2 番目のファイル名が始まります。
21時間
機能 18H (0x18 または 24) --> 予約済み
INT21H (0x21)
関数 19H (0x19 または 25) --> 現在のディスクを取得する
コール:AH = 19H
戻り値: AL = ドライブ コード (A ドライブの場合は 0、B ドライブの場合は 1 など)
コメント:
この関数は、現在のディスク ドライブまたはデフォルトのディスク ドライブのドライブ コードを返します。
INT21H (0x21)
関数 1AH (0x1A または 26) --> DTA アドレスの設定
コール:AH = 1AH
DS: DX = セグメント: ディスク転送領域のオフセット。
戻り値: なし
コメント:
この関数は、後続の FCB 関連関数呼び出しに使用されるディスク転送領域 (DTA) のアドレスを指定します。
INT21H (0x21)
関数 1BH (0x1B または 27) --> デフォルトのドライブデータを取得する
コール:AH = 1BH
戻り値: 関数が成功した場合
AL = クラスターあたりのセクター数
DS: DX = メディアIDバイトのセグメントオフセット
CX = 物理セクターのサイズ(バイト単位)
DX = デフォルトドライブのクラスター数
機能が失敗した場合(無効なドライブまたは重大なエラー)
AL = FFH
コメント:
この関数は、デフォルトのディスク ドライブに関する選択された情報と、ファイル割り当てテーブルからメディア識別バイトへのポインターを取得します。
メディア ID バイトには次の意味があります。
メディア記述子ID |
中くらい |
0F0H |
3.5 インチ フロッピー ディスク、両面、18 セクター (またはその他) |
0F8H |
固定ディスク |
0F9H |
5.25 インチ フロッピー ディスク、両面、15 セクター |
0F9H |
3.5 インチ フロッピー ディスク、両面、9 セクター |
0FCH |
5.25 インチ フロッピー ディスク、片面、9 セクター |
0FDH |
5.25 インチ フロッピー ディスク、両面、9 セクター |
0FDH |
8 インチ フロッピー ディスク、片面、単密度 |
0FEH |
5.25 インチ フロッピー ディスク、片面、8 セクター |
0FEH |
8 インチ フロッピー ディスク、片面、単密度 |
0FEH |
8 インチ フロッピー ディスク、両面、倍密度 |
0FFH |
5.25 インチ フロッピー ディスク、両面、8 セクター |
INT21H (0x21)
関数 1CH (0x1C または 28) --> ドライブデータを取得する
コール:AH = 1CH
DL = ドライブコード
戻り値: 関数が成功した場合
AL = クラスターあたりのセクター数
DS: BX = セグメント: メディアIDバイトのオフセット
CX = 物理セクターのサイズ(バイト単位)
DX = デフォルトまたは指定されたドライブのクラスター数
関数が失敗し、無効なドライブまたは重大なエラーが発生した場合
AL = FFH
コメント:
この関数は、指定されたディスク ドライブに関する割り当て情報と、ファイル割り当てテーブルからメディア識別バイトへのポインタを取得します。メディア ID 情報については、INT 21H、関数 1BH で指定されているメディア記述子 ID バイト テーブルを参照してください。
INT21H (0x21)
機能 1DH (0x1D または 29) --> 予約済み
INT21H (0x21)
関数 1EH (0x1E または 30) --> 予約済み
INT21H (0x21)
機能 1FH (0x1F または 31) --> 予約済み
INT21H (0x21)
機能 20H (0x20 または 32) --> 予約済み
INT21H (0x21)
機能 21H (0x21 または 33) --> ランダム読み取り
コール:AH = 21H
DS: DX = セグメント: 以前に開いたセグメントのオフセット
ファイル制御ブロック
戻り値: 読み取りが成功した場合、AL = 00H
ファイルの終わりの場合は01H
セグメントラップの場合は02H、読み取りはキャンセル
03H レコードの最後に部分的なレコードが読み込まれた場合
ファイル
コメント:
この関数は、ファイルから選択されたレコードをメモリに読み込みます。レコードは、INT 21H Function 1AH への最新の呼び出しで指定された現在のディスク転送領域アドレスでメモリに読み込まれます。
INT21H (0x21)
機能 22H (0x22 または 34) --> ランダム書き込み
コール:AH = 22H
DS: DX = セグメント: 以前に開いたセグメントのオフセット
ファイル制御ブロック
戻り値: 書き込みが成功した場合、AL = 00H
ディスクがいっぱいの場合は01H
02H セグメントラップの場合、書き込みはキャンセルされます
コメント:
この関数は、メモリからデータをファイル内の選択したレコードに書き込みます。
INT21H (0x21)
関数 23H (0x23 または 35) --> ファイルサイズを取得
コール:AH = 23H
DS: DX = セグメント: 開かれていないファイルのオフセット
制御ブロック
戻り値: 関数が成功し、一致するファイル名が見つかった場合
AL = 00H
FCB相対レコードフィールド(オフセット21H)は、ファイル内のレコード数に設定され、必要に応じて次の完全なレコードに切り上げられます。
関数が失敗し、一致するファイルが見つからない場合
AL = FFH
コメント:
この関数は、現在のディレクトリで一致するファイルを検索します。ファイルが見つかった場合は、レコード数で表したファイルのサイズで FCB を更新します。この関数にはデフォルトのレコード サイズがないため、この関数を呼び出す前に、FCB レコード サイズ フィールド (オフセット 0EH) に適切な値を設定する必要があります。
INT21H (0x21)
関数 24H (0x24 または 36) --> 相対レコード番号を設定する
通話:AH = 24H
DS: DX = セグメント: 以前に開いたセグメントのオフセット
ファイル制御ブロック
戻り値: AL は破棄されます (他のレジスタは影響を受けません)
FCB相対レコードフィールド(オフセット21H)が更新されました
コメント:
この関数は、ファイル制御ブロック (FCB) の相対レコード番号フィールドを、開かれた FCB に記録されている現在のファイル位置に対応するように設定します。
INT21H (0x21)
関数 25H (0x25 または 37) --> 割り込みベクトルの設定
コール:AH = 25H
AL = 割り込み番号
DS: DX = セグメント: 割り込み処理のオフセット
ルーティーン
戻り値: なし
コメント:
この関数は、CPU 割り込みベクトルを初期化して、割り込み処理ルーチンを指します。これは、動作の正常なアプリケーションによる割り込みベクトル テーブルの直接編集よりも優先して使用する必要があります。
INT21H (0x21)
機能 26H (0x26 または 38) --> 新しいプログラム セグメント プレフィックス (PSP) を作成します。
コール:AH = 26H
DX = セグメント: 新しいプログラムセグメント
プレフィックス (PSP)
戻り値: なし
コメント:
この関数は、現在実行中のプログラムのプログラム セグメント プレフィックス (PSP) を空きメモリ内の指定されたセグメント アドレスにコピーし、新しい PSP を更新して別のプログラムで使用できるようにします。
INT21H (0x21)
機能 27H (0x27 または 39) --> ランダムブロック読み取り
コール:AH = 27H
CX = 読み取るレコード数
DS: DX = セグメント: 以前に開いたセグメントのオフセット
ファイル制御ブロック
戻り値: 要求されたレコードがすべて読み取られた場合、AL = 00H
ファイルの終わりの場合は01H
セグメントラップの場合は02H
03H レコードの最後に部分的なレコードが読み込まれた場合
ファイル
CX = 実際に読み取られたレコード数
コメント:
この関数は、指定されたファイルの場所から始めて、ファイルから 1 つ以上の連続レコードをメモリに読み取ります。バッファのサイズと場所がセグメント オーバーフローまたはラップアラウンドが発生するような場合、関数は戻りコード 02H で失敗し、ファイルの末尾で部分的なレコードが読み取られた場合、レコードの残りの部分にゼロが埋め込まれます。
INT21H (0x21)
機能 28H (0x28 または 40) --> ランダムブロック書き込み
コール:AH = 28H
CX = 書き込むレコード数
DS: DX = セグメント: 以前に開いたセグメントのオフセット
ファイル制御ブロック
戻り値: 要求されたレコードがすべて書き込まれた場合は AL = 00H
ディスクがいっぱいの場合は01H
セグメントラップの場合は02H
CX = 実際に書き込まれたレコード数
コメント:
この関数は、指定されたファイルの場所から始まる 1 つ以上の連続レコードをメモリからファイルに書き込みます。バッファのサイズと場所がセグメント オーバーフローまたはラップアラウンドが発生するような場合、関数は戻りコード 02H で失敗します。
INT21H (0x21)
関数 29H (0x29 または 41) --> ファイル名を解析する
コール:AH = 29H
AL = 解析を制御するフラグ
ビット0 = 1、先頭の区切り文字が
スキャンオフ(無視)されました。
= 0、先頭の区切り文字は使用されない
スキャンオフ
ビット1 = 1、FCBのドライブIDバイトが
ドライブが変更された場合にのみ
解析される文字列で指定されます。
= 0、FCBのドライブIDバイトが
ドライブがない場合でも変更可能
解析された文字列に指定子が存在する場合、FCB ドライブ コード フィールドは 0 (デフォルト) に設定されます。
ビット2 = 1、FCBのファイル名フィールドが
ファイル名が変更された場合にのみ
解析される文字列で指定されます。
= 0、FCB のファイル名フィールドが関係なく変更される場合、解析された文字列にファイル名がない場合は、FCB ファイル名は ASCIIZ の空白に設定されます。
ビット3 = 1、FCBの拡張フィールドが
拡張機能が変更された場合のみ
解析される文字列で指定されます。
= 0、FCBの拡張フィールドが
拡張子がない場合は変更されません
解析された文字列に存在する場合、FCB
拡張子はASCIIZ空白に設定されます
DS: SI = セグメント: 文字列のオフセット
ES: DI = セグメント: ファイル制御ブロックのオフセット
戻り値: ワイルドカード文字がない場合、AL = 00H
解析された文字列の場合、01Hに遭遇しました
ワイルドカード文字FFHを含む、
ドライブ指定子が無効の場合
DS: SI = セグメント: 最初の文字のオフセット
ファイル名を解析した後
ES: DI = セグメント: フォーマットされたオフセット
開かれていないファイル制御ブロック
コメント:
この関数は、テキスト文字列をファイル制御ブロック (FCB) のさまざまなフィールドに解析します。
この関数は、文字 (: . ; , = + タブ スペース) を区切り文字と見なし、すべての制御文字と文字 (: . ; , = + タブ スペース < > | / “ [ ]) を終了文字と見なします。
INT21H (0x21)
関数 2AH (0x2A または 42) --> 曜日と日付を取得します
コール:AH = 2AH
戻り値: CX = 年 (1980 年から 2099 年)
DH = 月 (1 から 12)
DL = 日(1 から 31)
AL = 曜日(0 = 日曜日、
1=月曜日など)
コメント:
この関数は、システムの月日、曜日、月、年を取得します。
INT21H (0x21)
機能 2BH (0x2B または 43) --> 日付の設定
コール:AH = 2BH
CX = 年 (1980 年から 2099 年)
DH = 月 (1 から 12)
DL = 日(1 から 31)
戻り値: 日付が正常に設定された場合は AL = 00H
日付が有効でない場合は FFH (無視)
コメント:
この関数は、システム クロック ドライバーを特定の日付に初期化しますが、システム時間は変更されません。
INT21H (0x21)
関数 2CH (0x2C または 44) --> 時間を取得
コール:AH = 2CH
戻り値: CH = 時間 (0 から 23)
CL = 分(0~59)
DH = 秒 (0 ~ 59)
DL = 100分の1秒(0から99)
コメント:
これは、システムのリアルタイム クロック ドライバーから時刻を取得し、時間、分、秒、および 100 分の 1 秒に変換するために使用されます。
INT21H (0x21)
関数 2DH (0x2D または 45) --> 時間の設定
コール:AH = 2DH
CH = 時間(0~23)
CL = 分(0~59)
DH = 秒 (0 ~ 59)
DL = 100分の1秒(0から99)
戻り値: AL = 00H、時間が正常に設定された場合は
FFH、時間が有効でない場合(無視)
コメント:
この関数は、システムのリアルタイム クロックを指定された時間、分、秒、および 100 分の 1 秒に初期化します。システムの日付は影響を受けません。
INT21H (0x21)
関数 2EH (0x2E または 46) --> 検証フラグを設定する
コール:AH = 2EH
AL = 00H、検証フラグをオフにする場合
01H、検証フラグをオンにする場合
DL = 00H
戻り値: なし
コメント:
この関数は、データの自動読み取り書き込み検証用のオペレーティング システム フラグをオフまたはオンにします。読み取り書き込み検証はディスク操作を遅くするため、検証フラグのデフォルト設定はオフになっています。
INT21H (0x21)
関数 2FH (0x2F または 47) --> DTA アドレスを取得
コール:AH = 2FH
戻り値:ES: BX = セグメント: ディスク転送領域のオフセット
コメント:
この関数は、FCB ファイルの読み取り/書き込み操作のディスク転送領域 (DTA) の現在のアドレスを取得します。
INT21H (0x21)
関数 30H (0x30 または 48) --> MS-DOS のバージョン番号を取得します。
コール:AH = 30H
AL = 00H
戻り値: AL = メジャーバージョン番号 (MS-DOS 3.10=3 など)
AH = マイナーバージョン番号 (MS-DOS 3.10 = 0AH など)
BH = オリジナル機器メーカー
(OEMの)シリアル番号(OEMによって異なる - IBMの場合は通常00H)
PC-DOSの場合は0FFH、MS-DOSの場合は0FFHまたはその他の値)
BL: CX = 24 ビット ユーザー シリアル番号 (オプション、OEM に依存)
コメント:
ホストの MS-DOS オペレーティング システムのバージョン番号を返します。
INT21H (0x21)
機能 31H (0x31 または 49) --> 終了して常駐 (TSR)
コール: AH = 31H
AL = 戻りコード
DX = 段落内のメモリ量、予約する
何も返さない
コメント:
この関数は、親プロセスに戻りコードを渡して現在実行中のプログラムの実行を終了しますが、次にロードされる一時プログラムによってオーバーレイされるように、プログラムのメモリの一部または全部を予約します。この関数は、プログラム セグメント プレフィックスのセグメントを含めるために CS をサポートしているため、INT 27H よりも優先して使用する必要があります。
INT21H (0x21)
機能 32H (0x32 または 50) --> 予約済み
INT21H (0x21)
関数 33H (0x33 または 51) --> ブレークフラグを取得または設定し、ブートドライブを取得します
コール: ブレークフラグを取得した場合
AH = 33H
AL = 00H
ブレークフラグを設定する場合
AH = 33H
AL = 01H
ブレークフラグをオフにする場合、DL = 00H
ブレークフラグをONにする場合は01H
ブートドライブを取得する場合
AH = 33H
AL = 05H
戻り値: AL = 00Hまたは01Hで呼び出された場合
DL = 00H ブレークフラグはOFF
01HブレークフラグがON
AL = 05Hで呼び出された場合
DL = ブートドライブ (1 = A、2 = B など)
コメント:
この関数は、関数呼び出し中の Ctrl-C チェックに影響するオペレーティング システムのブレーク フラグの状態を取得または変更します。
INT21H (0x21)
機能 34H (0x34 または 52) --> 予約済み
INT21H (0x21)
関数 35H (0x35 または 53) --> 割り込みベクトルを取得
コール:AH = 35H
AL = 割り込み番号
戻り値: ES: BX = セグメント: 割り込みハンドラのオフセット
コメント:
この関数は、指定されたマシン割り込みの現在の割り込みハンドラ ルーチンのアドレスを取得します。
INT21H (0x21)
関数 36H (0x36 または 54) --> ドライブ割り当て情報を取得する
コール: AH = 36H
DL = ドライブ コード (0 がデフォルト、1 = A など)
戻り値: 関数が成功した場合
AX = クラスターあたりのセクター数
BX = 利用可能なクラスターの数
CX = セクターあたりのバイト数
DX = ドライブあたりのクラスター
機能が失敗した場合(ドライブが無効)
AX = FFFFH
コメント:
この関数は、ディスク ドライブに関する選択された情報を取得します。
この機能は、データ復旧やディスクのトラブルシューティングのプログラミングにおいて非常に重要であり、ドライブの容量や残りの空き容量、その他多くの重要な事項を計算できます。
INT21H (0x21)
機能 37H (0x37 または 55) --> 予約済み
INT21H (0x21)
関数 38H (0x38 または 56) --> 国情報を取得または設定する
国情報を取得する場合
AH = 38H
AL = 0、現在の国情報を取得する
1-FEH、情報を取得する
コードが<255の国
FFH、国に関する情報を取得する
コード >=255
BX = 国コード、AL = FFHの場合
DS:DX = セグメント: 返される情報のバッファのオフセット
現在の国コードを設定する場合
AH = 38H
AL = 1-FEH、コードが255未満の国の国コード
FFH、コードが255以上の国の場合
BX = 国コード、AL = 0FFHの場合
DX = FFFFH
戻り値:
関数が成功した場合
キャリーフラグ = クリア
そして、国際化に関する情報を得るには
BX = 国コード
DS: DX = セグメント: 国際化情報を保持するバッファのオフセット。
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、現在の国または指定された国の国際情報を取得するか、現在の国コードを設定します。
INT21H (0x21)
関数 39H (0x39 または 57) --> ディレクトリの作成
コール:AH = 39H
DS: DX = セグメント: ASCIIZ パス名のオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、指定されたドライブとパスを使用してディレクトリを作成します。
ASCIIZ は、Null またはゼロのバイトで終了する ASCII 文字のシーケンスとして知られています。 |
INT21H (0x21)
機能 3AH (0x3A または 58) --> ディレクトリを削除する
コール:AH = 3AH
DS: DX = セグメント: ASCIIZ パス名のオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、指定されたドライブとパスを使用してディレクトリを削除します。パス名の要素が存在しないか、ディレクトリが空でないか、アクセスが拒否されるか、指定されたディレクトリが現在のディレクトリでもある場合、ディレクトリを削除する関数は失敗します。
INT21H (0x21)
関数 3BH (0x3B または 59) --> 現在のディレクトリを設定する
コール:AH = 3BH
DS: DX = セグメント: ASCIIZ パス名のオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、指定されたドライブとパスを使用して現在のディレクトリまたはデフォルトのディレクトリを設定します。指定されたパスまたはパスの要素が存在しない場合、関数は失敗します。
INT21H (0x21)
関数 3CH (0x3C または 60) --> ファイルの作成
コール:AH = 3CH
CX = ファイル属性、属性
重要ビットは結合される場合があります。
ビットの意味は次の表に示されています。
ビット |
重要性(設定されている場合) |
0 |
読み取り専用 |
1 |
隠れた |
2 |
システム |
3 |
ボリュームラベル |
4 |
予約済み (0) |
5 |
アーカイブ |
6 – 15 |
予約済み (0) |
DS: DX = セグメント: ASCIIZのオフセット
パス名
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = ハンドル
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
ASCIIZ パス名が指定された場合、この関数は、指定されたまたはデフォルトのディスク ドライブ上の指定されたまたはデフォルトのディレクトリに新しいファイルを作成します。指定されたファイルが既に存在する場合、長さが 0 に切り捨てられます。どちらの場合も、ファイルが開かれ、プログラムがファイルへの後続のアクセスに使用できるハンドルが返されます。
パス名の要素が存在しない場合、またはルート ディレクトリにファイルを作成しているがルート ディレクトリがいっぱいであるかアクセスが拒否された場合、または読み取り専用属性を持つファイルが指定されたディレクトリにすでに存在する場合、ファイル作成機能は失敗します。
INT21H (0x21)
関数 3DH (0x3D または 61) --> ファイルを開く
コール:AH = 3DH
AL = アクセスモード
アクセス モード ビットの意味は次の表に示されています。
ビット |
意義 |
0 – 2 |
アクセスモード
000 = 読み取りアクセス
001 = 書き込みアクセス
010 = 読み取り/書き込みアクセス |
3 |
予約済み (0) |
4 – 6 |
共有モード
000 = 互換モード
001 = すべて拒否
010 = 書き込み拒否
011 = 読み取り拒否
100 = すべて拒否 |
7 |
継承フラグ
0 = 子プロセスがハンドルを継承する
1 = 子はハンドルを継承しない |
DS: DX = セグメント: ASCIIZ パス名のオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = ハンドル
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
ASCIIZ パス名が指定された場合、この関数は、指定されたディスク ドライブまたはデフォルトのディスク ドライブ上の指定されたディレクトリまたはデフォルトのディレクトリで指定されたファイルを開きます。プログラムがファイルへの後続のアクセスに使用できるハンドルが返されます。
INT21H (0x21)
関数 3EH (0x3E または 62) --> ファイルを閉じる
コール:AH = 3EH
BX = ハンドル
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、ファイルに関連付けられたすべての内部バッファをディスクにフラッシュし、ファイルを閉じて、以前に開かれたハンドルまたは指定されたハンドルの成功によって作成されたハンドルを再利用のために解放します。ファイルが変更された場合、ファイルのディレクトリ エントリで、時刻と日付のスタンプおよびファイル サイズが更新されます。
INT21H (0x21)
関数 3FH (0x3F または 63) --> ファイルまたはデバイスの読み取り
コール:AH = 3FH
BX = ハンドル
CX = 読み取るバイト数
DS: DX = セグメント: バッファのオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = 転送されたバイト数
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、現在のファイル ポインター位置のデータをファイルからバッファーに転送し、以前のオープンまたは作成操作からの指定された有効なファイル ハンドル、バッファー アドレス、およびバイト単位の長さのファイル ポインター位置を更新します。
INT21H (0x21)
機能 40H (0x40 または 64) --> ファイルまたはデバイスの書き込み
コール: AH = 40H
BX = ハンドル
CX = 書き込むバイト数
DS: DX = セグメント: バッファのオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = 転送されたバイト数
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、バッファからファイルにデータを転送し、前回のオープンまたは作成操作で指定された有効なファイル ハンドル、バッファ アドレス、およびバイト単位の長さのファイル ポインター位置を更新します。関数が CX = 0 で呼び出されると、ファイルは現在のファイル ポインター位置に切り捨てられるか、拡張されます。
INT21H (0x21)
機能 41H (0x41 または 65) --> ファイルを削除
コール:AH = 41H
DS: DX = セグメント: ASCIIZ パス名のオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、デフォルトまたは指定されたディスクとディレクトリからファイルを削除します。この関数は、ルート ディレクトリ内のファイル名の最初の文字を文字 E5H (0xE5) に置き換え、ファイルのクラスターをファイル アロケーション テーブル内の新しいデータに使用できるようにすることでファイルを削除します。それまでは、それらのクラスターに保存されている実際のデータは上書きされません。
INT21H (0x21)
関数 42H (0x42 または 66) --> ファイルポインターを設定する
コール:AH = 42H
AL = メソッドコード
00H ファイル先頭からの絶対オフセット
01H 現在のファイルからの符号付きオフセット
ポインタ
02H ファイルの末尾からの符号付きオフセット
BX = ハンドル
CX = オフセットの最も重要な半分
DX = オフセットの最下位半分
戻り値: 関数が成功した場合
キャリーフラグ = クリア
DX = 結果ファイルの上位半分
ポインタ
AX = 結果ファイルの最下位半分
ポインタ
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、ファイルの先頭、ファイルの末尾、または現在のファイルの位置を基準としたファイル ポインターの位置を設定します。
INT21H (0x21)
関数 43H (0x43 または 67) --> ファイル属性を取得または設定する
コール:AH = 43H
属性を取得するには AL = 00H
01H 属性を設定する
CX = ファイル属性(AL=01Hの場合)。ビットは組み合わせ可能
DS: DX = セグメント: ASCIIZ パス名のオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
CX = ファイル属性
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、ファイル (読み取り専用、隠し、システム、またはアーカイブ) またはディレクトリの属性を取得または変更します。さまざまな属性のビットの意味については、前述のビットの意味表を参照してください。
INT21H (0x21)
機能 44H (0x44 または 68) --> 入出力制御 (I/O Ctrl)
この関数は、アプリケーション プログラムとデバイス ドライバー間の直接通信パスを提供します。これにより、プログラムはハードウェアに依存する情報を取得し、他の MS-DOS 関数呼び出しではサポートされていない操作を要求できます。
入力および出力制御のサブ機能を次の表に示します。
サブ機能 |
操作名 |
00H |
デバイス情報を取得する |
01H |
デバイス情報の設定 |
02H |
キャラクタデバイスドライバから制御データを受信する |
03H |
制御データをキャラクタデバイスドライバに送信する |
04時間 |
ブロックデバイスドライバーから制御データを受信する |
05H |
ブロックデバイスドライバーに制御データを送信する |
06時間 |
入力ステータスを確認する |
07時間 |
出力ステータスを確認する |
08時間 |
ブロックデバイスが取り外し可能かどうかを確認する |
09時間 |
ブロックデバイスがリモートかどうかを確認する |
0AH (10) |
ハンドルがリモートかどうかを確認する |
0BH (11) |
共有再試行回数を変更する |
0CH (12)
|
キャラクターデバイス用の汎用 I/O 制御
価値 |
説明 |
CL = 45H |
反復回数の設定 |
CL = 4AH |
コードページを選択 |
CL = 4CH |
コードページの準備を開始する |
CL = 4DH |
コードページの準備終了 |
CL = 5FH |
表示情報の設定 |
CL = 65H |
反復回数を取得する |
CL = 6AH |
選択したコードページの照会 |
CL = 6BH |
クエリ準備リスト |
CL = 7FH |
表示情報を取得する |
|
0DH (13)
|
ブロックデバイス用の汎用 I/O 制御
価値 |
説明 |
CL = 40H |
デバイスパラメータの設定 |
CL = 41H |
トラックの書き込み |
CL = 42H |
トラックのフォーマットと検証 |
CL = 47H |
アクセスフラグを設定する |
CL = 60H |
デバイスパラメータを取得する |
CL = 61H |
トラックを読む |
CL = 62H |
トラックを確認する |
CL = 67H |
アクセスフラグを取得 |
|
0EH (14) |
論理ドライブマップを取得する |
0FH (15) |
論理ドライブマップの設定 |
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 00H (0x00) I/O Ctrl --> デバイス情報を取得
コール: AH = 44H
AL = 00H
BX = ハンドル
戻り値: 関数が成功した場合
キャリーフラグ = クリア
DX = デバイス情報ワード
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、指定されたハンドルに関連付けられたファイルまたはデバイスのデバイス情報ワードを返します。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 01H (0x01) I/O Ctrl --> デバイス情報の設定
コール:AH = 44H
AL = 01H
BX = ハンドル
DX = デバイス情報ワード
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
INT 21H の機能 44H のこのサブ関数は、文字デバイスに関連付けられたハンドルの特定のフラグを設定します。このサブ関数は、ファイルに関連付けられたハンドルには使用できません。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 02H (0x02) I/O Ctrl --> 制御データ文字デバイス ドライバーの読み取り
コール: AH = 44H
AL = 02H
BX = ハンドル
CX = 読み取るバイト数
DS: DX = セグメント: バッファのオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = 読み取られたバイト数
バッファにはドライバからの制御データが含まれています
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
文字デバイス ドライバーから制御データを読み取ります。データの長さと内容は各デバイス ドライバーに指定され、標準形式には従いません。この関数は、必ずしも物理デバイスからの入力をもたらすわけではありません。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 03H (0x03) I/O Ctrl --> 制御データの書き込み文字デバイス ドライバー
コール: AH = 44H
AL = 03H
BX = ハンドル
CX = 書き込むバイト数
DS: DX = セグメント: データのオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = 転送されたバイト数
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、アプリケーションからキャラクタ デバイス ドライバに制御データを転送します。データの長さと内容は各デバイス ドライバに固有であり、標準形式には従いません。この関数は、必ずしも物理デバイスに何らかの出力を行うわけではありません。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 04H (0x04) I/O Ctrl --> 制御データ ブロック デバイス ドライバーの読み取り
コール: AH = 44H
AL = 04H
BL = デバイス コード (0 = デフォルト、1 = A、2 = B など)
CX = 読み取るバイト数
DS: DX = セグメント: バッファのオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = 転送されたバイト数
バッファにはデバイスドライバからの制御データが含まれています
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、ブロック デバイス ドライバーから制御データをアプリケーション プログラムのバッファーに直接転送します。データの長さと内容は各デバイス ドライバーに固有であり、標準形式には従いません。この関数は、必ずしも物理デバイスからの入力になるわけではありません。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 05H (0x05) I/O Ctrl --> 書き込み制御データ ブロック デバイス ドライバー
コール: AH = 44H
AL = 05H
BL = デバイス コード (0 = デフォルト、1 = A、2 = B など)
CX = 書き込むバイト数
DS: DX = セグメント: データのオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = 転送されたバイト数
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、制御データをアプリケーション プログラムからブロック デバイス ドライバーに直接転送します。制御データの長さと内容は各デバイス ドライバーに固有であり、標準形式には従いません。この関数は、必ずしも物理デバイスに出力を行うわけではありません。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 06H (0x06) I/O Ctrl --> 入力ステータスの確認
コール: AH = 44H
AL = 06H
BX = ハンドル
戻り値: 関数が成功した場合
キャリーフラグ = クリア
デバイスの場合:
AL = 00H、デバイスの準備ができていない場合
FFH(デバイスの準備が整っている場合)
ファイルの場合:
AL = 00H、ファイルポインタがEOFにある場合
ファイルポインタがEOFでない場合はFFH
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
ハンドルに関連付けられたデバイスまたはファイルが入力の準備ができているかどうかを示すコードを返します。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 07H (0x07) I/O Ctrl --> 出力ステータスの確認
コール: AH = 44H
AL = 07H
BX = ハンドル
戻り値: 関数が成功した場合
キャリーフラグ = クリア
デバイスの場合:
AL = 00H、デバイスの準備ができていない場合
FFH(デバイスの準備が整っている場合)
ファイルの場合:
AL = FFH
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
ハンドルに関連付けられたデバイスが出力の準備ができているかどうかを示すコードを返します。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 08H (0x08) I/O Ctrl --> ブロックデバイスが取り外し可能かどうかを確認します
コール:AH = 44H
AL = 08H
BL = ドライブ番号 (0 = デフォルト、1 = A、2 = B など)
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AL = 00H、メディアが取り外し可能な場合
01H、メディアが取り外せない場合
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、指定されたブロック デバイスにフロッピー ディスクなどのリムーバブル ストレージ メディアが含まれているかどうかを確認します。特定のドライブでファイルが期待どおりに見つからない場合、プログラムはこのサブ関数を使用して、ユーザーに別のディスクを挿入するように求めるかどうかを判断できます。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 09H (0x09) I/O Ctrl --> ブロックデバイスがリモートかどうかをチェック
コール: AH = 44H
AL = 09H
BL = ドライブ番号 (0 = デフォルト、1 = A、2 = B など)
戻り値: 関数が成功した場合
キャリーフラグ = クリア
DX = デバイス属性ワード
ビット12 = 0、ドライブがローカルの場合
= 1、ドライブがリモートの場合
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、指定されたブロック デバイスがローカル (プログラムを実行しているコンピューターに接続されている) かリモート (ネットワーク サーバーにリダイレクトされている) かをチェックします。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 0AH (0x0A または 10) I/O Ctrl --> ハンドルがリモートかどうかをチェック
コール: AH = 44H
AL = 0AH
BX = ハンドル
戻り値: 関数が成功した場合
キャリーフラグ = クリア
DX = ファイルまたはデバイスの属性語
ビット15 = ローカルの場合は0
リモートの場合は1
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
指定されたハンドルがローカル (プログラムを実行している PC 上にある) またはリモート (ネットワーク サーバー上にある) のファイルまたはデバイスを参照しているかどうかを確認します。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 0BH (0x0B または 11) I/O Ctrl --> 共有再試行回数の変更
コール: AH = 44H
AL = 0BH
CX = 再試行ごとの遅延 (デフォルト = 1)
DX = 再試行回数(デフォルト = 3)
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、ファイル共有違反によって障害が発生した後、要求プロセスにエラーを返す前に MS-DOS がディスク操作を再試行する回数を設定します。このサブ関数は、ファイル共有モジュールがロードされていないと使用できません。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 0CH (0x0C または 12) I/O Ctrl キャラクタデバイスの汎用 I/O 制御
コール: AH = 44H
AL = 0CH
BX = ハンドル
CH =カテゴリー(主要)コード:
00H = 不明
01H = COM1、COM2、COM3、または COM4
03H = CON (キーボードとディスプレイ)
05H = LPT1、LPT2、またはLPT3
CL = 機能(マイナー)コード:
45H = 繰り返し回数の設定
4AH = コードページの選択
4CH = コードページの準備を開始
4DH = コードページの準備終了
5FH = 表示情報の設定
65H = 反復回数を取得
6AH = 選択したコードページの照会
6BH = クエリ準備リスト
7FH = ディスプレイ情報を取得
DS: DX = セグメント: パラメータブロックのオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
CL = 65H、6AH、6BH、または7FHで呼び出された場合
DS: DX = セグメント: パラメータブロックのオフセット
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
これは、アプリケーション プログラムとキャラクタ デバイス ドライバ間の通信のための汎用メカニズムを提供します。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 0DH (0x0D または 13) I/O Ctrl --> ブロック デバイスの汎用 I/O 制御
コール: AH = 44H
AL = 0DH
BL = ドライブ コード (0 = デフォルト、1=A、2=B など)
CH = カテゴリ(主要)コード:
08H = ディスクドライブ
CL = 機能(マイナー)コード:
40H = ドライブパラメータの設定
41H = トラック書き込み
42H = トラックのフォーマットと検証
47H = アクセスフラグの設定
60H = デバイスパラメータを取得
61H = トラックの読み取り
62H = トラックの検証
67H = アクセスフラグを取得
DS: DX = セグメント: パラメータブロックのオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
CL = 60Hまたは61Hで呼び出された場合
DS: DX = セグメント: パラメータブロックのオフセット
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、アプリケーション プログラムとブロック デバイス ドライバー間の通信のための汎用メカニズムを提供します。プログラムが論理ドライブのデバイス パラメータを検査または変更したり、ハードウェアに依存しない方法でディスク トラックの読み取り、書き込み、フォーマット、検証を実行したりできるようにします。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 0EH (0x0E または 14) I/O Ctrl -->> 論理ドライブマップを取得
コール: AH = 44H
AL = 0EH
BL = ドライブ コード (0 = デフォルト、1=A、2=B など)
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AL = マッピングコード
00H、論理ドライブコードが1つだけの場合
ブロックデバイスに割り当てられる
01H-1AH 論理ドライブコード (1=A、
2=Bなど)がブロックデバイスにマッピングされる
関数が失敗した場合
キャリーフラグ = セット
AX =エラーコード
コメント:
指定されたブロック ドライブにアクセスするために最後に使用された論理ドライブ コードを返します。
INT21H (0x21)
機能 44H (0x44 または 68)、サブ機能 0FH (0x0F または 15) I/O Ctrl --> 論理ドライブマップの設定
コール: AH = 44H
AL = 0FH
BL = ドライブ コード (0 = デフォルト、1=A、2=B など)
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AL = マッピングコード
00H、論理ドライブコードが1つだけの場合
ブロックデバイスに割り当てられる
01H-1AH、論理ドライブコード(1=A、
2=Bなど)にマッピングされる
ブロックデバイス
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、ブロック デバイスを参照するために使用される次の論理ドライブ コードを設定します。
INT21H (0x21)
関数 45H (0x45 または 69) --> 重複ハンドル
コール:AH = 45H
BX = 複製するハンドル
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = 新しいハンドル
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、現在開いているデバイスまたはファイルの指定されたハンドルに対して、同じ位置にある同じデバイスまたはファイルを参照する新しいハンドルを返します。
INT21H (0x21)
関数 46H (0x46 または 70) --> リダイレクト ハンドル
コール: AH = 46H
BX = ファイルまたはデバイスのハンドル
CX = リダイレクトするハンドル
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
指定されたハンドルが 2 つある場合、この関数は 2 番目のハンドルが最初のハンドルと同じ場所にある同じデバイスまたはファイルを参照するようにします。この場合、2 番目のハンドルはリダイレクトされたとみなされます。
INT21H (0x21)
関数 47H (0x47 または 71) --> 現在のディレクトリを取得します
コール:AH = 47H
DL = ドライブコード (0 =デフォルト、1=A、
2=Bなど)
DS: SI = セグメント: 64 バイト バッファのオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
そして、バッファには現在のディレクトリのルートからの完全なパス名が入力されます。
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、ルートから現在のディレクトリまでのパスとそのディレクトリの名前を記述する ASCIIZ 文字列を取得します。
INT21H (0x21)
機能 48H (0x48 または 72) --> メモリブロックを割り当てる
コール:AH = 48H
BX = 記憶の段落数
必要
戻り値: 関数が成功した場合
キャリーフラグ = クリア
Ax = 割り当てられたベースセグメントアドレス
ブロック
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
BX = 利用可能な最大ブロックのサイズ
(段落)
コメント:
メモリ ブロックを割り当て、割り当てられた領域の先頭へのポインタを返します。
INT21H (0x21)
機能 49H (0x49 または 73) --> メモリブロックを解放する
コール: AH = 49H
ES = 解放されるブロックのセグメント
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、メモリ ブロックを解放し、他のプログラムで使用できるようにするために使用されます。プログラムが、そのプログラムに属していないメモリ ブロックを解放した場合、またはレジスタ ES に渡されたセグメント アドレスが既存のメモリ ブロックの有効なベース アドレスでない場合、この関数は失敗するか、予期しないシステム エラーを引き起こす可能性があります。
INT21H (0x21)
関数 4AH (0x4A または 74) --> メモリブロックのサイズを変更する
コール:AH = 4AH
BX = 段落内の希望する新しいブロックサイズ
ES = 変更するブロックのセグメント
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
BX = 利用可能な最大ブロックサイズ
(段落)
コメント:
この関数は、アプリケーション プログラムのニーズに応じて、メモリ ブロックを動的に縮小または拡張します。
INT21H (0x21)
機能 4BH (0x4B または 75) --> プログラムの実行 (EXEC)
コール:AH = 4BH
AL = サブ関数
00H = プログラムのロードと実行
03H = オーバーレイのロード
ES: BX = セグメント: パラメータブロックのオフセット
DS: DX = セグメント: ASCIIZ プログラムのオフセット
パス名
戻り値: 関数が成功した場合
キャリーフラグ = クリア
レジスタは通常の方法で保存されます。
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数を使用すると、アプリケーション プログラムが別のプログラムを実行し、終了時に制御を取り戻すことができます。オーバーレイをロードするためにも使用できますが、この使用法は一般的ではありません。
INT21H (0x21)
関数 4CH (0x4C または 76) --> 戻りコードでプロセスを終了
コール:AH = 4CH
AL = 戻りコード
戻り値: なし
コメント:
この関数は、現在のプロセスを終了し、戻りコードを親プロセスに渡します。これは、プログラムが最終的な終了を実行するために使用できるいくつかの方法の 1 つです。
INT21H (0x21)
関数 4DH (0x4D または 77) --> 戻りコードを取得する
コール:AH = 4DH
戻り値: AH = 終了タイプ
INT 20H、INT 21H Function 00H、または INT 21H Functions 4CHによる正常終了の場合は 00H、
Ctrl-C によるユーザー入力による終了の場合は
01H、クリティカル エラー ハンドラーによる終了の場合は02H、INT21H Function 31H または
INT 27H
による終了の場合は 03H
|
AL = 子プロセスから渡された戻りコード
(子がINT 20Hで終了した場合は0、
INT 21H 機能 00H、または INT 27H)
コメント:
この関数は、EXEC 呼び出し (INT 21H 関数 4BH) が正常に実行された後に、親プロセスによって子プロセスの戻りコードと終了タイプを取得するために使用されます。
INT21H (0x21)
関数 4EH (0x4E または 78) --> 最初のファイルを検索
コール:AH = 4EH
CX = 検索属性(ビットは組み合わせ可能)
DS: DX = セグメント: ASCIIZ パス名のオフセット
戻り値: 関数が成功し、一致するファイルが見つかった場合
キャリーフラグ = クリア
そして、現在のディスク転送領域に返される検索結果は次のとおりです。
変更点 |
説明 |
00H-14H |
予約済み (0) |
15時間 |
一致したファイルまたはディレクトリの属性 |
16H-17H |
ファイル時間
ビット 00H-04H = 2 秒単位 (0-29)
ビット 05H-0AH = 分 (0-59)
ビット 0BH-0FH = 時間 (0-23) |
18時~19時
|
ファイル日付
ビット 00H-04H = 日 (1-31)
ビット 05H-08H = 月 (1-12)
ビット 09H-0FH = 年 (1980 年を基準) |
1AH-1DH |
ファイルサイズ |
1EH-2AH |
ASCIIZファイル名と拡張子 |
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、ASCIIZ 文字列の形式で指定されたファイル指定に最初に一致するファイルを、デフォルトまたは指定されたドライブ上のデフォルトまたは指定されたディレクトリで検索します。属性のビットの重要性については、前述のビットの重要性の表を参照してください。
INT21H (0x21)
関数 4FH (0x4F または 79) --> 次のファイルを検索
コール:AH = 4FH
戻り値: 関数が成功し、一致するファイルが見つかった場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
以前に INT 21H 関数 4EH が正常に呼び出された場合、この関数は、デフォルトまたは指定されたドライブ上のデフォルトまたは指定されたディレクトリで、元のファイル仕様に一致する次のファイルを検索します。
INT21H (0x21)
機能 50H (0x50 または 80) --> 予約済み
INT21H (0x21)
機能 51H (0x51 または 81) --> 予約済み
INT21H (0x21)
機能 52H (0x52 または 82) --> 予約済み
INT21H (0x21)
機能 53H (0x53 または 83) --> 予約済み
INT21H (0x21)
関数 54H (0x54 または 84) --> 検証フラグを取得する
コール: AH = 54H
戻り値: AL = 現在の検証フラグ値
検証オフの場合は00H
検証がオンの場合01H
コメント:
この関数は、システム検証 (書き込み後の読み取り) フラグの現在の値を取得します。
INT21H (0x21)
機能 55H (0x55 または 85) --> 予約済み
INT21H (0x21)
関数 56H (0x56 または 86) --> ファイルの名前を変更する
コール: AH = 56H
DS: DX = セグメント: 現在の ASCIIZ のオフセット
パス名
ES: DI = セグメント: 新しい ASCIIZ のオフセット
パス名
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、ファイルの名前を変更したり、そのディレクトリエントリを同じディスク上の別の場所に移動したりします。MS-DOSバージョン3.0以降では、この関数を使用してディレクトリの名前を変更することもできます。
パス名のいずれかの要素が存在しないか、新しいパス名のファイルがすでに存在するか、現在のパス名の指定に新しいパス名とは異なるディスク ドライブが含まれているか、ファイルがルート ディレクトリに移動され、ルート ディレクトリがいっぱいであるか、ユーザーに十分な権限がない場合は、ファイル名を変更する機能は失敗します。
INT21H (0x21)
関数 57H (0x57 または 87) --> ファイルの日付と時刻を取得または設定します
電話をかける: 日付と時刻を取得する場合
AH = 57H
AL = 00H
BX = ハンドル
日付と時刻を設定する場合
AH = 57H
AL = 01H
BX = ハンドル
CX = 時間
ビット 00H-04H = 2 秒単位 (0-29)
ビット 05H-0AH = 分 (0-59)
ビット 0BH-0FH = 時間 (0-23)
DX = 日付
ビット 00H-04H = 日 (1-31)
ビット 05H-08H = 月 (1-12)
ビット 09H-0FH = 年 (1980 年を基準)
戻り値: 関数が成功した場合
キャリーフラグ = クリア
そして、AL = 00Hで呼び出された場合
CX = 時間
DX = 日付
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、ファイルのルート ディレクトリ エントリの日付とタイムスタンプを取得または変更します。
INT21H (0x21)
関数 58H (0x58 または 88) --> 割り当て戦略を取得または設定する
戦略コードを取得する場合
AH = 58H
AL = 00H
戦略コードを設定する場合
AH = 58H
AL = 01H
BX = 希望する戦略コード
00H = 最初のフィット
01H = 最適
02H = 最後のフィット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
そして、AL = 00Hで呼び出された場合
AX = 現在の戦略コード
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
メモリ ブロックを割り当てるための現在の MS-DOS 戦略を示すコードを取得または変更します。デフォルトの MS-DOS メモリ割り当て戦略は、First Fit (コード 0) です。
ファーストフィットメモリ割り当てでは、MS-DOS は使用可能なメモリ ブロックを低アドレスから高アドレスまで検索し、ブロック割り当て要求を満たすのに十分な大きさの最初のブロックを割り当てます。
最適な割り当て戦略の場合、MS-DOS は使用可能なすべてのメモリ ブロックを検索し、位置に関係なく、要求を満たす最小の使用可能なブロックを割り当てます。
ラストフィットメモリ割り当て戦略では、MS-DOS は、使用可能なメモリ ブロックを高アドレスから低アドレスまで検索し、ブロック割り当て要求を満たすのに十分な大きさの最も大きいブロックを割り当てます。
INT21H (0x21)
関数 59H (0x59 または 89) --> 拡張エラー情報を取得する
コール: AH = 59H
00H ...
戻り値: AX = 拡張エラーコード
エラー コードの表を以下に示します。
エラーコード |
エラー |
01H |
関数番号が無効です |
02H |
ファイルが見つかりません |
03H |
パスが見つかりません |
04時間 |
開いているファイルが多すぎます |
05H |
アクセスが拒否されました |
06時間 |
ハンドルが無効です |
07時間 |
メモリ制御ブロックが破壊されました |
08時間 |
メモリ不足 |
09時間 |
メモリブロックアドレスが無効です |
0AH (10) |
環境が無効です |
0BH (11) |
フォーマットが無効です |
0CH (12) |
アクセスコードが無効です |
0DH (13) |
データが無効です |
0EH (14) |
不明なユニット |
0FH (15) |
ディスクドライブが無効です |
10H (16) |
現在のディレクトリを削除しようとしました |
11H (17) |
同じデバイスではありません |
12H (18) |
ファイルはもうありません |
13H (19) |
ディスクが書き込み禁止 |
14時間 (20) |
不明なユニット |
15H (21) |
ドライブの準備ができていません |
16H (22) |
不明なコマンド |
17H (23) |
データエラー (CRC) |
18H (24) |
リクエスト構造の長さが間違っています |
19H (25) |
シークエラー |
1AH(26) |
不明なメディアタイプ |
1BH(27) |
セクターが見つかりません |
1CH (28) |
プリンタの用紙切れ |
1DH(29) |
書き込みエラー |
1EH (30) |
読み取りエラー |
1FH(31) |
一般的な失敗 |
20H (32) |
共有違反 |
21H (33) |
ロック違反 |
22H (34) |
ディスクの変更が無効です |
23H (35) |
FCBは利用できません |
24時間 (36) |
共有バッファを超えました |
25H-31H |
予約済み |
32時間(50) |
サポートされていないネットワーク要求 |
33H(51) |
リモートマシンがリッスンしていない |
34時間(52) |
ネットワーク上で重複した名前 |
35H(53) |
ネットワーク名が見つかりません |
36H(54) |
ネットワークがビジーです |
37H(55) |
デバイスはネットワーク上に存在しません |
38H(56) |
ネットBIOSコマンド制限を超えました |
39H(57) |
ネットワークアダプタハードウェアのエラー |
3AH(58) |
ネットワークからの不正な応答 |
3BH(59) |
予期しないネットワークエラー |
3CH (60) |
リモートアダプタが互換性がありません |
3DH(61) |
印刷キューがいっぱいです |
3EH(62) |
印刷ファイル用のスペースが足りません |
3FH(63) |
印刷ファイルをキャンセルしました |
40H(64) |
ネットワーク名が削除されました |
41H(65) |
ネットワークアクセスが拒否されました |
42H(66) |
ネットワークデバイスの種類が正しくありません |
43H(67) |
ネットワーク名が見つかりません |
44時間(68) |
ネットワーク名の制限を超えました |
45H(69) |
ネットBIOSセッション制限を超えました |
46H(70) |
ファイル共有を一時停止しました |
47H(71) |
ネットワーク要求が受け入れられませんでした |
48時間(72) |
印刷またはディスクのリダイレクトが一時停止されました |
49H-4FH |
予約済み |
50H(80) |
ファイルは既に存在します |
51H(81) |
予約済み |
52H(82) |
ディレクトリを作成できません |
53H(83) |
INT 24H で失敗 (重大なエラー) |
54H(84) |
リダイレクトが多すぎる |
55H(85) |
重複リダイレクト |
56H(86) |
無効なパスワード |
57H(87) |
無効なパラメータ |
58H(88) |
ネットワークデバイスの障害 |
59H(89) |
ネットワークでサポートされていない機能 |
5AH(90) |
必要なシステムコンポーネントがインストールされていません |
BH = エラークラス
01H |
リソース不足の場合(ストレージやハンドルなど) |
02H |
エラーではないが、一時的な状況(ファイル内のロックされた領域など)の場合は、終了すると予想されます |
03H |
認証の問題の場合 |
04時間 |
システムソフトウェアの内部エラーの場合 |
05H |
ハードウェア障害の場合 |
06時間 |
システムソフトウェアの障害がアクティブプロセスの障害ではない場合(構成ファイルの欠落など) |
07時間 |
アプリケーションプログラムエラーの場合 |
08時間 |
ファイルまたはアイテムが見つからない場合 |
09時間 |
ファイルまたはアイテムの種類または形式が無効の場合 |
0AH (10) |
ファイルまたはアイテムがロックされている場合 |
0BH (11) |
ドライブに間違ったディスクが入っている、ディスクに不良箇所がある、またはストレージメディアに問題がある場合 |
0CH (12) |
アイテムがすでに存在する場合 |
0DH (13) |
不明なエラー |
BL = 推奨アクション
01H |
適切な回数再試行し、ユーザーに中止または無視を選択するよう促す |
02H |
再試行の間に遅延を設けて適切な回数再試行し、ユーザーに中止または無視を選択するよう促す |
03H |
ユーザーから正しい情報を取得できない (通常はファイル名やデバイスの指定が間違っていることが原因) |
04時間 |
クリーンアップしてアプリケーションを中止します (つまり、ロックを解除したり、ファイルを閉じたりして、できるだけ規則的にプログラムを終了します) |
05H |
クリーンアップせずに即時終了する |
06時間 |
エラーを無視 |
07時間 |
ユーザーの介入後に再試行してエラーの原因を取り除いてください |
CH = エラー位置
01H 不明
02H ブロックデバイス(ディスクまたはディスクエミュレータ)
03Hネットワーク
04Hシリアルデバイス
05Hメモリ
ES: DI = ディスクのASCIIZボリュームラベル
AX = 0022H(無効なディスク変更)の場合は挿入
コメント:
この関数は、前回の INT 21H 関数呼び出しが失敗した後の詳細なエラー情報 (推奨される修復アクションを含む) を取得します。
INT21H (0x21)
関数 5AH (0x5A または 90) --> 一時ファイルを作成する
コール:AH = 5AH
CX = 属性(ビットは組み合わせ可能)
DS: DX = セグメント: ASCIIZ パスのオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = ハンドル
DS: DX = セグメント: 完全な ASCIIZ のオフセット
パス名
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、デフォルトまたは指定されたディスク ドライブ上の現在のディレクトリまたは指定されたディレクトリに一意の名前を持つファイルを作成し、プログラムがファイルへの後続のアクセスに使用できるハンドルを返します。ファイルに対して生成された名前は、プログラムによって指定されたバッファーにも返されます。
パス名の要素が存在しない場合、またはファイルがルート ディレクトリに作成されていて、ルート ディレクトリがいっぱいの場合、関数は失敗します。
INT21H (0x21)
関数 5BH (0x5B または 91) --> 新しいファイルを作成する
コール:AH = 5BH
CX = 属性(ビットは組み合わせ可能)
DS: DX = セグメント: ASCIIZ パス名のオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AX = ハンドル
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、指定されたドライブまたはデフォルトのドライブ上の指定されたディレクトリまたはデフォルトのディレクトリにファイルを作成し、指定された ASCIIZ パス名のファイルに後でアクセスするためにプログラムが使用できるハンドルを返します。
同じ名前とパスのファイルがすでに存在する場合、指定されたパスの要素が存在しない場合、またはファイルがルート ディレクトリに作成されていて、ルート ディレクトリがいっぱいであるか、ユーザーに十分なアクセス権がない場合は、関数は失敗します。
INT21H (0x21)
関数 5CH (0x5C または 92) --> ファイル領域のロックまたはロック解除
コール:AH = 5CH
AL = 00H ロック領域の場合
ロック解除領域の場合は01H
BX = ハンドル
CX = 領域オフセットの高部
DX = 領域オフセットの低い部分
SI = 領域の長さの高位部分
DI = 領域の長さの低い部分
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、ファイルの指定された領域をロックまたはロック解除します。この機能は、ファイル共有モジュール (SHARE.EXE など) がロードされていないと使用できません。
INT21H (0x21)
関数 5DH (0x5D または 93) --> 予約済み
INT21H (0x21)
関数 5EH (0x5E または 94)、サブ関数 00H (0x00) --> マシン名を取得します
コール:AH = 5EH
AL = 00H
DS: DX = セグメント: 受信するバッファのオフセット
弦
戻り値: 関数が成功した場合
キャリーフラグ = クリア
名前が定義されていない場合はCH = 00H
<> 名前が定義されている場合は 00H
CL = netBIOS名番号(CH <> 0の場合)
DX: DX = セグメント: 識別子のオフセット (CH <> 0 の場合)
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、ローカル コンピュータを識別する ASCIIZ 文字列のアドレスを返します。この関数呼び出しは、Microsoft ネットワークが実行されている場合にのみ使用できます。
INT21H (0x21)
機能 5EH (0x5E または 94)、サブ機能 02H (0x02) --> プリンタ設定文字列を設定する
コール:AH = 5EH
AL = 02H
BX = リダイレクトリストインデックス
CX = セットアップ文字列の長さ
DS: SI = セグメント: セットアップ文字列のオフセット
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、特定のネットワーク プリンタに送信されるすべてのファイルの前に送信される文字列を指定します。これにより、異なるネットワーク ノードのユーザーが同じプリンタ上で個別の動作モードを指定できるようになります。
INT21H (0x21)
関数 5EH (0x5E または 94)、サブ関数 03H (0x03) --> プリンタ設定文字列を取得します
コール:AH = 5EH
AL = 03H
BX = リダイレクトリストインデックス
ES: DI = セグメント: 受信するバッファのオフセット
セットアップ文字列
戻り値: 関数が成功した場合
キャリーフラグ = クリア
CX = プリンタ設定文字列の長さ
ES: DI = セグメント: 受信するバッファのオフセット
セットアップ文字列
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、特定のネットワーク プリンターのプリンター設定文字列を取得するために使用されます。
INT21H (0x21)
関数 5FH (0x5F または 95)、サブ関数 02H (0x02) --> リダイレクト リスト エントリを取得します。
コール:AH = 5FH
AL = 02H
BX = リダイレクトリストインデックス
DS: SI = セグメント: 16バイトバッファのオフセット
ローカルデバイス名を受信する
ES: DI = セグメント: 128バイトのバッファのオフセット
受信ネットワーク名
戻り値: 関数が成功した場合
キャリーフラグ = クリア
BH = デバイスステータスフラグ
デバイスが有効であればビット0 = 0
有効でない場合は 1
BL = デバイスタイプ
03H、プリンタの場合
04H、ドライブの場合
CX = 保存されたパラメータ値
DX = 破壊された
BP = 破壊された
DS: SI = セグメント: ASCIIZ ローカルのオフセット
デバイス名
ES: DI = セグメント: ASCIIZ ネットワークのオフセット
名前
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数を使用すると、ローカル論理名をネットワーク ファイル、ディレクトリ、またはプリンタに関連付けるシステム リダイレクト リストを検査できます。この関数呼び出しは、Microsoft ネットワークが実行中で、ファイル共有モジュールがロードされている場合にのみ使用できます。
INT21H (0x21)
機能 5FH (0x5F または 95)、サブ機能 03H (0x03) --> リダイレクトデバイス
コール:AH = 5FH
AL = 03H
BL = デバイスタイプ
03H、プリンタの場合
04H、ドライブの場合
DS: SI = セグメント: ASCIIZ ローカルのオフセット
デバイス名
ES: DI = セグメント: ASCIIZ ネットワークのオフセット
名前、その後にASCIIZパスワード
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
ローカル デバイス名をネットワーク名に関連付けることで、ネットワーク全体のリダイレクトを確立します。この関数呼び出しは、Microsoft Networks が実行中で、ファイル共有モジュール (SHARE.EXE) がロードされている場合にのみ使用できます。
INT21H (0x21)
機能 5FH (0x5F または 95)、サブ機能 04H (0x04) --> デバイスのリダイレクトをキャンセル
コール:AH = 5FH
AL = 04H
DS: SI = セグメント: ASCIIZ ローカルのオフセット
デバイス名
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
このサブ関数は、ローカル デバイス名とネットワーク名の関連付けを削除することにより、以前のリダイレクト要求をキャンセルします。この関数呼び出しは、Microsoft Networks が実行中で、SHARE.EXE などのファイル共有モジュールがロードされている場合にのみ使用できます。
INT21H (0x21)
機能 60H (0x60 または 96) --> 予約済み
INT21H (0x21)
機能 61H (0x61 または 97) --> 予約済み
INT21H (0x21)
関数 62H (0x62 または 98) --> プログラム セグメント プレフィックス (PSP) アドレスを取得します。
コール: AH = 62H
戻り値: BX = プログラムセグメントのセグメントアドレス
接頭辞
コメント:
この関数は、現在実行中のプログラムのプログラム セグメント プレフィックス (PSP) のセグメント (段落) アドレスを取得します。
INT21H (0x21)
機能 64H (0x64 または 100) --> 予約済み
21時間
関数 65H (0x65 または 101) --> 拡張国情報を取得します
コール:AH = 65H
AL = サブ関数
00H = 一般取得
国際化情報
02H = 大文字へのポインタを取得
テーブル
04H = ファイル名へのポインタを取得
大文字表
06H = 照合テーブルへのポインタを取得
07H = ダブルバイトへのポインタを取得
文字セット (DBCS) ベクトル
BX = 対象のコードページ(-1 = アクティブ
CONデバイス)
CX = 受信するバッファの長さ
情報(5以上である必要があります)
DX = 国ID (-1 = デフォルト)
ES: DI = 受信するバッファのアドレス
情報
戻り値: 関数が成功した場合
キャリーフラグ = クリア
要求されたデータは呼び出しプログラムのバッファに格納されます
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
これは、指定された国および/またはコード ページに関する情報を取得します。情報バイトの詳細については、前述の国際化テーブルを参照してください。
INT21H (0x21)
関数 66H (0x66 または 102) --> コードページを取得または設定する
コール: AH = 66H
AL = サブ関数
01H = コードページを取得
02H = コードページの選択
BX = 選択するコードページ(AL = 02Hの場合)
戻り値: 関数が成功した場合
キャリーフラグ = クリア
そして、AL = 01Hで呼び出された場合
BX = アクティブ コード ページ
DX = デフォルトのコードページ
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、現在のコード ページを取得または選択します。
INT21H (0x21)
関数 67H (0x67 または 103) --> ハンドル数を設定する
コール:AH = 67H
BX = 希望するハンドルの数
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、現在のプロセスによってハンドルを使用して同時に開くことができるファイルとデバイスの最大数を設定します。
INT21H (0x21)
関数 68H (0x68 または 104) --> コミットファイル
コール:AH = 68H
BX = ハンドル
戻り値: 関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、指定されたハンドルに関連付けられた MS DOS の内部バッファ内のすべてのデータをデバイスに物理的に書き込むように強制します。ハンドルがファイルを参照し、そのファイルが変更されている場合は、ファイルのルート ディレクトリ エントリの日付と時刻のスタンプとファイル サイズが更新されます。
INT21H (0x21)
機能 69H (0x69 または 105) --> 予約済み
INT21H (0x21)
機能 6AH (0x6A または 106) --> 予約済み
INT21H (0x21)
機能 6BH (0x6B または 107) --> 予約済み
内部 21H (0x21)
関数 6CH (0x6C または 108) --> 拡張オープンファイル
発信元: AH = 6CH
AL = 00N
BX = オープンモード
ページ数 |
意味 |
0-2 |
アクセスタイプ
000 = 読み取り専用
001 = 書き込み専用
010 = 読み取り/書き込み |
3 |
予約済み (0) |
4-6 |
パブリックモード
000 = 互換性
001 = 読み取り/書き込みを拒否 (すべて拒否)
010 = 書き込みを拒否
011 = 読み取りを拒否
100 = 何も拒否しない |
7 |
継承
0 = 子プロセスがハンドルを継承する
1 = 子プロセスはハンドルを継承しない |
8-12 |
予約済み (0) |
13 |
重大なエラー処理
0 = INT 24H を実行する
1 = プロセスにエラーを返す |
14 |
ライトスルー
0 = 書き込みをバッファリングして延期できる
1 = 要求時に物理的に書き込み |
15 |
予約済み (0) |
CX = ファイル属性(ビットは組み合わせ可能)
無視される場合、開いている場合は、ビット意味表を参照してください。
DX = オープンフラグ
ページ数 |
意味 |
0-3 |
ファイルが存在する場合のアクション
0000 = エラー
0001 = ファイルを開く
0010 = ファイルを置き換える |
4-7 |
ファイルが存在しない場合のアクション
0000 = 失敗
0001 = ファイルの作成 |
8-15 |
予約済み (0) |
DS:SI = セグメント:ASCIIZ パスオフセット
戻り値: m関数が成功した場合
キャリーフラグ = クリア
斧 = ハンドル
CX = 取られた行動
1 = ファイルが存在し、
開いた
2 = ファイルが存在しない
作成された
3 = ファイルが存在し、
交換された
機能が失敗した場合
キャリーフラグ = セット
AX = エラーコード
コメント:
この関数は、指定された ASCIIZ パスの指定されたドライブまたはデフォルトのドライブ上の指定されたディレクトリまたはデフォルトのディレクトリにあるファイルを開く、作成する、または置換し、プログラムがその後ファイルにアクセスするために使用できるハンドルを返します。
パスのいずれかの要素が存在しない場合、またはファイルがルート ディレクトリに作成され、ルート ディレクトリがいっぱいの場合、またはファイルが作成され、指定されたディレクトリに同じ名前で読み取り専用属性のファイルが既に存在する場合、またはユーザーに十分なアクセス権がない場合は、関数は失敗します。