#99 Article 803 Posted at 1993/12/05 00:45:45 by 夢中ゆわ (MAP2717) [ASM]

Subject: Re:*6 メモリのいつでもあいてる場所。 /802 ... /798 /797

えーっと、まず、以下の文章はいつの間にか覚えた知識を元にしているので
文献参照とかの確実な保証での話ではありません(^^;)

>    何がいけないんでしょう?

「メモリが足りません」っちゅーエラーですね。

>そのメモリに十分なあきがないというエラーは、私も経験した。

メモリ関係のプログラムを組むと誰でも経験する通過門のようなものですね(^^;)
以下はあるEXEファイルのダンプですが…

00000000  4D 5A 69 01 02 00 00 00-20 00 21 00 FF FF 17 00   MZi..... .!..... 
                                        ~~~~~ ~~~~
左は最低実行容量、右は最大実行容量です

つまり、このプログラムを実行する前にフリーエリアが 0210H 無いとエラーになり
有れば最大 FFFF0H(1Mだね(^^;))確保します。つまりこのプログラムが残りの
フリーエリア全てをぶんどっちゃってるんですね。
ちなみにこういうヘッダの無いCOMファイルの場合でも、残りのフリーエリア全てを
ぶんどっちゃいます。たった数バイトの実行ファイルでもです。

通常のプログラムでは別に気にする事無いのですが、ぎりぎりに調整する場合には
ファンクションコールを使用して、
	MOV	ES,segment_add		;変更するセグメントアドレス
	MOV	BX,memsize		;変更後のサイズ
	MOV	AH,4AH
	INT	21H			;ファンクションコー(後略)
	JC	@@ERR

にします。
segment_addは、メモリブロックのセグメント値(通常PSPの先頭セグメント値)
memsizeは、リサイズする大きさ(パラグラフ値)です。

てんこさんの、プログラムを変更すると
>start:
>=	MOV	AX,CS
>=	SUB	AX,10H
>=	MOV	ES,AX			;変更するセグメントアドレス
>=	MOV	BX,1000H		;変更後のサイズ(Ex:64K)
>=	MOV	AH,4AH
>=	INT	21H			;ファンクションコー(後略)
>=	JC	ER
>      mov bx,192*1024/16

これで、ドイツ人ジャーマンもびっくり!!ちゃんと S が表示され…るはずです(^^;)
↑の例では64Kに調整してます。(きっぱり言い切っていいのだろうか…(^^;))

あと、単に自己の分だけのメモリを確保するだけなら、擬似命令かオプションで
出来たと思うんですが、よく知りません(/^^;)

裏技では、上記EXEファイルの右側の値を強制的に左側の値と同じにしても
巧くいくはずですが(^^;)保証は…

>おかげで、実行ファイルのサイズが190Kバイト。
TASMではDUP(?)で確保すれば、実際にはでませんから、ちっこくなりますよ。

#MAP2717 夢中ゆわ