トップ->アセンブラ 第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章-> 第7章.プロセス管理-> 7-7. プログラムの実行2

←前ページへ :  トップへ :  練習問題へ→



7-7. プログラムの実行2(MS-DOS非公開)

  先ほどの練習問題では、わざわざCOMMAND.COMを 呼び出して実行しました。先ほどの例でもおわかりの通り、結構面倒な処理でした。

  また、環境変数を操作する「SET」コマンドは、COMMAND.COMを 呼び出して処理しても、実行したCOMMAND.COM用の環境変数を書き換え、それが 終了すると、書き換えた環境変数も解放されてしまうため、結果として環境変数は 書き換えられていないという事態が起こります。

  そこで、MS-DOS非公開のシステムコールを用いると、常駐しているCOMMAND.COM が直接処理してくれるため、呼び出すのも簡単ですし、環境変数の設定もきちんと処理してくれます。 さらにディスクからCOMMAND.COMを呼び出す処理もないため、実行速度も 速くなりますし、メモリーの節約にもなります。

  ただし、呼び出す前にメモリーを開けておかないと、コマンドを実行できないばかりで なく、COMMAND.COMがエラーを起こします。その後どうなるかは、MS-DOSの バージョンにより異なるようです。

  また、このシステムコールは当然のことながら、「DIR」のような 内部コマンド、「FORMAT.EXE」のような外部コマンド、バッチファイルも 処理してくれ、AX=4B00hのシステムコール」 と違い、PATHも処理してくれるのでお手軽です。なお、外部コマンド、 バッチファイルの場合も、「/C」を書く必要はなく、MS-DOSのコマンド ラインから入力するイメージのまま記入するだけです。


コマンドの実行(MS-DOS非公開)

	DS:SI = コマンド文字列格納アドレス
	INT 2Eh

	戻り値:AL = リターンコード
	    AL,CS以外のレジスタは(SP,SSを含めて)全て破壊されている

  DS:SIはコマンド文字列格納アドレスです。以下のようなフォーマットで指定します。

CODE	SEGMENT
	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
	ORG	100h

START:
	mov	si,offset CMD
	int	2Eh      	;DIR実行

	mov	ax,4C00h
	int	21h       	;プログラム終了

CMD	db	3,'DIR',0Dh

	ENDS
	END	START
; 一部のコンパイラでは、
;CODE	ENDS
;	END	START
;と記述しなければいけないようです
メモリーが足りなかった場合の例

  C:\>INT2E.COM

  メモリ アロケーション エラーです.
  COMMAND を起動できません. 終了します.

  C:\>

  上の例では御大層に「終了します」なんて表示してくれていますが、実は終了せずに きちんとプログラムに戻ってきています。そして、その後の 「AH=4Chのシステムコール」で、終了しています。

  このように正常に実行されなかったとしても、実行されたかどうかをチェックする 手段はありません。(CFでのチェックもできません。) メモリーは多めに確保してあげましょう。

  ちなみに正常に動作するようにするには、

CODE	SEGMENT
	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
	ORG	100h

START:
	mov	bx,offset _END  	;↓自分のメモリを確保するための計算
	mov	cl,4
	shr	bx,cl
	inc	bx              	;↑ここまで
	mov	sp,offset _END  	;SP設定
	mov	ah,4Ah
	int	21h             	;自分のメモリ確保

	mov	si,offset CMD
	int	2Eh             	;DIR実行

	mov	ax,4C00h
	int	21h             	;プログラム終了

CMD	db	3,'DIR',0Dh
	dw	30 dup(?)
_END:

	ENDS
	END	START
; 一部のコンパイラでは、
;CODE	ENDS
;	END	START
;と記述しなければいけないようです


←前ページへ :  トップへ :  練習問題へ→