• 検索結果がありません。

MSIDOS アクロアセンブラを利用して (冒)

N/A
N/A
Protected

Academic year: 2021

シェア "MSIDOS アクロアセンブラを利用して (冒)"

Copied!
31
0
0

読み込み中.... (全文を見る)

全文

(1)

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 〕

(2)

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)

を利用す る 具体的 に

(3)

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

655360

K

バ イ トで使用可能 メモ リを調べ ると:全 メモ リ

445584バ イ̲ :使用可能 メモ. この時点では、一太郎を起動できるo

メ‑ル夕‑ムを起動、終了後655360バ イ ト :全 メモ リ

CHKDSK

で使用可能 メモ リを調べ ると

(4)

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

が どの資源 を利用 してい るかが分

(5)

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

、一太郎 を一皮 に利用で きないのであ る.

(6)

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 に書き込む

(7)

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

とす る

(8)

116

商 学

4 0

4 号

図.

4

ファイル A:

¥MYSAVE. ‡粥

A: ¥MYSAVE. S‡1

A: ¥MYSAV

E.SSSの内容

0 2 4 6 8

A C D

E

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: ¥

(イ).. (ウ) (エ) ・オ,I

I(*)

0 0 0 0

■(辛) ク, I (ケ, )

MCB

情報 が続 く (何バ イ トになるか ば事前 には不明)

(イ):

READMEM. EXE

PSP

のセ グメン ト値

( REVMEM. EXE

で は利 れない)

(エ): 割 り込 み コン トp‑ ラ (マスタ) のマ̲スクの値 (オ): 割 り込 み コン トロ‑ ラ (ス レーブ)のアス クの値

(辛)、(ク)、(ケ)は (図.

3)

MCB

の最初 の 串バ イ ト、す なわ ち (辛):̲マーク

(ク): オーナー

Ⅰ D

(ケ): ブロックサイズ

(カ): (辛)、(ク)、(ケ)

MCB

のセ グメ ン ト値

このメモ リブロックを解散す るために必要

(9)

MS ‑ DOS

マクロアセンブラを利用 して

( 3) 117 REVMEM.EXE : A: ¥MYSAV

E.発給と

A: ¥MYSAV

E.

防1

を読 み込 み自

分が実行 されているときの

MCB

の状態 を調べ,

A: ¥MYSAV

E.S

H 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. おわ りに

ここで作成 した,常駐 プログラムを強制的 に解放す るプ ログラムは割 り込 み ベ ク トル と割 り込 みコン トローラのマスクの内容だけを復元 しているので, そ のほかの システムの資源を利用 しそれを復元 しなければ不都合が生 じるよ うな

(10)

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

は私 が作成 した簡単 なプ ログ

(11)

MS‑DOS

マクロアセ ンブラを利用 して

( 3 ) 119

常駐 プ ログラムには利用 で きない。

5

.付録 (ソースプ ログラム)

,‑ *‑ *‑ *‑ *‑ *‑ *‑ *‑ *‑ *‑ *‑

;ソースファイルMYCOM.ASM

TITLE

my c o m

TEXTSEGMENT

ASSUME

c s :

̲TEXT

,d s :

̲TEXT

,s s :

̲TEXT ORG

1 0 0

h

s 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 I

d 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 I

d b

'INTERPRETER 用にメモリが開放できません。I

me 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

','メモリの情報を取得出来ませんでした。I

d b Od h , Oa h ,1b h ,' [ m'

(12)

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

(13)

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

c

l

d

l 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

(14)

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

,80

h 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

c

l ,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

,4

b

O

Oh

;コマンドインタプリタを起動

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

(15)

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

O

Ll 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

汀Orlen

mo v d x ,O f f s e t

meerror

i 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

(16)

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

(17)

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を読めません。I

d 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

(18)

126

商 学

4 0

4

p s p d w O O O

Oh ;自分のPSPのセグメント値,以下をA:¥MYSAV

E .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

,@DATA

mo 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 :

(19)

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

(20)

1 28

l o o p2:

f 4d

:

f 5a:

第 40巻 第 4号

mo va x ,e s

:total

a d da x ,l o

b

mo ve s :t o

tal,a

x

丈 o rb x ,b x mo ' va l ,l b x

]

c mpa l ,4d

h

j e f 4d c mpa l ,5a

h

j 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

tpsp

mo ve s :d i s

p,

a x

ーX O ra X , a X

;次に,割り込みベクトルを保存する。

(21)

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

(22)

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?を読めません。I

d 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

(23)

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

(24)

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

f

0 4 5

(25)

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

(26)

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

(27)

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

f

4d c mpa l ,5 a h j e

f

5a 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

(28)

商 学

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

ff

s e t

o

p e

n l̲file ; オープ

ン i

nt

2 1 h

j

nc

f O O

J m

p

e r

ro r

mo 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 :

(29)

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,o

f

fs e

t mc

b

ol d

m

o v

di,O

f

fse

tm c

b̲

ne w

c mps i ,b x j a e

f

O 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

(30)

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 号

;割り込みコントローラのマスクの 内容を元に戻す。

終了 (リターンコード

0 0h )

(31)

MS‑DOS

マ クロアセ ンブラを利用 して(3)

1 39

参考文献

[1] 星野操著 「 MS‑DOS レジデ ン トプ ログ ラム入 門」 技術評論社 1 9 8 9 . [2] 「 標準 MS‑DOS ‑ ン ドブ ック」 アスキー出版局 1 9 8 5 .

その他, マニ土アル.

参照

関連したドキュメント

議論を深めるための参 考値を踏まえて、参考 値を実現するための各 電源の課題が克服さ れた場合のシナリオ

本手順書は複数拠点をアグレッシブモードの IPsec-VPN を用いて FortiGate を VPN

Q-Flash Plus では、システムの電源が切れているとき(S5シャットダウン状態)に BIOS を更新する ことができます。最新の BIOS を USB

直流電圧に重畳した交流電圧では、交流電圧のみの実効値を測定する ACV-Ach ファンクショ

Google マップ上で誰もがその情報を閲覧することが可能となる。Google マイマップは、Google マップの情報を基に作成されるため、Google

「海洋の管理」を主たる目的として、海洋に関する人間の活動を律する原則へ転換したと

環境への影響を最小にし、持続可能な発展に貢

・カメラには、日付 / 時刻などの設定を保持するためのリチ ウム充電池が内蔵されています。カメラにバッテリーを入