2012-03-07 21 views
0

LinuxからWin32にコードを移植するいくつかのクロスプラットフォーム作業を行っていますが、一部のアセンブリコードについては動作させることができません。 このコードはLinux gccで通常コンパイルされますが、VS2008 --win32では動作しません。C++とVisual Studio 2008でasmコードを使用する方法

私のコードのいくつかは以下の通りです。私は--win32プラットフォームVS2008を使ってコンパイルしたい場合は行うには、私が何が必要です:

static inline void spin_wait(int n) 
{ 
    int tmp = n; 
    while(tmp > 0) { tmp--; asm("" ::: "memory", "cc"); } 
} 

__asm__ __volatile__(
    "xorq  %%rdx, %%rdx \n" 
    "xorq  %%rax, %%rax \n" 
    "incq  %%rdx  \n" 
    "lock cmpxchgq %%rdx, (%1) \n" 
    "decq  %%rax  \n" 
: "=a" (not_set) : "r" (n) : "%rdx"); 
+0

代わりに '__asm'を使用してください。 –

+2

Brr、回転のポイントはCPUサイクルを焼くことです。インラインアセンブリーの作成のポイントは、CPUサイクルを燃やさないことです。 InterlockedCompareExchange()を使用します。 –

答えて

2

あなたの質問は、インラインアセンブリの使用についてであれば、あなたはまだあなたが(MSDN link)のVisual Studioでそれを使用することができますもちろん、プラットフォームのためにそれを微調整する必要があるかもしれません。例えば

__asm { 
    mov al, 2 
    mov dx, 0xD007 
    out dx, al 
} 
+0

しかし、私はporjectをデバッグするとき、それはいくつかのエラーが来る、 – Junling

+2

@so_and_well:だから先に進み、エラーを修正しますか?また、この例は元のコードの翻訳ではないことをご存知でしょうか? –

+0

あなたはこれらのコードをこのモデルに変更する必要がありますか? – Junling

1

「spin_wait」のようなものは、ポータブルではなく、(再)ターゲットプラットフォームに適した何に記述する必要があります。恐ろしいGASの構文を扱って以来、しばらくしてきましたが、xorqはコードスニペットがx86-64用であることを意味します。 Microsoftコンパイラは、64ビットターゲットのインラインアセンブリをサポートしていません。

_AcquireSpinLockはおそらくトリックですか?アセンブリの大きなブロック(一般はアセンブリで書くことに意味を作る部分)については

、私は(SANE構文との良好な機能セットでクロスプラットフォームのアセンブラと外部アセンブリモジュールを使用することをアドバイスしたいです例えば、ヤスミン、攣縮または鼻炎)。もちろん、それはスピンロックのように重要で必須のものとして実行可能ではありません:)

+0

しかし、私もそれらのasmコードのmeanningは理解できません、私はちょうど何もすることはできませんので、 "ロックcmpxchgq %% rdx、(%1)"のようなコードを説明するのに役立ちますか? ?ありがとう。 – Junling

関連する問題