トップ->アセンブラ 第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章-> 第10章.XMS-> 10-10. EMBのコピー

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



10-10. EMBのコピー

  EMBを使うためには、コンベンショナルメモリーをEMBにコピーしなければなりません。 また、二度目に使う場合(EMBを書き換える場合)はEMBをコンベンショナルメモリーにコピーして、 コンベンショナルメモリーで書き換えた後にEMBにコピーしなければなりません。そのための ファンクションは以下の通りです。

EMBののコピー

	AH = 0Bh
	DS:SI = コピーパラメータを格納しているアドレス
	CALL  FAR [XMS_CALL]

	戻り値:AX = 0000h : コピーに失敗した
	         0001h : 正常にコピーされた

	    AX = 0000hの時
	    BL = 80h : ファンクションのインプリメンテーションが行われていない
	    BL = 82h : A20ラインエラー
	    BL = A3h : SourceHandle(コピーもとハンドル)が無効
	    BL = A4h : SourceOffset(コピーもとアドレス)が無効
	    BL = A5h : DestHandle(コピー先ハンドル)が無効
	    BL = A6h : DestOffset(コピー先アドレス)が無効
	    BL = A7h : Length(コピーするバイト数)が無効
	    BL = A8h : 無効な重複部分がある
	    BL = A9h : パリティーエラー

Length	      DD  ?  ; コピーするバイト数  ←DS:SIでここを指す
SourceHandle  DW  ?  ; コピー元ハンドル
SourceOffset  DD  ?  ; コピー元アドレス
DestHandle    DW  ?  ; コピー先ハンドル
DestOffset    DD  ?  ; コピー先アドレス

  コンベンショナルメモリーのハンドルは0000hです。EMBのハンドルは、EMB割り当ての ファンクションの戻り値です。コンベンショナルメモリーのアドレスは、通常のセグメントと オフセットアドレスです。EMBの場合は、普通の16進数で指定します。Lengthはコピーしたい サイズをバイト単位で指定します。

  強制ではありませんが、アドレスは偶数番地から偶数番地へコピーし、かつLengthが 偶数の場合は、処理速度が速くなります。80386以上の場合は、4の倍数のアドレスから、 4の倍数のアドレスへ、かつLengthが4の倍数の場合は、さらに処理速度が速くなります。 (MS-DOS付属のHIMEM.SYSの場合。サードパーティー製のドライバは不明です。)

  このファンクションは、EMB→EMB、EMB→コンベンショナルメモリー、コンベンショナルメモリー →EMB、コンベンショナルメモリー→コンベンショナルメモリーのいずれにも対応しています。

  転送元と転送先が重複する場合は注意が必要です。下位アドレスから上位アドレスに コピーされていきます。これは指定できませんので、上位アドレスから、下位アドレスに むけてコピーはできません。

  コンベンショナルメモリー間のコピーを例に取ると、8000h:0000hから7000h:0000hへ 1000hBytesコピーする場合には重複していないので問題ありません。しかし、7000h:0000hから 7000h:0010hへ20hBytesコピーする場合(下図上段)、7000h:0000hから7000h:000Fhの内容が 7000h:0010hへコピーされ、7000h:0010h〜7000h:001Fhが上書きされます(下図中段赤字)。 その後、7000h:0010h〜7000h:001Fhがコピーされるので、正常にコピーされません(下図下段赤字)。

  下記に、EMBコピーのサンプルサブルーチンを紹介します。

;+--------------------------+
;|EMB移動                   |
;+--------------------------+
;|in  bx:ax =size           |
;|in  cx    =source handle  |
;|in  ds:si =source address |
;|in  dx    =dest   handle  |
;|in  es:di =dest   address |
;+--------------------------+
COPY_EMB:
	mov	bx,offset EMB_MOVE_STRUCT
	mov	[ds:bx+08],ds			;source segment
	mov	[ds:bx+00],ax			;length(下位)
	mov	[ds:bx+02],bx			;length(上位)
	mov	[ds:bx+04],cx			;source handle
	mov	[ds:bx+06],si			;source offset
	mov	[ds:bx+10],dx			;dest   handle
	mov	[ds:bx+12],di			;dest   offset
	mov	[ds:bx+14],es			;dest   segment
	mov	si,bx
	mov	ah,0bh
	callf	XMS_CALL
	or	ax,ax
	jz	short @@
	clc
	ret
@@:	stc
	ret
EMB_MOVE_STRUCT	dw	8 dup(?)

;例)8000h:0100hから7000h:0200hへ1000hBytesコピーする場合 mov ax,8000h mov ds,ax mov si,0100h ; DS:SI = SourceOffset mov ax,7000h mov es,ax mov di,0200h ; ES:DI = DestOffset xor bx,bx mov ax,1000h ; Size = 1000h Bytes xor cx,cx ; SourceHandle xor dx,dx ; DestHandle call COPY_EMB ; Copy
;例) MS-DOSが使用できる1Mバイト分のメモリーをEMBにコピーする xor ax,ax mov bx,10h ; Size = 1MBytes xor cx,cx ; SourceHandle = 0 mov ds,ax xor si,si ; SourceOffset = 0000h:0000h mov dx,[cs:EMB_HANLDE] ; dx = Handle of EMB mov es,ax xor di,di ; DestOffset = 00000000h call COPY_EMB


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