トップ->アセンブラ 第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-2. 練習問題2

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



7-8. 練習問題2

問題
  プロンプトを表示し、コマンドを入力させる。入力されたコマンドを 実行し、「exit」と入力されるまで繰り返すプログラムを作れ。イメージ的には、 MS-DOSのコマンドプロンプトと同じようなものである。
解答
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	ah,9
	mov	dx,offset MSG1
	int	21h             	;メッセージ表示

MAIN:
	mov	ah,19h          	;↓プロンプト作成
	int	21h             	; カレントドライブ
	add	al,'A'
	mov	PROMPT,al

	mov	ah,47h
	mov	dl,0
	mov	si,offset PROMPT +3
	int	21h             	; カレントディレクトリ

	mov	di,si
	mov	cx,64
	mov	al,0
	repnz	scasb
	mov	[di-1],byte ptr '>'
	mov	[di]  ,byte ptr '$';↑プロンプト作成

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

	mov	ah,0Ah
	mov	dx,offset BUF
	int	21h             	;文字列入力

	mov	cx,4            	;↓入力文字が'exit'か?
	mov	si,offset BUF + 2
	mov	di,offset _EXIT
CHK_EXIT:
	lodsb
	and	al,0DFh         	; 大文字に変換
	cmp	[di],al
	jnz	CHK_END
	inc	di
	loop	CHK_EXIT
	lodsb
	cmp	al,20h
	ja	CHK_END
	jmp	short BYEBYE       	;↑ここまで
CHK_END:

	mov	ah,6
	mov	dl,0Dh
	int	21h
	mov	dl,0Ah
	int	21h             	;改行

	mov	_SS,ss
	mov	_SP,sp
	mov	si,offset BUF +1
	int	2Eh
	cli 	                	;割り込み不可
	push	cs
	pop	ds
	push	cs
	pop	es
	mov	ss,_SS
	mov	sp,_SP
	sti	                	;割り込み許可

	mov	ah,6
	mov	dl,0Dh
	int	21h
	mov	dl,0Ah
	int	21h             	;改行

	jmp	short MAIN

BYEBYE:
	mov	ah,9
	mov	dx,offset MSG2
	int	21h

	mov	ax,4C00h
	int	21h

INT23:		                	;新しいCTRL +C の処理
	iret

MSG1	db	0Dh,0Ah,'いらっしゃいませ。。。',0Dh,0Ah,24h
MSG2	db	0Dh,0Ah,0Ah,'さようなら。。。',0Dh,0Ah,24h
_EXIT	db	'EXIT'
PROMPT	db	?,':\',64 dup(?)
BUF	db	100,100 dup(?)
_SS	dw	?
_SP	dw	?
	dw	30 dup(?)
_END:

	ENDS
	END	START
; 一部のコンパイラでは、
;CODE	ENDS
;	END	START
;と記述しなければいけないようです
C:\>ESHELL			←実行

いらっしゃいませ。。。
C:\>COPY ESHELL.ASM A:		←「COPY」実行
        1 個のファイルをコピーしました.

C:\>CD WINDOWS			←「CD」実行

C:\WINDOWS>
C:\WINDOWS>EXIT			←終了

さようなら。。。

C:\WINDOWS>


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