セクション/セグメントディレクティブはどのくらい重要ですか?それらは通常オプションであることに気づきました。また、含める場合と含めない場合で、出力サイズが変わることに気づきました。
それが助けになるなら、私はNASMを使用しています。
セクション/セグメントディレクティブはどのくらい重要ですか?それらは通常オプションであることに気づきました。また、含める場合と含めない場合で、出力サイズが変わることに気づきました。
それが助けになるなら、私はNASMを使用しています。
文字列をコードセグメントに保存すると、プログラムの実行速度が大幅に低下し、文字列が命令キャッシュのデータを爆破する可能性があるため、これらは非常に重要です。
Library(.libなど)を作成する場合は、上記の理由により、実行可能命令のすぐ後ろにデータ(文字列)を配置したくないため、これも重要です。
セクションは、NASMのマルチセクションビン出力形式を使用する重要なメモリレイアウトにとって重要です:https ://www.nasm.us/xdoc/2.14.02/html/nasmdoc7.html#section-7.1.3
たとえば、これらは私のプログラムの1つで設定しているセクションです:https ://hg.ulukai.org/ecm/ldebug/file/126b4d793c94/source/debug.asm#l109
cpu 8086
org 100h
addsection lDEBUG_DATA_ENTRY, align=16 start=100h
data_entry_start:
addsection ASMTABLE1, align=16 follows=lDEBUG_DATA_ENTRY
addsection ASMTABLE2, align=16 follows=ASMTABLE1
addsection lDEBUG_CODE, align=16 follows=ASMTABLE2 vstart=0
code_start:
addsection DATASTACK, align=16 follows=ASMTABLE2 nobits
addsection INIT, align=16 follows=lDEBUG_CODE vstart=0
DATA_ENTRYおよび両方のASMTABLEセクションはすべて同じセグメントによってアドレス指定され、プロセスにロードされた場所から再配置されません。DATASTACKも前のセグメントでアドレス指定されていますが、nobitsセクションです。CODEはそれ自体のセグメントによってアドレス指定されるため、vstart=0です。また、初期化中にDATASTACKの後ろのどこかに再配置されます(正確な位置は状況によって異なります)。INITは、独自のセグメントによってもアドレス指定されます。最初に自分自身を再配置し、初期化の最後にプロセスのメモリから破棄されます。