トップ->アセンブラ 第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章-> 第6章.ディスク操作-> 6-6. 練習問題

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



6-6. 練習問題

問題
  ドライブ番号を入力し、そのドライブのディスクの容量と、空き容量を表示する プログラムを作れ。ただし、無効なドライブ番号を入力されたら、カレントドライブの 情報を表示するものとする。
解答
CODE	SEGMENT
	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
	.386
	ORG	100h

START:
	mov	ah,9
	mov	dx,offset OP_MSG
	int	21h               	;プロンプト表示

	mov	ah,01
	int	21h             	;1文字入力

	and	al,01Fh         	;↓ドライブ番号に変換
	cmp	al,1
	jae	short GETINFO
	cmp	al,1Ah
	jbe	short GETINFO
	mov	al,0            	;↑ここまで
GETINFO:
	mov	ah,36h
	mov	dl,al
	int	21h              	;情報の取得
	cmp	ax,-1
	jnz	DISPINFO
	mov	al,0
	jmp	short GETINFO   	;無効なドライブならカレントドライブ

DISPINFO:
	push	ax
	push	dx
	mov	ah,9
	mov	dx,offset MSG1
	int	21h             	;メッセージ表示
	pop	dx
	pop	ax

	xchg	cx,dx
	pusha
	xor	eax,eax
	xor	ebx,ebx
	xor	ecx,ecx
	xor	edx,edx
	popa                    	;EAX = 1クラスタあたりのセクタ数
                                	;EBX = 使用可能なクラスタ数
                                	;ECX = 1セクタあたりのバイト数
                                	;EDX = 1ドライブあたりのクラスタ数
	mul	edx             	;EDX:EAX = 1クラスタあたりのバイト数
	push	eax
	mul	ecx              	;EDX:EAX = ドライブの全容量
	call	DISP            	;前容量表示

	pop	eax
	mul	ebx             	;EDX:EAX = 空き容量

	push	eax
	mov	ah,9
	mov	dx,offset MSG2
	int	21h             	;メッセージ表示
	pop	eax

	call	DISP            	;空き容量表示
	mov	ax,4C00h
	int	21h

DISP:                           	;↓EAXを10進数で表示するルーチン
	mov	ecx,10
	xor	edx,edx
	div	ecx
	push	edx
	or	eax,eax
	jz	DISPE
	call	DISP
DISPE:
	pop	edx
	add	dl,'0'
	mov	ah,2
	int	21h
	ret


OP_MSG	db	'Input drive : $'
MSG1	db	0Dh,0Ah,'Total Space  : $'
MSG2	db	0Dh,0Ah,' Free Space  : $'
BUFF	db	64,?,64 dup(?)
	ENDS
	END	START
; 一部のコンパイラでは、
;CODE	ENDS
;	END	START
;と記述しなければいけないようです
C:\>DISKFREE
Input drive : A
Total Space  : 1457664
 Free Space  : 609792
C:\>
  ※このプログラムはi386未満のCPUでは動作しません。
  ※約2Gbyte以上では正確な値を表示しません。


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