トップ->アセンブラ 第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章-> 第3章.標準入出力-> 3-6. 練習問題

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



3-6. 練習問題

キーボードから文字列を入力し、アルファベットの小文字があれば、 大文字に変換して、出力するプログラムを作れ。

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

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

	mov	si,dx
	inc	si
	mov	ch,0
	mov	cl,[si]         	;CX ← 入力文字数
	inc	si              	;SI ← 入力文字格納アドレス
	mov	di,si           	;DI ← 入力文字格納アドレス

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

	mov	dx,si            	;DX ← 入力文字格納アドレス

TOUPPER:                        	;↓大文字に変換
	lodsb
	cmp	al,'a'
	jb	TOUPPER_20
	cmp	al,'z'
	ja	TOUPPER_20
	sub	al,20h
TOUPPER_20:
	stosb
	loop	TOUPPER         	;↑大文字に変換

DISP:
	mov	al,0Dh
	stosb
	mov	al,0Ah
	stosb
	mov	al,24h
	stosb                   	;改行コード等挿入

	mov	ah,9
	int	21h             	;表示

	mov	ax,4C00h
	int	21h             	;終了

BUFF	db	41,0,41 dup(?),?,?,?	;入力バッファー
	ENDS
	END	START
; 一部のコンパイラでは、
;CODE	ENDS
;	END	START
;と記述しなければいけないようです
C:\>test
This is a pen.         ←入力
THIS IS A PEN.

C:\>

 さて、ここまで読んでくれた皆さんならばおわかりいただけると思いますが、AH=9の システムコールは、'$'があるとそこで表示が終わってしまいます。つまり「I$ am a boy.」と入力して も「I」としか表示されません。機能拡張として'$'が途中にあっても表示がそこで止まらないようにしてみて ください。

 いくつかのやり方があると思います。AH=9をやめて、表示部[DISP]のところで1文字 出力のシステムコールを使ってLOOPで回すか、[TOUPPER_20]のstosbのところで、もう表示させてしまう か・・・。

 私の個人的な意見を言えば、機能は1つ1つまとめて作った方が後々のために便利ですので前者の方が よいと思います。TOUPPERは大文字の変換部、DISPは表示部として機能は分けた方がよいと言うことです。 もし後者のようにTOUPPERで変換と表示を同時に行おうとした場合、仕様を変更して、表示ではなく文字列 として格納しておきたいと言った場合に、TOUPPERを直さなければならないからです。前者の場合はこのよう な仕様変更があっても、DISPをしなければ何の修正も必要なくなります。このように機能ごとに細かく 分けた方が良いというのは、他の言語にも言えることです。

 しかし、アセンブラでのプログラムは、「プログラムを可能な限り小さくしたい」「実行速度をできる だけ速くしたい」という要望があるからこそ、アセンブラを使うと言う場合があります。このような場合に 上述したようなやり方をするとプログラムが冗長になったり遅くなったりしますので、あえて後者のように 複数の機能を1つにまとめてしまう場合もあります。


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