2017-07-16 8 views
4

MASMはSEGMENTディレクティブを提供します。このディレクティブにはいくつかのパラメータがあります。 useパラメータの値はFLATです。この値が何であるかは私には不明です。FLATオペランドのSEGMENT指令への影響?

Microsoft docsが受け入れ値として指定しますが、それを説明する試みをしない:

use
USE16, USE32, FLAT

ブックThe Art of Assembly Language Programmingオンラインがそれを言及したがスコープの外に呼び出し、MASMプログラマーズ・ガイドを読んでお勧めします。

マイクロソフトからMASM 6.1プログラマーズ・ガイドで

The use32 and flat operands tell MASM to generate code for a 32 bit segment. Since this text does not deal with protected mode programming we will not consider these options. See the MASM Programmer's Guide for more details.

は、SEGMENTディレクティブを記述するセクションで、FLAT値が言及されているが、その効果について説明されることはありません。

The size attribute can be USE16, USE32, or FLAT.

セグメントディレクティブにFLATオペランドの影響は何ですか?

+0

16ビットセグメント化について知っていますか?すべての主要な32ビットおよび64ビットOSは、異なるセグメントレジスタに対して異なるベースを持つのではなく、フラットメモリモデルを使用します。そのキーワードがMASMで意味するものを正確にIDKしますが、最初にセグメンテーションについてわからない場合はマニュアルに問題がありますか? –

+0

ありがとう@PeterCordes。私は、セグメント化されフラットなメモリモデルに精通しています。 MASMにはフラットモデルを有効にするための '.MODEL FLAT'指示文があります。個々の 'SEGMENT'ディレクティブに' FLAT'を使うときは分かりません。 – Lycan

+1

IDKのどちらかですが、私は幸いにもセグメント化されたメモリモデルのコードを書く必要はありませんでした(おもちゃのSOの回答を除いて)、あるいはMASMを使用することさえあります:P今、私はこの質問についても興味があります。 MASMは物事を推測する "魔法"をたくさん持っているので、それはおそらく変です。 –

答えて

4

セグメント・ディレクティブで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 

をアセンブラはzerovarにアクセスするために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を使用してzerovarにアクセスすると、セグメントの上書きは不要なので、CSの代わりにDSを使用するため、命令が短くなります。最後に

最後の2つの命令、ASSUME DS:_DATAASSUME 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であるとみなされるので、セグメントディレクティブでまったく同じ効果があります。

関連する問題