MSIDOS
ア クロアセ ンブ ラを利用 して( 冒 )
‑ 常 駐 プ ロ グ ラム を強 制 解 放 させ るプ ロ グ ラム ‑
行 方 常 幸
目 次
1
.′は じめに2. MS‑DOS
のメモ リ状態3.
常駐プログラムの強制解放の方法4.
おわ りに5.
付録 (ソースプログラム)1
.は じめに科学技術 の発達 に伴 い我 々が利用可能 な機器 の性能 も向上 して きて いる。例 えば, 私 の研究室 にあ るパ ーソナル コンピュータに関 して言 えば, 本体
NEC
PC‑ 9 8 0 1 VX 2 1 ,
外付 けの4 0M
バ イ トの‑ ー ドデ ィスク, (ラムデ ィスク,EMS
等 に利用可能 な)増設 メモ リ等が完備 され,利用環境 は飛躍的 に向上 して いる。 以前 は利用す るソフ ト毎 に フロッピーデ ィスクを取 り替 えた り,辞書 を フロ ッピ‑デ ィス クにいれて いたため, 日本語 を利用す ると大変 時間がかか る,等今か ら考 え ると不便 な状況であ った。今で は, よ く利用す るソフ トや辞 書 を‑ ー ドデ ィスクにあ らか じめ コピー してお くことによ り, デ ィス ク‑のアクセス時間 を減少 させ る ことが出来 る。 また,バ ッチ ファイルを作 った り, デ ィスクメイ ト等市販 の ソフ トを利用 した りす ることによ り,違 うソフ トを利 用す る毎 に リセ ッ トす る必要 がな くな った。 このよ うに以前 に比べれば利用環 境 は非常 に良 くな ったのだが, やは り以下 のよ うな不都合 な点 が存在 す る。す なわち,常駐 プ ログラムが存在す るために,
MS‑ DOS
が利用可能 なメモ リが減 少 し, ソフ トが起動で きないのであ る。具体的には,直結 ボー ドを利用 して, 例 えば メール ラ ンナーを利用 した後 に, (直結 ボー ドで 情報処理 セ ンターとつ〔 1 0 9 〕
110
商 学 討 究 第4 0
巻 第4
号ないだためにプ ログラムがメモ リ上 に常駐終了 し)一太郎が起動 で きない。 そ こで, この常駐 プ ログラムを強制的 に解放 す るプ ログラムを作成 した。素人が つ くった ものであ り, また後 で述 べ るように全ての常駐 プ ログラムに対応 で き ているわけではないが,私が困 って いた点 には対処 で きているよ うで,今め と
ころ不都合 な ところは生 じて いない。
2. MS‑DOS のメモ リ状態
この節 で は 「
1
. は じめに」 で指摘 した不都合 な点 を具体的 に述 べ, それに 関連 したMS‑DOS
の事項 を説明す る。MS‑DOS
で は6 4 0 K
バ イ トの メモ リを利用 してユ ーザーのプ ログラムを実 行 している。 この6 4 0 K
バ イ トの うちMS‑ DOS
自身や, 日本語 フロ ン トエ ンドプ ロセ ッサ, ラムデ ィスクなど, デバ イス ドライバが利用す る部分 を差 し引 くと, ユ ーザ ープ ログ ラムが利用 で きるメモ リは大分少 な くな る。例 えば, (図
.1)
のよ うにCONFI G.SYS
を設定 した場合,残 りが4 4 5 5 8 4
バ イ トとなる。 この時点 で一太郎 は起動 で きるが,直結 ボー ド経 由でメール ランナー等 を 利用 して 情報処理 セ ンターと接続す ると, プ ログラム
TCPBI OS.EXE
が常駐 終了す るため, 利用可能 なメモ リの残 りが4 2 5 7 9 2
バ イ トとな り, この時点 で は,一太郎 は起動 で きない。 もちろん少 々の時間の消費 を厭 わず, リセ ッ トボ タンを押せば良 いのだが,l私 の場合何か うまい方法で これを回避 で きないかを 考 え るのに多大 な (無駄 な?)時間を消費 して しま っている。この回避方法 と し てまず2
つが考 え られ る。(1)は何 らかの方法でユーザープログラムが利用可能 なメモ リを増 やす こと,( 2 )
は情報処理 セ ンターと通信す るときにだけ必要 な, すなわちほとん ど不必要 な,特 に一太郎 を利用す るのには不必要 な常駐 プ ログラムを メモ リ上 か ら追 い出 して や る こと, で あ る。 この常 駐 プ ログ ラム は
4 4 5 5 8 4
バイ トの うち1 9 7 9 2
バ イ トを占有 して しま っている。(1) 利用可能なメモ リを増やす ことに関 して
MS‑ DOS
で6 4 0 K
バ イ トを越 え るメモ リを利用 す る手段 と して注 目を集 めてい るEMS( Expande dMe mor ySpe c i f i c at i on)
を利用す る。 具体的 にMS‑DOSマ クロアセ ンブラを利用 して( 3 )
図.1 CONFI G.SYS
の内容 と使用可能 メモ リ1 11
CONFⅠ G.SYS
の内容 .BUFFERS ‑2 0
FⅠ LES ‑2 0
DEVI CE‑PRI NT. SYS/U
DEVⅠ CE‑RAMDⅠ SK. SYs2 0 4 81 0 2 4
DEVⅠ CE‑ATOK7 A. SYS / D‑A: ¥ATOK7 LDⅠ C / G‑A: ¥J SFONT¥J FGAⅠ J . UFO / M‑ 0/ E‑1/ R‑0/ C‑0′ B‑0/ S‑1/ 0‑0/ T ‑1 1 1 1
DEVⅠ CE‑ATOK7B. SYS
SHELL‑A: ¥COMMAND. COM A: ¥ / E: 6 4 0 ′P
CHKDS
655360K
バ イ トで使用可能 メモ リを調べ ると:全 メモ リ445584バ イ̲ト :使用可能 メモ.リ この時点では、一太郎を起動できるo
メ‑ル夕‑ムを起動、終了後655360バ イ ト :全 メモ リ
CHKDSK
で使用可能 メモ リを調べ ると112
商 学 討 究 第4 0
巻 第4 号
は
,EMS
対応 の増設RAM
ボー ド (‑ ー ドウェア)とこれを利用す るデバ イ ス ドライバ EMM ( Expande dMe mor yManage r )
(ソフ トウェア)を購入 す る。 これ はどのよ うなユ ーザ ープ ログラムに も利用 で きる もので はない が, 今問題 にな っている一太郎 はEMS
に対応 してい る。 このEMS
を利用 す るとATOK7
が拡張 メモ リ上 に組 み込 まれ, ユ ーザープ ログラムか利用 可能 な メモ リは5 0 41 28
バ イ トに増加 す る。 常駐 プ ログラムは1 97 9 2
バ イ ト占有 す るのだか ら,
5 0 41 2 8‑1 9 7 9 2‑ 48 43 3 6
バ イ ト>4 4 5 5 8 4
バ イ トを考慮 すれば常駐 プ ログラムが存在 して も一太郎 は起動で きそ うである。普通 な ら そ うなるのだろ うが,私 の利用 しているパ ソコン環境 では うま くいかない。(図.
2
参照)直結 ボー ド,外付 けの‑ ‑ ドデ ィス ク,EMS
,一太郎 を一度 に 利用で きないのであ る。( 2 )
常駐 プ ログラムをメモ リ上か ら追 い出すことに関 してMS‑DOS
で は6 40K
バ イ トの主記憶 は貴重 な もので, この メモ リを有効 に利用す るよ うにと, マ ウスや 日本語 フロン トエ ン ドプロセ ッサ等 を必要 な ときに利用 で き, 必要 でな くな った とき取 り外す よ うにで きるADDDRV
,DELDRV
があ る。 また, バ ックグラウ ン ドでプ リン トさせ る代表的 な常駐 プ ログラムPRI NT.EXE
は「 PRI NT /R
」とす ることで,常駐部分 を解放 で きる。 このよ うに常駐 プ ログラムを不必要 な ときは解放 して, メモ リを有効 利 用 で き る こ とが望 ま しい。 こ こで 問 題 とな って い る常 駐 プ ロ グ ラムTCPBI OS. EXE
はそれ 自身 で常駐部分 を解放 す る機能 を持 っそ い るか ど う か は不明であ るが,強制的 に解放 して も異常 がなければ, メモ リの有効利用l のた叫 こは望 ま しい ことと思われ る。3.
常 駐 プ ログ ラム の 強 制 解 放 の 方 法常駐 プ ログラムを強制的 に解放 す るにはどうすればよいか? このプ ログラム が利用 して いたメモ リ領域 を解放 す ることは もちろんであるが, その他, この プ ログラムによ って変更 された システムの資源 の状態 を復元する必要がある。
今 の場合,常駐 プ ログラム
TCPBI OS.EXE
が どの資源 を利用 してい るかが分MS‑DOS
マクロアセ ンブラを利用 して( 3)
図. 2 EMS
113
EMS
は最大3 2M
バ イ トまで増設 で きる拡 張 メモ リを主記憶 内の6 4 0K
超ー 1 M
にあ るペー ジフ レームを介 してアクセスで きるよ うに した ものであ る。ペ ー ジフ レーム内の物理 ペー ジに アクセスす ることが実 は拡 張 メモ リ内 の論理 ペー ジにアクセスす ることにな ってい るのが、‑ ー ドウェア
EMS
、ペー ジフ レーム に もメモ リが存在 し、物理 ペー ジと論理 ペー ジの内容 を転送す ることによ り交換 し ているのが、 ソフ トウェアEMS
である。上 図 は‑ ー ドウェア
EMS
であ るI OS‑1 0EMS
の もので、 ペー ジフ レームと し てCOOOO 〜DFFFF
の最大8
ペー ジ分指定 で きる。私 のパ ソコ ン環境 の場合、外付 けの‑ ー ドデ ィスク用 のために
D4000‑D7FFF
を、情報処理 セ ンター と直結 ボー ドでつ な ぐ場 合 はCdooo〜C7FFF
をペ ー ジフレームと して利用す ることがで きない. その結果 ペー ジフレームと して は
、C8000
‑D3FFF
の3
ペー ジとD8000‑DFFFF
の2
ペー ジ合計5
ペー ジ利用 で きること にな る。 ところが多 くのEMS
対応 アプ リケー ション (一太郎 も含 む) はペー ジフ レームと して連続4
ペー ジ分 を必要 とす る。 このため、私 の環境 では外付 けの‑ ー ドデ ィスク、直結 ボー ド、EMS
、一太郎 を一皮 に利用で きないのであ る.11 4
商 学 討 究 第4 0
巻 第4 号
か らないので何を復元すべ きか正確 に知 ることは不可能 である
。
そ こで,私 は 割 り込みベク トルだけを復元 してみた。結果 はうま く動作 したのだが,私がそ の後 に出会 った文献 [1]( TURBO C
を利用 して多 くの常駐 プ ログラムが作 成 されている) によると少 な くともあと1
つ復元 した方がよいよ うである。すなわち,
(1) 常駐 プログラムが使用 していたメモ リ領域 の解放
( 2 )
常駐 プログラムが占有 していた割 り込 みベク トルの復元 (3) 割 り込 み コン トローラのマスクめ復元( 2 ) ,( 3 )
に関 しては常駐 プログラムを起動す る前 に割 り込みベク トル全てと割 り 込みコントローラのマスクの内容を保存 し,常駐 プログラムを利用 した後,また復 元すればよい。(1)に関 しては(図.3)
を参考 に して,常駐 プログラムを起動す る前 のメモ リコン トロールブロックの状態を保存 し,常駐 プログラムを利用後 もう一 度 メモ リブロックの状態 を調 べ,保存 した状態 と違 うメモ リブロックを解放すれ ばよい。ここで, 1
つだけ問題点がある。それは(図. 3 )
のSEGl
に対応す るメモ リコ ン トロールブロックのセグメ ン ト値 をどのように知 るか ということである。文献[ 1
]では,非公開のファンクシ ョン5 2 H
を利用 しているが,ここではCOMMAND.
COM
を実行す るだけの見かけ上 のコマ ン ドプロセ ッサMYCOM.COM
を作 り, そのPS P
のセグメ ン ト値 を保存す る。「(
この値)‑1」がS EGl
である。以上 をまと めると(図.4
及び付録参照),MYCOM. COM :COMMAND. COM
を実行す るだけの見かけ上 の コマ ン ドプ ロセ ッサ自分の PSP
のセグメント値をフ
ァイル A:¥MYSAVE.榔缶に書 き込 む READMEM.EXE:A: ¥MYSAV
E.袋路を読 み込 み自分が実行 されているときの
MCBの状態 割 り込 みベ ク トル
割 り込 み コン トロー
ラのマスクの
状態 を A:¥MYSAVE.$1 に書き込む
MS‑DOS
マ クロアセ ンブラを利用 して(3 )
図.3 MS‑DOS
の メモ リ管理 とメモ リブロ ックの解放115
メモ リコ ン トロール プヮック
( 1 6
バ イ ト)0 1 3
メモリコントロールブロック
( MCB3)
メモリコントロールブロック
( MCB2)
メモリコントロールブロック
( MCBl )
オーナー
I D
ブロ ックサ イズマ ク :
4D
継続す るメモ リブロ ックが存在 す る ことを示す5A
この メモ リブロ ックが最後 で あ ることを示すオ ー ナ ー
ID :
この メモ リブロ ックを管理 す るプ ログ ラムのPSP
の先頭 の セ グメ ン トア ドレス0 0 0 0
な らフ リー領域 で あ ることを示 す ブロ ックサイズ : メモ リブロ ックの大 きさ上 図 において、
MCB
lとMCB2
のマー クは4D
でMCB3
のマ ークは5A
であ るSEG2‑SEGl+ ( MCB
l中の ブロ ックサ イズ)+ 1 SEG3‑SEG2+ ( MCB2
中の ブロ ックサイズ)+ 1
例 えば、MCB
lの メモ リブロックを解放 す るには、ES‑SEGl+ 1 AH‑ 49H
と して
I NT 21H
とす る116
商 学 討 究 第4 0
着 第4 号
図.
4
ファイル A:¥MYSAVE. ‡粥
とA: ¥MYSAVE. S‡1
A: ¥MYSAV
E.SSSの内容0 2 4 6 8
A C DE
A:
(ア) 用 さEM.
(ア):
MYSAVE. COM
のPSP
のセ グメ ン ト値 (図.3)
のSEG1
‑ (この値)‑ 1
MYSAV
E.SSSはMYCOM. COM
が作 成、 READMEM. 丘ⅩE
とREVM EXE
で利用A: ¥MYSAVE. S$1
の内容0 2 4 6 8 A C D E
A: ¥
(イ).. (ウ) (エ) ・オ,II(*)
0 0 0 0
■(辛) ・ク, I (ケ, )MCB
情報 が続 く (何バ イ トになるか ば事前 には不明)(イ):
READMEM. EXE
のPSP
のセ グメン ト値( REVMEM. EXE
で は利 れない)(エ): 割 り込 み コン トp‑ ラ (マスタ) のマ̲スクの値 (オ): 割 り込 み コン トロ‑ ラ (ス レーブ)のアス クの値
(辛)、(ク)、(ケ)は (図.
3)
のMCB
の最初 の 串バ イ ト、す なわ ち (辛):̲マーク(ク): オーナー
Ⅰ D
(ケ): ブロックサイズ
(カ): (辛)、(ク)、(ケ)の
MCB
のセ グメ ン ト値このメモ リブロックを解散す るために必要
MS ‑ DOS
マクロアセンブラを利用 して( 3) 117 REVMEM.EXE : A: ¥MYSAV
E.発給とA: ¥MYSAV
E.王防1
を読 み込 み自分が実行 されているときの
MCB
の状態 を調べ,A: ¥MYSAV
E.SH B
lに保存 されていた もの と異 なるメモ リブロックを解放 し,割 り込みベ ク トル,割 り 込 み コン トローラのマスクを復元す る。以上,常駐 プログラムを強制的 に解放す る方法 の概略を説明 した。
私 の利用方法 は次のよ うである (図.
5
参照)0 A
:ドライブ (ハー ドディスク)のルー トディレク トリに
MYCOM. COM
とCONFI G. SYS
を置 き,PATH
指定 され て い るデ ィ レク トリにREADMEM.EXE
とREVMEM.EXE
とMAI L. BAT
を入れてお く。パ ソコンの電源 と,情報処理 セ ンターと直結 ボー ド で接続す るための専用電源ユニ ッ トの電源 を別 に してお く。 メール ランナーを 利用す る可能性があるときは, 両方 の電源を入れMS‑DOS
を起動す る。 メー ルランナーを利用 しない場合 は, パ ソコンの電源だけを入れMS‑ DOS
を起動 す る。後者の場合 は,情報処理 セ ンターと接続で きないが,EMS (4 M
バイ ト)は利用で き
ATOK7
は拡張 メモ リに組 み込 まれ (利用可能 メモ リ5 0 2 9 1 2
バ イ ト)一太郎 の機能が十分 に利用で きる。前者 の場合 は,EMS
は利用で きないが (利用可能 メモ リ4 3 8 6 8 8
バイ ト)「 MAI L<CR>」
とバ ッチファイルを起動す ることで メールランナーを利用で き,かつ メール ランナー利用後 も一太郎を起 動で きる。利用可能 メモ リ4 3 8 6 8 8
バイ トが「2. MS‑DOS
のメモ リ状態」で述 べた4 4 5 5 8 4
バイ トより少 ないのはEMM ( EMM 4 J . SYS)
をCONFI G.SYS
で指定 したためである。
情報処理 セ ンターと直結 ボー ドで接続す るための専用 電源ユニ ッ トに も電源 を入れ ると,CONFI G.SYS
で指定 したEMS
のペー ジフレームの うち
COOOO〜C7FFF
が重 な り不都合が生 じそ うであるが, 今の と ころ不都合 はないよ うである。4. おわ りに
ここで作成 した,常駐 プログラムを強制的 に解放す るプ ログラムは割 り込 み ベ ク トル と割 り込 みコン トローラのマスクの内容だけを復元 しているので, そ のほかの システムの資源を利用 しそれを復元 しなければ不都合が生 じるよ うな
11 8
商 学 討 究 第4 0
巻 第4 号
図.5
私 の利 用方 法CONFⅠ G.SYS
の内容DEVⅠ CE ‑ EMM4J .SYS ′ W‑CO ,C4,C8,c c ,DO,D8,DC / ∫ BUFFERS‑2 0
FⅠ LES‑2 0
DEVⅠ CE‑RAMpⅠ SK.SYS2 0 4 81 0 2 4 DEVⅠ CE‑PRI NT.SYS / U
DEVⅠ CE‑AT‑ OK7 A .SYS / D ‑A: ¥ATOK7 L .DⅠ C ′ G‑A: ¥J SFONT¥J FGAⅠ J . UFO /M ‑0 ′ E ‑1 / R ‑0 / C ‑0 / B ‑0 ′S ‑ 1/ 0 ‑0 ′ T ‑1 1 1 1
DEVⅠ CE‑ATOK7B.SYS
SHELL‑A: ¥MYCOM. COM A: ¥COMMAND. COM A: ¥ / E: 6 4 0 /P MAI L BATの内容
e c hoof f
ラムでr e adme m ここで復元すべ きデータを フ ァイルに保存 SAVEDDⅠ R カ レン トドライブ、 デ ィレク トリを保存
A: ドライ ブと
c d¥MAⅠ LTERM¥t c pi p デ ィレク トリを変更 ADDDRV MAⅠ LDRV.DAT マウスを利用可能 にす る l oadni u‑r‑d一m: C . ‑p: 0 ‑i : 2 e t ni us 8 . Xf m ‑ 1 9 5 5 9 a. l c t c pbi os一m: C‑p: 0 ‑i : 2 情報処理 セ ンターとつ な ぐ c d¥MAI LTERM ‑ディレク トリを変更 .us kc gm < us kc g. c a t > NUL 外字 を ロー ド
: LOOP
mt s e t up‑Ⅹ メール タームを起動
Ⅰ FERRORLEVEL lGOTO NEND got oLOOP
: NEND
DELDRV マウスを取 り外 して
RESTDDⅠ R 保存 しておいた ドライブデ ィレク トリに戻 る r e Vme m 常駐 プ ログラムを解放
(荏)
SAVEDD
ⅠR. EXE
とRESTDD
ⅠR. EXE
は私 が作成 した簡単 なプ ログMS‑DOS
マクロアセ ンブラを利用 して( 3 ) 119
常駐 プ ログラムには利用 で きない。5
.付録 (ソースプ ログラム),‑ *‑ *‑ *‑ *‑ *‑ *‑ *‑ *‑ *‑ *‑
;ソースファイルMYCOM.ASM
TITLE
my c o m
TEXTSEGMENTASSUME
c s :
̲TEXT,d s :
̲TEXT,s s :
̲TEXT ORG1 0 0
hs t a r t :j mp s t a r t 2
c o mma n d ̲ i n t e r p r e t e Le r r O rd bOd h , Oa h ,1 b h ,' [ 3 3m
','COMMAND Id b
'INTERPRETER'
d b
'が無効かまたは見つかりません' , Od 九 ,Oa h ,1 b h ,' [ m' c o mma n d ̲ i n t e r p r e t e r ̲ e r r o r 」e n ‑ 3‑ o f f s e tc o mma n d ̲ i n t e r p r e t e r ̲ e r r o r
me ne r r o r d b Od h , Oa h ,1 b h ,' [ 3 3m
','COMMAND Id b
'INTERPRETER 用にメモリが開放できません。Ime n̲ e r r o r ̲ l e n ‑ a IO f f s e tme n̲ e r r o r
e x i te r r o r d b
'COMMAND INTERPRETER から'd b
'抜け出てしまいました。'e x i Le r r o りe n ‑ 恭 一o f f s e te x i Le r r o r
me mb l o c k ̲ e r r o r d b Od h , Oa h ,1 b h ,' [ 3 3m
','メモリの情報を取得出来ませんでした。Id b Od h , Oa h ,1b h ,' [ m'
120
商 学 討 究 第4 0
巻 第4 号 me mb l o c k ̲ e r r o r Je n ‑ 忠 一o f f s e tme mb l o c k ̲ e r r o r
s a v ef i l e d b ' a: ¥my s a v e
.仙 ', 0 0 h
e v e n
d w 6 3d u p ( 0 0 h ) s t a c k ̲ S t a r td w O Oh
c o mma n d ̲ i n t e r p r e t e r d b ‑ 8 0 d u p ( 0 0 h ) p a r a m̲ b l o c k ̲ s t r u c
e n V c md l no f s c md l 刀 ̲ s e g f i bLo f s f c bLs e g f c b2̲ o f s f c b2̲ s e g
p a r a m̲ b 1 o c k ̲ s t r u c W W W W W d d d d d W W d a 加 O ‑h o oh ooh oo ・ h ooh 町 O‑h e
p a r a m‑ b l o c k p a r a m̲ b l わ c k ̲ s t r u c く0 ,0 ,0 ,5 c h ,0 ,6c h , 0>
s t a r t 2:
mo vs p ,o f f s e ts t a c ks t a r t ;
スタックの再設定mo va x ,d s
mo vp s p ,a x ;my c o m
のP S P
のセグメント値を保存mo va h ,3c h
;ファイル( a :¥my s a v e .
SSS)の作成mo vd x ,o f f s e ts a v ef i l e
MS+DOS
マ クロアセ ンブラを利用 して( 3 )
Ⅹ O rC X ,C X i n t2 1h j n cs t a r t 4
mo va h ,4 0h
;標準エラー出力へmo vb x ,2
;エラーメッセージを出力mo vc x ,me mb l o c ke 汀O rl e n
mo vd x ,o f f s e tme mb l o c k ̲ e r r o r i n t2 1h
j mps t a r t 3
mo vb x ,a x
mo vd x ,o f f s e tp s p mo vc x ,t o t a l
mo va h ,4 0h
;ファイル( a:¥my s a v e . S
SS)へi n t2 1h ;my c o m
のPS P
セグメント値を書き込むj n cs t a r t 3
J mpf me m̲ e r r o r
mo v s i ,8 0h
cl
dl o d s b
mo v d i ,o f f s e tc o mma n d ̲ i n t e r p r e t e r p u s h a x
c a l l f i l en a mec md ;my c o m.c o m
のコマンドラインからf me m̲ e
汀O r :
s t a r t 4:
s t a r t 3:
121
122
h a l t :
商 学 討 究 第 4 0 巻 第 4 号
p o p a x
;コマンドインタープリタとオプションをj c h a l t ;取り出す
mo v p a r a m̲ b l o c k .c md l no f s ,s i
mov [ s
i】,a l mO V a X,SI
s u b a x
,80h s u b [ s i ] ,a l
mo v a x ,d s
mo v p a r a m̲ b l o c k .c md l n ̲ s e g ,a x mo v p a r a m̲ b l o c k .f c bLs e g ,a x mo v p a r a m̲ b l o c k .f c b 2 ̲ B e g ,a x mo v b x ,O f f s e te n d 」) r o g r a m a d d b x , 1 5
mo v
cl ,4
s h r b x ,c l a d d b x , l ob
mov a h ,4 a h
;メモリブロックサイズの変更i n t 2 1 h ;e n dp r o g r a m
以下を解放j c h a l t 1
mo v a x
,4b
OOh
;コマンドインタプリタを起動mo v d x ,o f f s e tc o mma n d ̲ i n t e r p r e t e r
mo v b x ,o f f s e tp a r a m̲ b l o c k i n t 2 1 h
j n c h a l t 2
MS‑DOS
マ クロアセ ンブラを利用 して( 3 )
mo v a h ,4 0h
;標準エラー出力へmo v b x ,2
;エラーメッセージを出力mo v c x , c o mma n d ̲ i n t e r p r e t e Le r r
OLl e n mo v d x ,o f f s e tc o mma n d ̲ i n t e r p r e t e r ̲ e r r o r i n t 2 1 h
J mp h a l th a l t
;無限ループmo v a h ,4 0h
;標準エラー出力へmo v b x ,2
;エラーメッセージを出力mo v c x ,me ne
汀Orlenmo v d x ,O f f s e t
men̲errori n t 2 lh J mp h a l th a l t
mo v a h ,4 0h
;標準エラー出力へmo v b x ,2
;エラーメッセージを出力mo v c x ,e x i te r r o rl e n
mo v d x ,o f f s e te x i te r r o r i n t 2 1 h
J mp h a l th a l t h a l th a l t :
h a l t l:
h a l t 2:
e n d 」) r o g r a m:
;入力: d s :s i ,d s :d i d s :s i
‑ 「ファイル名 オプション」の先頭アドレス ,d s :d i
‑バッファの先頭アドレス;出力 :キャリー
,d s :s i
エラーがあれば,キャリーがセットされる1 23
1 24
商 学 討 究 第4 0
巻 第4 号
「ファイル名 オプション」を調べてファイル名をバッファにコピー
d s :[ s i
+1]から 「オプション」が始まるようにするf i l en a mec nd p r o c n e a r c l d
f i l e ̲ n a me ̲ c nd 1 0 :
l o d s b c mp a
l,‥j e f i l e ̲ n a me ̲ C md l O
c mp a l , 0 9 h
j e f i l e ̲ n a me ̲ C nd 1 0
c mp a l , Od 九
j e f i l e ̲ n a me ̲ c md ̲ e n d 1 0
s t o s b f i l e ̲ n a me ̲ c nd 1 5 :
l o d s b c mp a
l,‥j e f i l e ̲ n a me ̲ c md 2 0
c mp a l , 0 9 h
j e f i l e ̲ n a me ̲ c md 2 0
c mp a l , Od h
j e f i l e ̲ n a me l C md 2 0
s t o s b
j mp f i l e ̲ n a me ̲ c nd 1 5
f i l e ̲ n a me ̲ c nd 2 0 :
d e c si
d e c si
c l c
MS‑DOS
マ クロアセ ンブラを利用 して( 3 ) r e t
f i l e ̲ n a me ̲ c nd ̲ e n d 1 0 :
d e c si d e c s i
s t c r e t f i l en a mec md e n d p
t o t a l d w O O I Oh
p s p d w 8 d u p ( 0 0 0 0
h)TEXTENDS
END s t a r t
; * * *‑
;ソースファイル READMEM.AS M
* *
TI TLE r e a d me m DOS S E G
.MODEL S MALL .S TACK 1 0 0
h.DATA
e 汀0 LmS g d b Od 九 ,Oa h ,1 b h ,' [ 3 3m' ,' A:¥MYS AVE .
S‡Sを読めません。Id b Od 九 , Oa h ,1 b h ,' [ m'
e r r o r ̲ ms g ̲ l e n ‑ 3‑ o f f s e t ̲ e r r o r ̲ ms g
o p e n ̲ f i l e wr i t ef i l e my C O m」) S p t o t a l
d b ' a:¥my s a v e . S 心' , 0 0 h d b ' a:¥my s a v e .
岱1' , 0 0 h
d w O O O
Oh;my c o m
のP S P
のセグメント値d w O O I Oh ;A:¥MYS AV
E.S$1に書き込むバイト数125
126
商 学 討 究 第4 0
巻 第4
号p s p d w O O O
Oh ;自分のPSPのセグメント値,以下をA:¥MYSAVE .S S
lにd i s p d w O O O Oh;p s p
から割り込みベクトルまでの距離 書き込むp i e ̲ ma s k ̲1 d b O Oh
,'割り込みコントローラ (マスタ)のマスク値p i c ̲ ma s k ̲2 d b O Oh
;割り込みコントローラ (スレーブ)のマスク値d w 5d u p ( 0 0 0 0 h )
mc b d w 8 0 0 hd u p ( 0 0 0 0 h )
;ここからがmc b
及び割り込みベクトルの;保存領域
.CODE
s t a r t :
mo v d x ,d s mo v a x
,@DATAmo v d s ,a x mO V e S ,a X
mo v p s p ,d x ;r e a d m印
のPSPのセグメント値を保存mo v a x ,3 d O Oh
;読み込むためにファイル( a . ' ¥my s a v e .
SSS)杏mo v d x ,o f f s e to p e n Ji l e
;オープンi n t 2 1h J C e r r o r j mp s t a r t 2
mo v a h ,4 0h
;標準エラー出力へmo v b x ,2
;エラーメッセージを出力mo v c x ,e r r o r ̲ ms g 」e n
mo v d x ,o f f s e te r r o r ̲ ms g i n t 2 1h
mo v a x ,4c f f h
;終了 (リターンコードOf f h )
e r r o r :
MS‑DOS
マクロアセ ンブラを利用 して( 3 ) i n t 2 1 h
mo vb x ,a x
mo va h ,3 f h
;ファイル( a:¥my s a v e . S
SS)から2
バイト読み込むmo vd x ,o f f s e tmy c o m̲ p s p
;これはmy c o m
のP S P
のセグメント値mo vc x ,2
i n t 2 1 h C mpa X , C X J n e 〟e r0
mo va h ,3 e h
;ファイル( a:¥my s a v e .S
SS)のクローズmO Va X ,my C O m̲ p S p d e ca x
mo vd s ,a x ;以下 ,mc b
(メモリコントロールブロック)杏血o vd i ,O f f s e tmc b
;次々と保存する。mo va x ,d s 又 o r Sl ,Sl
mo vb x ,[ s i +
1]c mpb x ,e s :p s p
j e l o o p 2
;自分が管理するmc b
は終了すればs t o s w
;なくなるので保存しないa d dd i ,2
mo vc x ,5 r e pmo v s b a d dd i ,7 s t a r t 2:
l o o p l:
127
1 28
l o o p2:
f 4d
:
f 5a:
商 学 討 究 第 40巻 第 4号
mo va x ,e s
:totala d da x ,l o
bmo ve s :t o
tal,ax
丈 o rb x ,b x mo ' va l ,l b x
]c mpa l ,4d
hj e f 4d c mpa l ,5a
hj e f 5a p u s h e s p o pd s J mPe r r o r
mo vb x ,3 mo va x ,[ b x
]l n Ca X mo vd x ,a x mo va x ,d s a d da x ,d x mo vd s ,a x j mpl o o pl
mo va x ,d i s u ba x ,o f f s e
tpspmo ve s :d i s
p,a x
ーX O ra X , a X
;次に,割り込みベクトルを保存する。MS‑DOS
マ クロアセ ンブラを利用 して(3)mo vd s ,a x
∑ o r Sl ,Sl
mo vc x ,2 0 0h r e pmO V S W
mo va x ,e s :t o t a l a d da x ,4 0 0h mo ve s :t o t a l ,a x
mO Va X ,e S mo vd s ,a x
i n a l ,2
;割り込みコントローラのマスクのmo vp i c ̲ ma s k 」 ,a l
;内容を保存する。i n a l ,Oa h mo vp i c ̲ ma s k ̲2,a l
mo va h ,3c h
;ファイル( a :¥my s a v e .
a$1)
を作成する.mo vd x ,o f f s e twr i t ef i l e 1 又 o rC X ,C X
i n t2 1h j n cs t a r t 3 J mpe r r o r
mo vb x ,a x
;ファイル( a: ¥my s a v e . a$ 1)
へ今までに求めたmo vd x ,O f f s e tp s p
;保存すべきデータを書き込む。mo vc x ,t o t a l mo va h ,4 0h s t a r t3:
1 29
130
商 学 討 究 第4 0
巻 第4
号i n t2 1h
mo va x ,4 c O Oh ;終了 ( リターンコード 0 0 h ) i n t2 1h
END s t a r t
; * * * *
;ソースファイル
REVMEM.AS M
TI TLE r e v me m DOS S E G
.MODELS MALL .S TACK I O Oh .DATA
e r r o r ̲ ms g d b Od h , Oa h ,lb h
,'[ 3 3 m
','¥MYS AVE .
SS?を読めません。Id b Od h , Oa h ,lb h
,'[ m'
e r r o LmS g ̲ l e n‑ノ8‑O f f s e te r r o r ̲ ms g
f r e e ー e r r O r ̲ mS g d b Od h ,Oa
k,1b h
,'[ 3 3 m
','メモリを解放できません。'・d b Od h , Oa k ,1b h
,'[ m'
f r e e ̲ e r r o r ̲ ms g l l e n‑ 3‑o f f s e tf r e e ̲ e r r o r ̲ ms g
o p e n ̲ f i l e d b o p e nLf i l e d b my c o m」) s p d w p s p ̲ n e w d w d i s p ̲ n e w d w mc bn e w d w p s p ̲ O l d d w d i s p ̲ o l d d w p i c ̲ ma s k ̲1 d b
'
¥my s a v e
.男心',0 0h
'¥my s a v e .
淋1' , 0 0 h
O O O Oh ;my c o m
のPS P
のセグメント値0 0 0 0h
;自分のP S P
のセグメント値7d u p( 0 0 0 0 ′ h );p s pn e w
からmc b
の最後までの距離ヰ o ohd u p ( 0 0 0 0 h )
;ここから現在のmc b
が入る0 0 0 0 h;
以下に,A:¥MYS AVE . S港1
の内容を読み込む0 0 0 0 h;
これが復元すべき内容となる0 0 h
MS‑DOSマクロアセンブラを利用 して( 3 ) p i e ̲ ma s k ̲2 d b 8 0 0h
d w 5d u p( 0 0 0 0h ) mc bo l d d w 8 0 0hd u p( 0 0 0 0h
).CODE
;入力: d s :s i ,e s :d i
;出力 :キャリーフラグ
;d s :s i
およびe s :d i
から始まる1 6
バイトの文字列を比較する。;等しいときキャリーフラグがセットされ,等しくないときセットされない.
cmpline proc near push si push di push cx mov cx,lob loplO:
cmpsb loopelop10 JCXZ equal clc
jmp cmplineOIO equal:
stc cmpline010:
pOpCX
popdi ′
popsi ret
1 31
132
c mp l i n e e n d p
;割り込みベクトルを元に戻す。
商 学 討 究 第
4 0
巻 第4 号
r e v v e c t o r p r o c n e a r p u s h e s c l d
mo vs i ,O f f s e tp s p ̲ o l d a d ds i ,d i s p ̲ o l d x o rd i ,d i mo ve s ,d i mo vc x ,2 0 0h r e pmO V S W p O pe S r e t r e v v e c t o r e n d p
;入力: b x ‑ 「 mc b
のセグメント値,mc b
の情報」
;この
mc b
(メモリコントロールブロック)がフリーまたは自分のものではないとき;解放する。
c h e c k me m p r o c n e a r p u s h b p
mo vb p ,[ b x+ 5]
c mpb p ,p s p ー n e W
j e
f0 4 5
MS‑DOSマクロアセ ンブラを利用 して(3)
c mpb p ,0 0 0 0h i e f 0 4 5 mo vb p ,[ b x ] i n cb p
p u s h e s mo ve s ,b p
mo va h ,4 9h
∴ メモリブロックの解放i n t2 1h
j c f r e e ̲ e 汀O r p o pe S
mo va h ,4 0h
;標準エラー出力へエラーメッセージの出力mo vb x ,2
mo vc x , f r e e ̲ e r r o LmS g 」e n mo vd x , o f f s e tf r e e ̲ e 汀O r ̲ mS g i n t2 1h
mo va x ,4c f e h
;終了 (リターンコードOf e h ) i n t2 1h
mo vd x ,d s ml O Va
X, @DATA mo vd s ,a x f O 4 5 :
c h e c k me n
f r e ee r r o r :
s t a r t :
133
134
e r r o r :
s t a r t 2:
商 学 討 究 第
4 0
巻 第4 号 ・
mO Ve S ,a X
mo vp s p ̲ n e w,d 羊:r e v me m
のP S P
のセグメント値を保存mo va x ,3dO Oh
;読み込みのためにファイル( a:¥my s a v e .
SSS)をmo vd x ,o f f s e to p e n Ji l e
;オープンi n t2 1h j C e 汀O r j mps t a r t 2
mo va h ,4 0h
:エラーメッセージの出力mo vb x ,2
mo vc x ,e 汀0 LmS g 」e n mo vd x ,o f f s e te r r o LmS g i n t2 1h
mo va x ,4c f f h
;終了 (リターンコードOf f h ) i n t2 1h
cld
mo vb x ,a x
mo va h ,3f h
,'ファイル( a
.'¥my s a v e . S
SS)から2
バイト読み込むmo vd x ,o f f s e tmy c o m」) s p
;、これはmy c o m
のP S P
のセグメント値mo vc x ,2
i n t2 1h ‑
C mpa X ,C X
J n e e 汀O r
MS‑DOS
マ クロアセ ンブラを利用 して( 3 ) mo va h ,3e h
;ファイル( a:¥my s a v e . S
SS)のクローズi n t 2 1 h
mO Va
X,my C O m」) S p d e ca x
mo vd s ,a x
;以下,r e a d me m
と同様にmc b
をmo vd i ,O f f s e tmc b ̲ n e w
;次々と読み込みmo va x ,d s
∑ o r Sl ,S l
mo vb x ,[ s i + 1]
c mpb x ,e s :p s p Jl e W j e l o o p 2
S t o s w a d dd i ,2 mo vc x ,5
r e pmo v s b a d dd i ,7
又 o rb x ,b x mo va l ,[ b x ] c mpa l ,4 d h j e
f4d c mpa l ,5 a h j e
f5a p u s h e s p o pd s J mpe r r o r 1 o o pl :
l o o p 2:
Z35
商 学 討 究 第
4 0
巻 第4
号mo vb x ,3 mb va x ,[ b x ] I n °a X
mo vd x ,a x mo va x ,d s a d da x ,d x mo vd s ,a x j mpl o o p1 ‑
mo va x ,d i
s u ba x ,O f f s e tP 怠 P ̲ n e w
mo ve s :d i s p 二 n e
W,a X
;ここまでmO Va X ,e S mo vd s ,a x
mo va x ,3d O Oh
;読み込みのためにファイル( a:¥my s a v e . 令 81
)杏mov
d x, o
ffs e t
op e
n l̲file ; オープン i
nt2 1 h
j
ncf O O
J m
pe r
ro rmo vb x ,a x
;ファイル( a :¥my s a v e . S 令1
)をすべて読み込むmo va h ,3f h
;このファイルの内容は復帰すべきmo vc x ,8 1 0h ;mc b
の状態,割り込みベクトル である。mo vd x ,O f f s e tp s p 〜 o l d i n t2 1h
j n c 川1
f 5 a:
川0 :
MS‑DOS
マクロアセ ンブラを利用 して( 3 )
∫ mpe r r o r
叩O Va h ,3e h :ファイル ( a : ¥my s a v e . ‡ S
l)をクローズi n t 2 1 h
mo va l , Of f h
;ハードウェア割り込みを禁止するo u t
2,a l
mo va l ,Of f h o u tOa h ,a l
c a l lr e v v e c t o r
;割り込みベクトルを元に戻すmo vb x ,O f f s e tp s p ̲ n e w mo vd x ,b x
a d dd x ,[ b x+
2]mo vb x ,O f f s e tp s p 二 o l d a d db x ,[ b x 十2 ]
m
o
v si,of
fs et mc
bol d
m
o v
di,Of
fsetm c
b̲ne w
c mps i ,b x j a e
fO 5 0
c a l l c mp l i n e j c f 0 4 7
p u s h b x
日比‑
f
0 4 0 :
1 37
1 38
f 0 4 7 :
f 0 5 0 :
f O 6 0 :
m ov b x ,d i c a l l c h e c k me m p o p b x
a d ds i ,l ob a d dd i ,l ob j mpf O 4 0
c mpd i ,d x j a ef O 6 0 p u s hb x mo vb x ,d i c a l lc h e c k me m p o pb x
a d dd i ,l ob j mpf O 5 0
mo va l ,p i c ̲ ma s k 」 o u t2,a l ;
m̲ o va l ,p i e ̲ ma s k ̲ 2 o u tOa h ,a l
mo va x ,4cO Oh;
i n t2 1h ENDs t a r t
* * *
商 学 討 究 第
4 0
巻 第4 号
;割り込みコントローラのマスクの 内容を元に戻す。
終了 (リターンコード