MASM のアセンブリを読んでいますが、セグメント ディレクティブの目的を理解できません。アセンブル時のアドレス計算でラベルとどう違うの?フォーム ディレクティブをただ と仮定すると、name segment at addr
その他のオプションはあまり気にしません。とは
BootSeg segment at 0x7c0
BootSeg end
何も入っていない場合に適していますか?
次のことを行った場合、斧にどのような価値がありますか。
mov ax, BootSeg
?
segment
ディレクティブは一種の多目的です。
最初の使用法は、物事をセグメントに結合することです。
2つ目の用途は、さまざまなセグメント内のオブジェクトを適切に参照 (= アドレスを計算) することです。コードでアクセスされるオブジェクトのセグメントに応じて、アセンブラーは適切なsegment override prefixes
( es:
、ss:
、cs:
、) を生成されたコードにfs:
挿入できます。同様に、別のコード セグメントから をgs:
呼び出す場合、アセンブラは の代わりに命令を生成できます。AFAIR、そのためには、実際にそれ自体をマークする必要があります(そして、それはルーチンでもすべてプレーンに変わります)。procedure
far call
near call
procedure
far
rets
far rets
その後、セグメントはリンカーによって処理され、OS によって消費される再配置情報に変換されます。
なぜこれらのセグメントがあるのですか? CPUにはそれらがあり、それらの存在を常に無視できるとは限らないためです. コード、データ、およびスタックを単一のセグメントに収める DOS .COM プログラムがあります。この場合、プログラムはセグメントの概念によって複雑になる必要はありません (「外部」コードにアクセスする必要がある場合を除く)。独自のセグメントからではなく)。
はい、AT
基本的に、あるオブジェクトを別のオブジェクトの上に重ねます。したがって、他のセグメントと同じmov ax, BootSeg
ように you ax
= 0x7c0 を取得する必要がありますが、ここではセグメントが「コンパイル」時に認識されます。
デバッガーを使用して、実験してください。