トップ->アセンブラ 第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章-> 第2章.メモリー管理-> 2-3. メモリーの割り当て

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



2-3. メモリーの割り当て

  MS-DOSでは通常1MBytesのメモリーを管理できる。しかしその中にはVRAMやROMなどの 領域も含まれており、MS-DOS自身とユーザーが使えるメモリーは640KBytes弱になって しまう。より多くのメモリーを使いたいという要望から、UMBEMSXMSなどのメモリー管理方法が 提唱され、1MBytesの壁を破ってきた。これらについては後で説明する。

  ここでは、通常の640KBytesのメモリーを使う方法を説明する。メモリーはすべて OSが管理しており、プログラマーは使いたいときにOSに借りる。これはMS-DOSに限らず、 MS-WindowsやMac OS、N88-BASICも同じである。(管理の仕方は異なるが。)(組み込み系 OSのリアルタイムOSはそのOSによるらしい)

  MS-DOSが管理しているメモリーを借りるためにはMS-DOSにお願いしなければならない。 それにはAH=48hのシステムコールを使う。これにはBXに 借りたいメモリーの大きさを16バイト単位で入れる必要がある。(1000hバイトなら、 BXには100hを入れる。)また、割り当てたメモリーはどんな値が入っているかわからない ので、必要によって初期化する必要もある。

  ただし、現在実行中のプログラムがCOMファイルの場合、そのプログラムが空きメモリーを すべて使用している。そこでプログラムが使用しているメモリーの大きさを変更してやらなければ ならない。通常COMファイルは64KBytesあれば十分なプログラムが多い。それ以上使いたい場合は 上で説明したように、メモリーを割り当てて使う。したがって64KBytesに減らしてやればよいことに なる。しかし、普通のプログラムは64KBytesも使うことはないので、それ以下(プログラムの大きさ +PSPの大きさ(100hBytes+スタックの大きさ)にする。COMファイルの場合、SPの値がデフォルトで 0になっているため、SPの値も変更しないと他人が使っているメモリーを知らないうちに破壊して しまう場合がある。そこで、SPを適当に変更してからメモリーの大きさを変更する必要がある。



メモリーの割り当て

	AH = 48h
	BX = 使いたいメモリー(バイト) ÷ 16
	INT 21h

	戻り値:CF = 0 の時 → AX : 割り当てられたメモリーのセグメントアドレス
	    CF = 1 の時 → AX = 08 :メモリーが足りない
	                BX      :割り当て可能な最大メモリー(バイト) ÷ 16

メモリーの変更 AH = 4Ah BX = 新しいメモリーの大きさ(バイト) ÷ 16 ES = 変更するメモリーのセグメントアドレス INT 21h 戻り値:CF = 0 の時 → 正常に実行された     CF = 1 の時 → AX = 07 : メモリーの所有者でない           AX = 08 : 空き容量がない           AX = 09 : OSの管理外

  以下に1000hバイトのメモリーを確保するCOMファイルの例を示す。
CODE	SEGMENT
	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
	ORG	100h

START:

	mov	sp,offset _END  	;スタック領域を変更
	mov	bx,offset _END  	;↓自分自身のメモリーを
	mov	cl,4            	; いくつにすればよいか
	shr	bx,cl           	; 計算する
	inc	bx              	;↑
	mov	ah,4ah
	int	21h             	;メモリー変更

	mov	ah,48h
	mov	bx,1000h / 16
	int	21h             	;メモリー割り当て
	jc	ERR01           	;エラーか?
	mov	es,ax
	call	DISP            	;割り当てたセグメント表示
	mov	ah,9
	mov	dx,offset MSG01 	;メッセージ表示
	int	21h
	mov	ax,4C00h
	int	21h             	;終了

ERR01:                            	;エラールーチン
	mov	ah,9
	mov	dx,offset ERRMSG01
	int	21h
	mov	ax,4CFFh
	int	21h

DISP:                           	;セグメント表示
	mov	cx,10h
	xor	dx,dx
	div	cx
	push	dx
	or	ax,ax
	jz	DISPE
	call	DISP
DISPE:
	pop	dx
	add	dl,'0'
	cmp	dl,'9'
	jbe	DISPE10
	add	dl,7
DISPE10:
	mov	ah,2
	int	21h
	ret

MSG01   	db	'が確保できました',0Dh,0Ah,24h
ERRMSG01	db	'空きメモリーがありません',0Dh,0Ah,24h
_STACK  	dw	20 dup(?)	;スタック領域
_END:

	ENDS
	END	START
; 一部のコンパイラでは、
;CODE	ENDS
;	END	START
;と記述しなければいけないようです
実行例
 C:\>TEST.COM
 11C5が確保できました

 C:\>


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