1

私は最初の TSR を書いています。INT 21H の関数 31H を使用する必要があることはわかっています。調べてみると、DXの値は「段落のメモリサイズ」であることがわかりました。それを計算する方法がわからず、GOOGLE は役に立ちませんでした。コードの段落でメモリ サイズを計算する方法を知りたいです。

私はちょうどこれを見つけました

mov dx, OFFSET Install ; DX = bytes in resident section
mov cl, 4
shr dx, cl ; Convert to number of paragraphs
inc dx ; plus one
mov ax, 3100h ; Request Function 31h, error code=0
int 21h ; Terminate-and-stay-resident

なんでプラスワンなの?そして、段落=オフセット* 16であると仮定する必要があることを知っていますか?

4

2 に答える 2

2

段落は、メモリの 16 バイトのインクリメントです。プログラムの実行時にプログラムのサイズを動的に把握することは、プログラミングに使用される言語、プログラムのモデル、および使用されているセグメント構造に部分的に依存します。一般的に行うことは、リンク マップを配置して、プログラム イメージ全体の最後にほぼ空の (おそらく 1 バイトが割り当てられた) セグメントを配置することです。未使用で割り当てられた単一のバイトには、実行時に参照できるシンボルが与えられます。

16ビット環境でプログラミングする場合、セグメントアドレスは段落境界で増加するため、プログラムの実行時間サイズを把握するプロセスは、プログラムのロード時間PSP(プログラムセグメントプレフィックス)のセグメントを「セグメント」部分から差し引くことです。上記の未使用バイト変数のアドレス。違いは、TSR に移動するときに DOS にロードを維持するように要求する段落の数です。

プログラムのビルド時にリンカーによって生成されるマップ ファイルを注意深く調べると、非常に役立つことに注意してください。少なくとも、画像の最後に設定したマーカー セグメントが実際に画像の最後にあることを確認する必要があります。

また、一部のプログラミング環境では、プログラミング テンプレート内にこの目的のためのマーカー セグメントがすでに設定されている場合があることにも注意してください。

于 2014-03-14T16:03:53.247 に答える