セグメント・ディレクティブでFLATキーワードを使用すると、ほとんどの場合、USE32と同じ意味になります。 USE32とFLATの両方のキーワードは、セグメントが64Kより大きい可能性があり、セグメントに組み立てられた命令は16ビットのエンコードではなく32ビットのエンコードを使用する必要があることを示しています。違いは、CSレジスタについてアセンブラが想定しているものです。通常、SEGMENTディレクティブは暗黙のASSUME CS:xxx
ディレクティブになります。xxx
はセグメントの名前ですが、FLATの場合は暗黙的にASSUME CS:FLAT
になります。
ASSUMEディレクティブは、どのセグメントがどのセグメントレジスタにロードされるかをアセンブラに知らせるので、必要に応じて自動的に正しいセグメントのオーバーライドを使用できます。ほとんどの32ビットオペレーティングシステムで使用されるフラットメモリモデルでは、単一の4ギガバイトセグメントが1つしかありません。アセンブラにセグメントレジスタを引き継ぐことを伝えることは、プログラムで定義されたすべてのセグメントがそのセグメントレジスタを介してアクセスできることをアセンブラに知らせます。例えば、ASSUME DS:FLAT
は、すべてのセグメントがDSレジスタを介してアクセス可能であることを示します。一方、ASSUME DS:_DATA
は、DSレジスタは_DATAセグメントにのみアクセスでき、他のセグメントにはアクセスできないことを示しています。
あなたは、次のコード組み立てることによって、この動作を確認することができます。これらの2つの命令については
00000000: 2E A1 00 00 00 00 mov eax,dword ptr cs:[zero]
00000006: 2E A3 00 00 00 00 mov dword ptr cs:[var],eax
:あなたが最初の2つの命令のためにこれを見たオブジェクトファイルを逆アセンブルした場合
_DATA SEGMENT PUBLIC USE32
var DD ?
_DATA ENDS
_TEXT SEGMENT PUBLIC PARA 'CODE' FLAT
mov eax, [zero]
mov [var],eax
ASSUME DS:FLAT
mov eax, [zero]
mov [var],eax
ASSUME CS:_TEXT
ASSUME DS:_DATA
mov eax, [zero]
mov [var],eax
zero DD 0
_TEXT ENDS
END
をアセンブラはzero
とvar
にアクセスするためにCSセグメントのオーバーライド(2E
)を使用する必要があります。これは、アセンブラが_TEXT
と_DATA
を含むすべてのセグメントにアクセスするためにCSを使用できることを知っているため、他のセグメントレジスタを使用してこれらのsemgentにアクセスできることを知らないためです。
0000000C: A1 00 00 00 00 mov eax,dword ptr [zero]
00000011: A3 00 00 00 00 mov dword ptr [var],eax
今アセンブラはCSとDSの両方がすべてのセグメントにアクセスするために使用できることを知っている:ASSUME DS:_FLAT
ディレクティブの後にここで
は、それは次の2つの命令のために生成されるコードです。DSを使用してzero
とvar
にアクセスすると、セグメントの上書きは不要なので、CSの代わりにDSを使用するため、命令が短くなります。最後に
最後の2つの命令、ASSUME DS:_DATA
とASSUME CS:_TEXT
ディレクティブの後、FLATキーワードがすべてで使用されていない場合は、コードアセンブラが生成されますを示しています。
00000016: 2E A1 00 00 00 00 mov eax,dword ptr cs:[zero]
0000001C: A3 00 00 00 00 mov dword ptr [var],eax
この場合、アセンブラは、CSができることを前提としていのみ_TEXTにアクセスするために使用し、DSは_DATAにアクセスするためにのみ使用します。 zero
にアクセスするにはCSオーバーライドを使用する必要がありますが、セグメントオーバーライドを必要としないでDSからvar
にしかアクセスできません。
(注)上記のサンプルコード内のセグメントディレクティブでUSE32にFLATを変更した場合、最初の命令はCSのオーバーライドを使用して終わるが、2番目の命令は次のエラーを生成します。
error A2074:cannot access label through segment registers
しばらくためだことアセンブラはCSレジスタを介して_TEXTにアクセスできることを知っていますが、_DATAにアクセスするために使用できるセグメントレジスタは認識していません。
コードの先頭に.MODEL FLAT
というディレクティブを使用する場合は、これを心配する必要はありません。そして、USE32とFLATは、すべてのセグメントレジスタがFLATであるとみなされるので、セグメントディレクティブでまったく同じ効果があります。
16ビットセグメント化について知っていますか?すべての主要な32ビットおよび64ビットOSは、異なるセグメントレジスタに対して異なるベースを持つのではなく、フラットメモリモデルを使用します。そのキーワードがMASMで意味するものを正確にIDKしますが、最初にセグメンテーションについてわからない場合はマニュアルに問題がありますか? –
ありがとう@PeterCordes。私は、セグメント化されフラットなメモリモデルに精通しています。 MASMにはフラットモデルを有効にするための '.MODEL FLAT'指示文があります。個々の 'SEGMENT'ディレクティブに' FLAT'を使うときは分かりません。 – Lycan
IDKのどちらかですが、私は幸いにもセグメント化されたメモリモデルのコードを書く必要はありませんでした(おもちゃのSOの回答を除いて)、あるいはMASMを使用することさえあります:P今、私はこの質問についても興味があります。 MASMは物事を推測する "魔法"をたくさん持っているので、それはおそらく変です。 –