1

MASM のアセンブリを読んでいますが、セグメント ディレクティブの目的を理解できません。アセンブル時のアドレス計算でラベルとどう違うの?フォーム ディレクティブをただ と仮定すると、name segment at addrその他のオプションはあまり気にしません。とは

BootSeg segment at 0x7c0
BootSeg end

何も入っていない場合に適していますか?

次のことを行った場合、斧にどのような価値がありますか。

mov ax, BootSeg

?

4

1 に答える 1

5

segmentディレクティブは一種の多目的です。

最初の使用法は、物事をセグメントに結合することです。

2つ目の用途は、さまざまなセグメント内のオブジェクトを適切に参照 (= アドレスを計算) することです。コードでアクセスされるオブジェクトのセグメントに応じて、アセンブラーは適切なsegment override prefixes( es:ss:cs:、) を生成されたコードにfs:挿入できます。同様に、別のコード セグメントから をgs:呼び出す場合、アセンブラは の代わりに命令を生成できます。AFAIR、そのためには、実際にそれ自体をマークする必要があります(そして、それはルーチンでもすべてプレーンに変わります)。procedurefar callnear callprocedurefarretsfar rets

その後、セグメントはリンカーによって処理され、OS によって消費される再配置情報に変換されます。

なぜこれらのセグメントがあるのですか? CPUにはそれらがあり、それらの存在を常に無視できるとは限らないためです. コード、データ、およびスタックを単一のセグメントに収める DOS .COM プログラムがあります。この場合、プログラムはセグメントの概念によって複雑になる必要はありません (「外部」コードにアクセスする必要がある場合を除く)。独自のセグメントからではなく)。

はい、AT基本的に、あるオブジェクトを別のオブジェクトの上に重ねます。したがって、他のセグメントと同じmov ax, BootSegように you ax= 0x7c0 を取得する必要がありますが、ここではセグメントが「コンパイル」時に認識されます。

デバッガーを使用して、実験してください。

于 2012-09-23T20:36:14.363 に答える