2017-03-13 46 views
1

ここではhttps://github.com/Ericson2314/VoxlapからLinux上でVoxlapをビルドしようとしています。インラインasmをコンパイルしようとしたときにエラーが発生しました: "無効な 'asm':オペランドは条件コードではなく、無効なオペランドコード 'c'"

source/sdlmain.cpp: In function ‘void fpuinit(long int)’: 
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 
); 
^ 

source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 

問題のコードはここにある:

static long fpuasm[2]; 
static inline void fpuinit (long a) 
{ 
    __asm__ __volatile__ 
    (
     "fninit\n" 
     "fstcww %c[fp]\n" 
     "andb $240, %c[fp]+1(,1)\n" 
     "orb %%al, %c[fp]+1(,1)\n" 
     "fldcww %c[fp]\n" 
     : 
     : "a" (a), [fp] "p" (fpuasm) 
     : "cc" 
    ); 
} 

コンパイラエラーがこの部分

: "cc" 
01を指しているので、私は、インラインアセンブリに関するエラーメッセージが表示されます

いただければ幸いエラーメッセージまたは実際の問題を解読すべてのヘルプ、感謝

+0

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

+0

私は、私が尋ねたものに問題があったのですか? –

+0

必要に応じて[MCVE]を提供してください。 –

答えて

2

マイケル・ペッチは、問題の直接の原因は、おそらく説明しているようので、Ubuntuの今の位置独立した実行可能ファイルを作成し、GCCのバージョンに付属( PIE)を使用します。 asm文は、コンパイラが位置独立コード(position independent code:PIC)を生成しているときには機能しません。それは同等であるべきなあなたはおそらく、次のようにコードを置き換えることができます。

static inline void fpuinit (long a) 
{ 
    asm volatile (
     "mov %1, %0\n\t" 
     "fninit\n\t" 
     "fldcw %0\n" 
     :: "m" (*(short *)fpuasm), 
     "ir" ((short) (0x037F & 0xF0FF | (a & 0xFF) << 8))); 
} 

これは厄介な"p"「ポインタ」の制約と、それはそれはシンプルに動作させるために必要c「定数」オペランド修飾子を置き換えます"m"「メモリ」制約。これは、それがPICとしてコンパイルされているかどうかにかかわらず効果的です。また、32ビットと64ビットの両方のターゲットでも動作します。

また、FNINIT命令がFPU制御ワードを既知の状態(0x037F)に設定しているため、FSTCW命令を使用してその命令を読む必要がないという利点を利用してコードを最適化しました。

関連する問題