#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 夢中ゆわ