18

使用する場合はアセンブリ言語で

mov eax, dword ptr[ebx]

次に、ebxが指す値をコピーすることを意味します(ebxには実際の値ではなくアドレス値が含まれ、この命令はアドレスの実際の値をコピーします)?

使用する場合

mov eax, dword ptr[some_variable]

次に、変数「some_variable」自体の値をeaxにコピーすることを意味し、変数「some_variable」が指す値をコピーするのではありませんか?

私の理解は正しいですか?

はいの場合、同じアセンブリ命令に2つの異なる意味がある理由がわかりません。最初のケースでは間接参照のレベルがありますが、2番目のケースでは追加の間接参照レベルはありません。

任意のコメント?

編集:

すべての[]が効果を発揮するわけではありません。たとえば、命令xchgは、edxが指す値をロードするin-directionのレベルを取ります。

ソースコード全体は、から見つけることができます、

http://www.codeproject.com/KB/threads/spinlocks.aspx

#ifdef WIN32
inline int CPP_SpinLock::TestAndSet(int* targetAddress, int nValue)
{
    __asm {
        mov edx, dword ptr [pTargetAddress]
        mov eax, nValue
        lock xchg eax, dword ptr [edx]
    }
}
#endif // WIN32
4

2 に答える 2

12

どちらの場合も、指定したアドレスから値を移動するようプロセッサに要求します。これは、1 つのレベルの間接化です。最初のケースでは、指定されたレジスタからアドレスを取得するように要求します。2 番目のケースでは、オフセットを直接指定します。

x86 プロセッサはデュアル レベル インダイレクションをサポートしていないため、メモリ内のどこかに指定されたアドレスから値をロードするように要求することはできません。アドレスをレジスタにロードする必要があります。

多くのアセンブラ (たとえば、MASM や VC++ アセンブラに組み込まれているもの) では、次のように書くこともできます。

mov eax, dword ptr some_variable

括弧なしでも同じ意味です。

あなたは書くことができます

mov eax, dword ptr [variable][ebx]

これは、「変数」のアドレスを取得し、次に ebx の値を追加し、値をロードするアドレスとして合計を使用するように指示します。これは、インデックスによって配列要素にアクセスするためによく使用されます。mov eax, dword ptr variable[ebx](一般的に使用され、一般的であるなど、構文のバリエーションがサポートされていますmov eax, dword ptr [variable + ebx]。)

これらすべての場合において、プロセッサは同じことを行います - 指定されたアドレスから値をロードします。毎回 1 レベルの間接化です。

于 2009-03-27T07:27:55.133 に答える