2016-04-29 4 views
2

IA-32インテル命令セットリファレンスSTOS/STOSB/STOSW/STOSDでは、命令stos m32stosdの違いは何ですか?その説明は同じですか?
m32の機能は何ですか?命令を使用するときは、eaxesediを設定する必要があります。m32オペランドは有効ですか?アセンブリ: `stos m32`と` stosd`ニーモニックの違いは何ですか?

+0

STOSをメモリオペランドで使用すると、**サイズ** STOSB、STOSW、STOSDとしてエンコードするかどうかを決定するためのメモリオペランド(バイト、ワード、ワード) –

+0

次に、 'm32'オペランドが使用されているかどうかにかかわらず、それは単にオペランドのメモリサイズを決定するために使用されているので、サイズが正しい限り、ランダムにm32オペランドを選択できます。 @MichaelPetch – zhenguoli

+0

これはサイズ専用です。それが指していることは無視されます。私が知っているほとんどの開発者は、STOSB、STOSW、STOSDを使用します。 _MASM_を使用する場合は例外です。その環境で、変数を宣言すると、MASMは変数の型を追跡します。結果は同じですが、サイズだけが使用されます。 –

答えて

2

形式STOS m32形式とSTOSD形式は、同じ命令を表現する2つの異なる方法です。新しいSIMD(SSE、AVX、etc ...)命令の外では、ほとんどの命令ニーモニックには、実行する操作のサイズを示す接尾辞がありません。たとえば、INCDまたはMOVW命令はありません。代わりに、オペランドのサイズによって操作のサイズが決まります。 STOS m32フォームを使用すると、この命令にこの命令を一致させることができます。 DDに

array DW 30 DUP (?) 

    mov ecx, LENGTH array 
    mov edi, OFFSET array 
    mov eax, 1 
    rep stos array 

変更DWとコードが1秒とのDWORDのアレイを充填する:STOS命令のサイズは、シンボルのタイプ(サイズ)に依存する

はMASMでは、これは次のようなコードを可能にします代わりにWORDの配列。メモリオペランドのサイズのみが使用されることに注意してください。命令はEDIによって与えられたアドレスにまだ書き込む。

STOSには適用されませんが、その他の文字列命令のメモリオペランド形式では、デフォルトのDSセグメントを上書きできます。 (STOS命令は、上書きできないESセグメントを使用します)。例えば、次のようにすることができます。

rep outs dx, WORD PTR fs:[esi] 
+2

既定のセグメントを上書きできるだけでなく、サイズをプレフィックス '67'で指定して、 'stos dword [es:di]'を32ビットモードで実行します。 – Ruslan

関連する問題