トップ->アセンブラ 第2章

あなたは

人目のアセンブラの受講生です。

アセンブラ入門内検索

目次

アセンブラ入門

アセンブラ 〜MS-DOSの世界〜 トップ
0. はじめに

1. コマンドラインからの引数
   1. コマンドラインからの引数
   2. 自分の名前は?

2. メモリー管理
   1. 環境変数
   2. 練習問題
   3. メモリーの割り当て
   4. メモリーの解放
   5. UMB
   6. メモリー管理
   7. 常駐プログラム(TSR)

3. 標準入出力
   1. 1文字入力
   2. キーボードバッファー
   3. 1文字出力
   4. 文字列出力
   5. 文字列入力
   6. 練習問題
   7. RS-232C
   8. プリンタ

4. ファイル操作
   1. ファイルオープン
   2. ファイルクローズ
   3. ファイルリード
   4. ファイルライト
   5. 練習問題1
   6. ファイルポインタの移動
   7. 練習問題2
   8. ファイル作成
   9. ファイル属性
   10. ファイル削除
   11. ファイル名変更
   12. ファイル属性の設定・取得
   13. ファイル日時の設定・取得
   14. ファイル検索
   15. 練習問題3
   16. 予約されているファイルハンドル
   17. ファイルハンドルの二重化(リダイレクト)

5. ディレクトリ操作
   1. ディレクトリ操作
   2. カレントディレクトリ変更
   3. カレントディレクトリ取得
   4. ディレクトリ作成
   5. ディレクトリ削除
   6. 練習問題

6. ディスク操作
   1. ディスクのリセット
   2. カレントディスクの取得
   3. カレントディスクの変更
   4. ドライブ情報の取得
   5. 空き容量取得
   6. 練習問題
   7. 交換可能ドライブの検査
   8. リトライ回数の設定
   9. ディスクの直接操作

7. プロセス管理
   1. プログラムの実行
   2. 練習問題
   3. プログラム終了
   4. リターンコード
   5. PSPアドレスの取得・設定
   6. DTAアドレスの取得・設定
   7. プログラムの実行2
   8. 練習問題2

8. その他のシステムコール
   1. 日付の取得・設定
   2. 時間の取得・設定
   3. 割り込みベクタの設定・取得
   4. ベリファイフラグ
   5. MS-DOSのバージョン取得
   6. 国別情報の取得・設定
   7. CTRL + Cの検査
   8. CTRL + Cの処理

9. EMS
   1. EMSとは
   2. EMSを使用するには
   3. EMSが使用可能か?
   4. EMSのバージョン取得
   5. ページフレームのアドレス取得
   6. 未使用ページ数の取得
   7. アロケート、デアロケート
   8. マップ、アンマップ
   9. ページマップのセーブ、リストア
   10. ハンドル数の取得
   11. ハンドルページの取得
   12. 再アロケート
   13. ハンドル名
   14. その他

10. XMS
   1. XMSとは
   2. XMS使用法
   3. XMSバージョンの取得
   4. HMAとは
   5. HMAの割り当て・解放
   6. A20ラインの設定
   7. EMBとは
   8. EMBの空き容量取得
   9. EMBの割り当て・解放
   10. EMBのコピー
   11. EMBのロック・アンロック
   12. EMBハンドル情報取得
   13. EMBの再割り当て
   14. UMBの割り当て・解放

11. エスケープシーケンス
   1. エスケープシーケンスとは
   2. エスケープシーケンス表

12. 終わりに


・ このページの先頭に戻る
・ トップページに戻る



・ このページの先頭に戻る
・ トップページに戻る

トップ-> アセンブラ 第2章-> 第2章.メモリー管理-> 2-6. メモリー管理

←前ページへ :  トップへ :  次ページへ→



2-6. メモリー管理

  ここではMS-DOSがどのようにメモリーを管理しているのかを解説します。

  まずコンベンショナルメモリーの下位には 割り込みベクターがあります。その次に、MS-DOS本体とデバイスドライバーが常駐し、 次にMS-DOSのCOMMAND.COMが常駐します。さらに、常駐プログラム(TSR)があり、空きメモリーと 続きます。

  MS-DOSはメモリーを「所有者」「大きさ」そしてMS-DOS Ver.5.0からは「名前」という 合計16バイトで管理しています。これをMCB(Memory Control Block)といいます。 MCBはOS内に「目次」のように一覧になっているのではなく、COMMAND.COMの常駐している 領域から、MCBに記録されている「大きさ」から次のMCBを探し、次のMCBを探し・・・と 最後まで続けているのです。

  1バイト 2バイト 2バイト 3バイト 8バイト
MCBの内容 識別子 所有者 大きさ ゴミ 名前
識別子が'M'の時は続きがある、'Z'の時はそのMCBで終了という意味
所有者が0の時は、空きメモリー。所有者がある場合は、そのプログラムのPSPのある セグメントアドレスが格納されている。

  一番最初のMCBを見つけるのは面倒なので、通常はCOMMAND.COMの常駐領域を調べて そこからMCBを追っていくという方法が採られています。COMMAND.COMの常駐領域には 「INT 2Eh」という割り込み先があります。したがって「INT 2Eh」の割り込みベクターを 調べて、そこからMCBを追います。割り込みベクターは以前解説したように、 0000:0000番地からあるのでそれを調べればわかるのですが、直接割り込みベクターを 書き換えたりしている最中に割り込みが入ったりすると、コンピュータが誤動作したりするので、 MS-DOSに依頼をして取得したり、書き換えたりします。それには「AH=25h(設定)」 「AH=35h(取得)」を使います


割り込みベクターの設定

	AH = 25h
	AL = 設定したい割り込み番号
	DS = 割り込み先のセグメントアドレス
	DX = 割り込み先のオフセットアドレス
	INT 21h

	戻り値:なし


割り込みベクターの取得 AH = 35h AL = 設定したい割り込み番号 INT 21h 戻り値:ES = 割り込み先のセグメントアドレス     BX = 割り込み先のオフセットアドレス

  これを用いて「INT 2Eh」の割り込み先=COMMAND.COMの常駐先を調べ、 そこから追います。例えば、COMMAND.COMの常駐先のセグメントが1001h番地ならば、 COMMAND.COM常駐領域のMCBのセグメントは1000h番地になります。

  1000h番地のMCBを調べ、大きさのところに「100h」と入っていたら、 次のMCBのセグメントアドレスは1101h番地になります。これを識別子が 'Z'になるまで続ければ、MCBを終えたことになります。UMBがリンクされていれば、 UMBまで追うこともできます。


←前ページへ :  トップへ :  次ページへ→