トップ->アセンブラ 第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章-> 第10章.XMS-> 10-4. HMAとは

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



10-4.HMAとは

  アセンブラ入門で一番最初に学んだセグメントの概念を 思い出してください。16bitレジスタで20bitのアドレスを表現するために、セグメントと、オフセット というものを用いました。これはオフセットアドレスとセグメントアドレスをずらして足すという ものでした。

  そこでちょっと考えてください。1MBytesで一番上位、すなわちFFFFFhを表すためには、 [F000h:FFFFh]と表します。また、[FFFFh:000Fh]とも表せます。では、[FFFFh:0010h]という アドレスは、どこを指すのでしょうか?

  これはCPUによります。8086, 80186(, V30)では、これは[00000h=0000h:0000h]を指します。 つまり、1周して、最初に戻ってしまうわけです。(これをメモリーラップあるいはラップアラウンド と言います。) ところが、80286以上のCPUでは、 [10000h=FFFFh:0010h]を指します。すなわち1MBytes以上のメモリー空間に、MS-DOSから 直接アクセスできることを表します。

  したがって、MS-DOSから直接アクセスできる最大のメモリーは、[FFFFh:FFFFh]、すなわち [10FFEFh]番地までです。したがって、FFEFh=65519バイトだけ余計に使えるのです。そして この65519バイトの領域をHMAといいます。

  しかし、このHMAは80286以上であれば、どんな場合でもアクセスできるわけではありません。 80286以上のCPUに存在するアドレスバス32本のうち、21番目のアドレスバスが有効になっていないと 使用できません。この21番目のアドレスバスのことを「A20ライン」と呼びます。80286以上の CPUでもA20ラインが無効だと、8086などと同様にラップアラウンドして、メモリーの下位に 戻ってしまいます。逆にA20ラインが有効だと、HMAにアクセスできます。このA20ラインの 有効化、無効化はXMSドライバーのファンクションを使用します。


  コンベンショナルメモリーの管理は、セグメント単位で行っていました。しかし HMAはセグメント単位で管理ができません。なぜならばセグメントアドレスはFFFFhと 決まってしまっているからです。また64KBytes弱という、それほど大きくないメモリーを 、何人かで共有できるようにMS-DOSを改良すると、その分MS-DOS自体が使用するメモリーが 大きくなってしまい、本末転倒になってしまうため、「HMAは基本的に1人しか使用できない」 という仕様にしました。

  「基本的に」と言うのは、「1人」と限定するとあまりにも不親切なため、簡単な チェックでHMAの管理をしているからです。しかし、HMAを何人かで使用するのは、 不具合が生じる原因になるようです。また、デバイスドライバーや常駐プログラムは 何人かで使用できますが、アプリケーションはHMAが誰も使っていない場合にしか使用できません。

  ちなみにHMAを一番効率よく使用しているのは、MS-DOS自身をHMAに常駐させるときの ようです。


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